有没有办法检查用户是否有不同版本的CSS缓存浏览器,如果是这样,强制他们的浏览器拉新版本?
答案 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文件。
设计说明:您可能希望使用IHttpModule
或IHttpHandler
代替.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。