有没有一种方法可以检查用户在其浏览器中缓存的不同版本的 CSS,并且如果有,则强制他们的浏览器拉取新版本?
我不知道这是否是正确的用法,但我认为你可以使用查询字符串来强制重新加载CSS文件:
<link href="mystyle.css?SOME_UNIQUE_TEXT" type="text/css" rel="stylesheet" />
我记得我几年前用过这种方法来强制重新加载网络摄像头图像,但时间可能已经过去了...
不使用js,您可以将css文件名保存在会话变量中。当对主页发出请求时,只需使用会话变量名称组成css链接标记。
由于ccs文件名不同,您强制浏览器下载它,而无需检查先前在浏览器中加载了什么。
就像jeroen建议的那样,您可以使用类似以下方式:
<link href="StyleSelector.aspx?foo=bar&baz=foz" type="text/css" rel="stylesheet" />
<%@ Page Language="cs" AutoEventWireup="false" Inherits="Demo.StyleSelector" Codebehind="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");
}
}
}
IHttpModule
或 IHttpHandler
而不是 .aspx 页面,但这种方式也可以正常工作。问题1的答案
您可以编写从System.Web.UI.Control继承的服务器控件,覆盖Render方法:
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\" />")
}
}
然后在您的主页中插入此类的一个实例:
<%@ Register TagPrefix="mycontrols" Namespace="MyNamespace" Assembly="MyAssembly" %>
...
<head runat="server">
...
<mycontrols:CSSLink id="masterCSSLink" runat="server" />
</head>
...
我喜欢Jeroen的建议,在样式表URL中添加查询字符串。您可以添加样式表文件上次修改的时间戳。对我来说,这似乎是一个很好的候选项,可以使用帮助程序函数或自定义控件为您生成LINK标记。
<body class="style2">
<body class="style1">
等等。
我知道这个问题特别涉及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,这对您帮助不大 :(
就像正确答案中所示,我正在使用一些类似的方法,但是有一些不同之处。
<link href="mystyle.css?v=DIGIT" type="text/css" rel="stylesheet" />