ASP.NET - как включить CSS, только если он еще не включен?

Я использую приведенный ниже код для динамического включения файла CSS:

HtmlHead head = (HtmlHead)Page.Header;
HtmlLink link = new HtmlLink();
link.Attributes.Add("href", Page.ResolveClientUrl("~/App_Themes/Default/StyleSheet.css"));
link.Attributes.Add("type", "text/css");
link.Attributes.Add("rel", "stylesheet");
head.Controls.Add(link);

Проблема в том, что я хочу сделать это только один раз и только в том случае, если это еще не включено на страницу.

Как мне проверить, что он уже включен?

Изменить:

Ответы, в которых говорится, что я должен включить загрузку страницы с помощью !IsPostBack, не решат мою проблему, так как этот код будет находиться внутри пользовательского веб-элемента управления, а на моей странице может быть много такого же пользовательского элемента управления.

Например, я использую приведенный ниже код, чтобы сделать это с помощью javascript:

if (!Page.ClientScript.IsClientScriptIncludeRegistered("jsScript"))
{
    Page.ClientScript.RegisterClientScriptInclude("jsScript", ResolveUrl("~/Utilities/myScript.js"));
}

person Tufo    schedule 02.03.2010    source источник
comment
Если ваш CSS достаточно хорошо структурирован, это, вероятно, преждевременная оптимизация. Я не могу представить, чтобы вы использовали столько CSS, что это значительно замедлило бы работу браузера.   -  person Robert Harvey    schedule 02.03.2010
comment
@ Роберт Харви: я знаю, чувак, наверное, это не замедлит работу моего приложения, мне просто не нравится идея размещения мусорного кода на моей странице, сегодня я помещаю CSS всего в 5 КБ, но завтра, когда я поставил с 50КБ, так что это будет проблемой ...   -  person Tufo    schedule 02.03.2010
comment
@Jason: Значит, мне нужно чаще задавать более простые вопросы? если вы посмотрите на мои вопросы, вы поймете, что все они сложные, и никто не ответил на то, что помогло бы решить проблему.   -  person Tufo    schedule 02.03.2010
comment
В вашем примере вы используете каталог App_Themes. Используя темы, ASP.NET автоматически свяжет все таблицы стилей в теме с вашей страницей. Вам просто нужно установить для атрибута Theme или StylesheetTheme директивы @Page значение Default, чтобы это работало. Если вы не хотите такого поведения, вам следует подумать о перемещении ваших таблиц стилей за пределы каталога App_Themes.   -  person Greg    schedule 03.03.2010


Ответы (3)


Сделал это...

код, который я использовал, выглядит следующим образом:

        Boolean cssAlrealyIncluded = false;
        HtmlLink linkAtual;
        foreach (Control ctrl in Page.Header.Controls)
        {
            if (ctrl.GetType() == typeof(HtmlLink))
            {
                linkAtual = (HtmlLink)ctrl;

                if (linkAtual.Attributes["href"].Contains("datePicker.css"))
                {
                    cssAlrealyIncluded = true;
                }
            }
        }

        if (!cssAlrealyIncluded)
        {
            HtmlLink link = new HtmlLink();
            link.Attributes.Add("href", ResolveUrl("~/Utilities/datePickerRsx/datePicker.css"));
            link.Attributes.Add("type", "text/css");
            link.Attributes.Add("rel", "stylesheet");
            Page.Header.Controls.Add(link);
        }
person Tufo    schedule 02.03.2010

Почему бы не добавить в свой пользовательский элемент управления значение HttpContext.Current.Items, указывающее, что таблица стилей уже включена? Это избавит вас от необходимости просматривать каждый элемент управления заголовком для каждого экземпляра пользовательского элемента управления.

person John Bledsoe    schedule 02.03.2010
comment
У меня это сработало лучше всего. См. Также stackoverflow.com/questions/3876601/ - person Colin; 08.07.2011

В большинстве случаев вам не нужно беспокоиться, если CSS будет включен более одного раза. Обычно это не проблема.

РЕДАКТИРОВАТЬ: порядок имеет значение только в том случае, если вам нужно иметь возможность переопределить стили css в последующих таблицах стилей.

В ASP.NET вы можете включить CSS в свою главную страницу (при условии, что он у вас есть), и тогда он будет гарантированно включен только один раз. Поскольку главные страницы доступны программно (даже из пользовательских элементов управления), вы даже можете написать некоторые свойства (или методы), которые позволят вам контролировать, какие внешние элементы CSS и когда включать.

person LBushkin    schedule 02.03.2010
comment
Я бы не согласился на основании большинства случаев, в любом случае, когда вы хотите переопределить некоторое поведение CSS, скажем, любой сайт с темой, порядок имеет значение, и это будет проблема. - person Nick Craver; 02.03.2010
comment
@lBushkin: если я использую главные страницы для своих пользовательских элементов управления, у меня будет только несколько копий главной страницы, поскольку каждый пользовательский элемент управления будет генерировать свой собственный скомпилированный код главной страницы во время выполнения, и я столкнусь с той же проблемой, что и в этом вопрос... - person Tufo; 03.03.2010
comment
@Tufo: вы определяете главную страницу для своих страниц, а не для пользовательских элементов управления. Главные страницы могут наследовать друг от друга, но, в конечном итоге, не может быть нескольких экземпляров главной страницы для одной UC. - person LBushkin; 03.03.2010