Есть ли способ проверить, есть ли у пользователя другая версия CSS, кэшированная их браузером, и если да, заставить свой браузер вытащить новую версию?





Возможно, вам следует просто поделиться общим классом-предком, а затем вы можете щелкнуть его с помощью одной команды js, если это необходимо.
<body class = "style2">
<body class = "style1">
и Т. Д.
Без использования js вы можете просто сохранить имя файла css в переменной сеанса. Когда делается запрос на главную страницу, вы просто составляете тег ссылки css с именем переменной сеанса.
Поскольку имя файла ccs отличается, вы заставляете браузер загружать его без необходимости проверять, что было ранее загружено в браузере.
Я знаю, что вопрос был конкретно о C#, и я предполагаю, что из этого Windows Server какой-то привкус. Поскольку я плохо знаю ни одну из этих технологий, я дам ответ, который будет работать в PHP и Apache, и вы можете что-то от него получить.
Как предлагалось ранее, просто установите идентификатор или класс в теле страницы в зависимости от конкретного запроса, например (в PHP)
<?php
if ($_GET['admin_page']) {
$body_id = 'admin';
} else {
$body_id = 'normal';
}
?>
...
<body id = "<?php echo $body_id; ?>">
...
</body>
И ваш CSS может нацеливаться на это:
body#admin h1 {
color: red;
}
body#normal h1 {
color: blue;
}
так далее
Что касается принудительной загрузки CSS, вы можете сделать это в Apache с модулями mod_expires или mod_headers - для mod_headers это в .htaccess остановит кеширование файлов css:
<FilesMatch "\.(css)$">
Header set Cache-Control "max-age=0, private, no-store, no-cache, must-revalidate"
</FilesMatch>
Но поскольку вы, вероятно, не используете apache, это вам не сильно поможет :(
Ответ на вопрос 1
Вы можете написать Серверный контроль, унаследованный от System.Web.UI.Control, переопределив метод Оказывать:
public class CSSLink : System.Web.UI.Control
{
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
if ( ... querystring params == ... )
writer.WriteLine("<link href=\"/styles/css1.css\" type=\"text/css\" rel=\"stylesheet\" />")
else
writer.WriteLine("<link href=\"/styles/css2.css\" type=\"text/css\" rel=\"stylesheet\" />")
}
}
и вставьте экземпляр этого класса в свою MasterPage:
<%@ Register TagPrefix = "mycontrols" Namespace = "MyNamespace" Assembly = "MyAssembly" %>
...
<head runat = "server">
...
<mycontrols:CSSLink id = "masterCSSLink" runat = "server" />
</head>
...
Я не знаю, правильно ли это используется, но я думаю, что вы можете принудительно перезагрузить файл css, используя строку запроса:
<link href = "mystyle.css?SOME_UNIQUE_TEXT" type = "text/css" rel = "stylesheet" />
Я помню, что использовал этот метод несколько лет назад, чтобы принудительно перезагрузить изображение с веб-камеры, но время, вероятно, ушло ...
В качестве Джерун предложил вы можете иметь что-то вроде:
<link href = "StyleSelector.aspx?foo=bar&baz=foz" type = "text/css" rel = "stylesheet" />
Тогда ваш файл StyleSelector.aspx должен быть примерно таким:
<%@ Page Language = "cs" AutoEventWireup = "false" Inherits = "Demo.StyleSelector" Codebehind = "StyleSelector.aspx.cs" %>
И ваш StyleSelector.aspx.cs выглядит так:
using System.IO;
namespace Demo
{
public partial class StyleSelector : System.Web.UI.Page
{
public StyleSelector()
{
Me.Load += New EventHandler(doLoad);
}
protected void doLoad(object sender, System.EventArgs e)
{
// Make sure you add this line
Response.ContentType = "text/css";
string cssFileName = Request.QueryString("foo");
// I'm assuming you have your CSS in a css/ folder
Response.WriteFile("css/" + cssFileName + ".css");
}
}
}
Это отправит пользователю содержимое файла CSS (фактически любого файла, см. Примечание по безопасности) на основе аргументов строки запроса. Теперь самая сложная часть - это выполнение условного GET, которое представляет собой причудливое имя для проверки, есть ли у пользователя страница в кеше или нет.
Прежде всего, я настоятельно рекомендую вам прочитать HTTP Conditional GET для хакеров RSS, отличную статью, в которой объясняются основы механизма HTTP Conditional GET. Поверьте, это должен прочитать.
Я отправил аналогичный ответ (но с кодом PHP, извините) на вопрос SO могу ли я использовать «http-заголовок», чтобы проверить, не была ли изменена динамическая страница. Перенести код с PHP на C# должно быть легко (я сделаю это, если у меня будет время позже).
Примечание по безопасности: делать что-то вроде ("css /" + cssFileName + ".css") очень небезопасно, поскольку вы можете отправить строку относительного пути и, таким образом, вы можете отправить пользователю содержимое другого файла. Вы должны придумать лучший способ узнать, какой файл CSS отправлять.
Примечание разработчика: вместо страницы .aspx вы можете использовать IHttpModule или IHttpHandler, но этот способ работает нормально.
Мне нравится предложение jeroen добавить строку запроса к URL-адресу таблицы стилей. Вы можете добавить отметку времени, когда файл таблицы стилей был в последний раз изменен. Мне кажется, что это хороший кандидат на вспомогательную функцию или настраиваемый элемент управления, который генерирует для вас тег LINK.
Как и в случае с правильным ответом, я использую аналогичный метод, но с некоторыми отличиями.
<link href = "mystyle.css?v=DIGIT" type = "text/css" rel = "stylesheet" />
В качестве ЦИФРЫ вы можете использовать реальный номер, установленный вручную или автоматически в вашем шаблоне. Например, в своих проектах я использую модули очистки кеша в панели администратора, и каждый раз, когда я использую этот очиститель кеша, он автоматически увеличивает DIGIT.