ASP.NET.
Когда страница с темой отображается, теги ссылок стилей в данной теме отображаются непосредственно перед тегом закрывающей головки. Кто-нибудь знает, как это изменить? Есть ли способ, которым я мог бы разместить эти теги сразу после тега открытия заголовка?
Я знаю, что это может быть с jquery, просто выбрав все теги ссылок и поместив их сразу после тега открытия заголовка, но есть ли способ установить его на сервере?
Разъяснение
Скажем, у меня есть один файл css (themed.css) в моей теме. В этом файле css у меня есть одно определение стиля для тега div с идентификатором теста:
#test {background-color:red; color:white;}
Давайте также скажем, что у меня есть второй файл css (standard.css), который НЕ находится в моей теме, но имеет другое определение тега div с идентификатором теста:
#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 для темы являются тегами nth link в моем теге заголовка, а затем вручную меняют любой индекс, когда я могу добавить новый файл css вне моей темы.
Спасибо!
Ответы
Ответ 1
Я сделал небольшую проверку в Reflector и нашел что-то интересное. Framework вызывает метод SetStyleSheet
объекта PageTheme
-derived для вставки элементов управления заголовками в заголовке. Этот фрагмент кода показывает соответствующую логику:
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
и не виртуальный, поэтому вмешательство в эти два варианта потребует определенных навыков кунг-фу-ММА-безумного отражения и, вероятно, не отвечает интересам стабильности или ремонтопригодность.
Ответ 2
Как только ваш элемент 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);
}
}