Заставить браузер использовать новый CSS - PullRequest
8 голосов
/ 19 сентября 2008

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

Ответы [ 7 ]

20 голосов
/ 05 февраля 2009

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

<link href="mystyle.css?SOME_UNIQUE_TEXT" type="text/css" rel="stylesheet" />

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

4 голосов
/ 19 сентября 2008

Без использования js вы можете просто сохранить имя файла css в переменной сеанса. Когда делается запрос на главную страницу, вы просто создаете тег ссылки css с именем переменной сеанса.

Поскольку имя файла ccs отличается, вы заставляете загрузчик загружать его, не проверяя, что было загружено в браузере.

2 голосов
/ 12 февраля 2009

Как предложил Джероен , вы можете получить что-то вроде:

<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, но этот способ работает просто отлично.

1 голос
/ 19 сентября 2008

Ответ на вопрос 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>
...
0 голосов
/ 01 июля 2010

Мне нравится предложение jeroen добавить строку запроса в URL таблицы стилей. Вы можете добавить отметку времени, когда файл таблицы стилей последний раз изменялся. Мне кажется, это хороший кандидат на вспомогательную функцию или пользовательский элемент управления, который сгенерирует для вас тег LINK.

0 голосов
/ 19 сентября 2008

Я знаю, что вопрос был конкретно о 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, это не сильно вам поможет: (

0 голосов
/ 19 сентября 2008

Возможно, вам следует просто поделиться общим классом предка, а затем, если необходимо, щелкнуть по нему одной командой js.

<body class="style2">

<body class="style1">

и т.д.

...