Рендеринг таблиц стилей ASP.NET Theme - PullRequest
10 голосов
/ 27 мая 2010

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

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

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

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

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

#test {background-color:yellow;}

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

Мне не нужно знать, что css-файлы моей темы - это n-й тег ссылки в моем теге headи затем вручную изменяйте любой индекс всякий раз, когда я могу добавить новый файл CSS вне моей темы.

Спасибо!

Ответы [ 2 ]

6 голосов
/ 17 августа 2010

Я немного проверил в 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 внедряют таблицы стилей в начало тега заголовка, а Темы внедряют таблицы стилей в end .

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

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

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

5 голосов
/ 27 мая 2010

Как только ваш 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);
        }
    }
...