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);
        }
    }