2010-05-26 2 views
10

Когда страница с темой визуализируется, теги ссылок стилей в данной теме отображаются непосредственно перед тегом закрывающей головки. Кто-нибудь знает, как это изменить? Есть ли способ, которым я мог бы разместить эти теги сразу после тега открытия?Рисунок стилей стилей ASP.NET

Я знаю, что это может быть с помощью jquery, просто выбрав все теги ссылок и разместив их сразу после тега с открывающейся головой, но есть ли способ установить его на сервере?

Уточнение Скажем, у меня есть один файл css (themed.css) в моей теме. В этом файле CSS, у меня есть одно определения стиля для сНа тега с идентификатором теста:

#test {background-color:red; color:white;} 

Давайте также сказать, у меня есть второй файл CSS (standard.css), который не в моей теме, но у него есть другое определение сНу тега с идентификатором теста:

#test {background-color:yellow;} 

У меня есть моя страница, чтобы использовать тему, и у меня есть рукописная ссылка тег использовать standard.css. Когда страница выполняется, тег ссылки для standard.css находится перед themed.css. Когда это происходит, мой тег div с идентификатором теста имеет красный фон и белый цвет forecolor. Если я хочу, чтобы themed.css применялся, а затем standard.css, чтобы перезаписать необходимые свойства (желтый фон с белым цветом forecolor), я бы хотел, чтобы themed.css и THEN standard.css. Я не могу этого сделать, потому что ASP.NET помещает файлы темы непосредственно перед тегом закрытия заголовка.

Я не хочу знать, что файлы css моей темы являются тегом n-й ссылки в моем теге заголовка, а затем вручную меняют любой индекс, когда я могу добавить новый файл css за пределами моей темы.

Спасибо!

ответ

6

Я сделал немного проверку в отражатель, и нашли то, что вы можете найти интересные. Рамка вызывает метод SetStyleSheet объекта с добавлением PageTheme для управления элементами управления в заголовке. Этот фрагмент кода показывает соответствующую логику:

int num = 0; 
foreach (string str in this.LinkedStyleSheets) 
{ 
    HtmlLink child = new HtmlLink { Href = str }; 
    child.Attributes["type"] = "text/css"; 
    child.Attributes["rel"] = "stylesheet"; 
    if (this._styleSheetTheme) 
     this.Page.Header.Controls.AddAt(num++, child); 
    else 
     this.Page.Header.Controls.Add(child); 
} 

Перевод? StyleSheetThemes вводят таблицы стилей на начиная тега заголовка и тему впрыснуть листы стиля на конце.

Это соответствует предполагаемой разнице между темами и темами стилей; то есть, что тема всегда выигрывает, когда есть конфликт между кожей и настройками управления. Конечно, стиль в не-тематическом .CSS-файле с использованием атрибута !important может по-прежнему переопределять стиль темы, но расположение CSS-файлов в теге head стратегически облегчает темы стилей переопределения.

Обратите внимание, что вы можете иметь и тему стилей и обычную тему. Естественно, оставьте тему темы стилей, которую вы планируете переопределить, и тему, которую нельзя переопределить.

Окончательное наблюдение заключается в том, что метод internal и не виртуальный, поэтому вмешательство в эти два варианта потребует определенных навыков отражения от кунг-фу-ММА-безумия и, вероятно, не отвечает интересам стабильности или ремонтопригодности ,

5

Как только ваш head элемент имеет runat="server" вы можете изменить коллекцию в Page_PreRender:

protected void Page_PreRender(object sender, EventArgs e) 
    { 
     ControlCollection container = this.Page.Header.Controls; 
     foreach (var control in container.OfType<System.Web.UI.HtmlControls.HtmlLink>().ToArray()) 
     { 
      container.Remove(control); 
      container.AddAt(0, control); 
     } 
    } 
+0

Но это связано с тем, что в вашей голове есть статическое количество тегов ссылок. Мне было любопытно, есть ли способ переопределить поток размещения тегов ссылок на первое место, а не просто переупорядочить их после случая. –

+0

На данный момент происходит событие PreRender(), ссылки на все CSS-файлы, найденные в текущей папке темы, уже находятся в коллекции Header.Controls. Поэтому мой код будет изменять как статические, так и динамические (добавленные ASP.NET) ссылки. – UserControl

Смежные вопросы