Рендеринг таблицы стилей ASP.NET Theme

Когда страница с темой представляется, теги link таблиц стилей в данной теме представляются прямо перед заключительным главным тегом. Кто-либо знает о способе изменить это? Существует ли способ, которым у меня могли быть те теги быть помещенным прямо после вводного главного тега?

Я знаю, что это может болеть jQuery, просто выбрав все теги link и поместив его прямо после вводного главного тега, но является там способом установить его на конце сервера?

Разъяснение Позволило нам сказать, что у меня есть единственный файл CSS (themed.css) в моей теме. В том файле CSS у меня есть определение отдельного стиля для тега Div с идентификатором теста:

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

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

#test {background-color:yellow;}

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

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

Спасибо!

10
задан Dan Appleyard 27 May 2010 в 17:02
поделиться

2 ответа

Я немного проверил Reflector и нашел кое-что, что может вас заинтересовать. Инфраструктура вызывает метод 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 вставляет таблицы стилей в начало тега заголовка, а Themes вводит таблицы стилей в конце .

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

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

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

6
ответ дан 4 December 2019 в 01:00
поделиться

Как только у вашего элемента 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);
        }
    }
5
ответ дан 4 December 2019 в 01:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: