强制浏览器使用新的CSS

时间:2008-09-19 11:08:45

标签: c# asp.net css master-pages

有没有办法检查用户是否有不同版本的CSS缓存浏览器,如果是这样,强制他们的浏览器拉新版本?

8 个答案:

答案 0 :(得分:20)

我不知道它是否正确使用,但我认为您可以使用查询字符串强制重新加载css文件:

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

我记得几年前我用这种方法强制重新加载网络摄像头图像,但时间可能已经开始......

答案 1 :(得分:4)

不使用js,只需将css文件名保存在会话变量中即可。当向主页面发出请求时,您只需使用会话变量名称编写css链接标记。

由于ccs文件名不同,您强制broswer下载它,而无需检查浏览器中当前加载的内容。

答案 2 :(得分:2)

作为jeroen suggested你可以有类似的东西:

<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 for RSS hackers,这是一篇很好的文章,解释了HTTP条件GET机制的基础知识。相信我,这是必读

我已向SO问题similar answer发布了can i use “http header” to check if a dynamic page has been changed(但使用PHP代码,抱歉)。将代码从PHP移植到C#应该很容易(如果以后我有时间,我会这样做。)

安全注意事项:执行类似(“css /”+ cssFileName +“。css”)之类的操作非常不安全,因为您可能会发送相对路径字符串,因此您可以向用户发送不同文件的内容。您将想出一个更好的方法来找出要发送的CSS文件。

设计说明:您可能希望使用IHttpModuleIHttpHandler代替.aspx页面,但这种方式可以正常使用。

答案 3 :(得分:1)

回答问题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>
...

答案 4 :(得分:0)

您应该只是共享一个共同的祖先类,然后如果需要,您可以使用单个js命令轻弹它。

<body class="style2">

<body class="style1">

答案 5 :(得分:0)

我知道这个问题是关于C#的,我假设从某个版本的Windows服务器。由于我不熟悉这些技术,我将给出一个可以在PHP和Apache中运行的答案,你可以从中获得一些东西。

如前所述,只需根据特定查询在页面主体上设置ID或类,例如(在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,那对你没有多大帮助:(

答案 6 :(得分:0)

我喜欢jeroen建议在样式表网址中添加查询字符串。您可以在上次修改样式表文件时添加时间戳。在我看来,对于帮助函数或自定义控件来说,它可以为您生成LINK标记。

答案 7 :(得分:0)

就像正确的答案一样,我使用的是类似的方法,但有一些差异

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

作为DIGIT,您可以使用实数,可以在模板中手动或自动设置。例如,在我的项目中,我正在使用管理面板中的缓存清除模块,并且每次使用此缓存清除器时,它都会自动增加DIGIT。