Заставить браузер использовать новый CSS

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
10
0
7 477
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Возможно, вам следует просто поделиться общим классом-предком, а затем вы можете щелкнуть его с помощью одной команды 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.

Другие вопросы по теме