Я думаю, что у меня быстрое и грязное решение. Хитрость заключается в проверке элементов управления в заголовке страницы (например, на этапе PreRender
), найдите ссылки, указывающие на CSS-файлы в папке App_Themes
, и сделайте их динамическими (добавив некоторую случайную информацию в строку запроса). Это, скорее всего, скажет браузеру о недействительности кешированной версии файла.
Код:
protected void Page_PreRender(object sender, EventArgs e)
{
HtmlLink link = null;
foreach (Control c in Header.Controls)
{
if (c is HtmlLink)
{
link = c as HtmlLink;
if (link.Href.IndexOf("App_Themes/", StringComparison.InvariantCultureIgnoreCase) >= 0 &&
link.Href.EndsWith(".css", StringComparison.InvariantCultureIgnoreCase))
{
link.Href += string.Format("?t={0}", DateTime.Now.Ticks.ToString());
}
}
}
}
Выход:
<link href="App_Themes/MyTheme/MyTheme.css?t=634310637798128189"
type="text/css" rel="stylesheet" />
Обратите внимание, что вам нужно иметь <head runat="server">
объявлена в разметке вашей страницы для того, чтобы иметь возможность получить доступ к Header
собственности (в противном случае это будет null
).
Привет Гомер, я не знаю, будет ли это работать или нет, как его просто теория. Я предполагаю, что браузеры кэшируют файл css и получают новую версию, если видят, что она изменена. Моей идеей было бы иметь класс в файле css, который не используется и не отличается для каждой темы. Если этот класс находится в верхней части каждого файла css, браузер должен его прочитать, увидеть другое имя класса и загрузить файл css. Это, конечно, все основывается на предположениях и не знает, как интернет-браузер кэширует css. Мне было бы интересно также, если кто-нибудь еще может говорить с этим авторитетом! – WraithNath
Я немного смущен. Когда вы используете другую тему, таблица стилей находится в другой папке, т.е. /App_Themes/blue/stylesheet.css vs /App_Themes/red/stylesheet.css. Это изменение каталога достаточно, чтобы заставить его не кэшироваться. Теперь, конечно, красный/стиль.css все равно будет кэшироваться, но если вы поменяете темы на синий, это будет загружать синий (который может быть кэширован). – Prescott
Я не обмениваю темы, просто изменяя файл css. – Homer