我试图自动重新加载已审核的css / js文件以防止缓存。我可以循环通过标题(这是runat =" server")并添加一个值来链接href引用,但循环不会将脚本标记作为控件。
if (Page.Header != null)
{
foreach (var sc in Page.Header.Controls)
{
var type = sc.GetType();
if (type == typeof(HtmlLink))
{
((HtmlLink)sc).Href += "?v=" + Tools.BuildDate();
}
else if (type == typeof(HtmlGenericControl))
{
((HtmlGenericControl)sc).Attributes["src"] += "?v=" + Tools.BuildDate();
}
}
}
我试图添加runat ="服务器"脚本标签但是这样asp.net尝试编译这些文件并构建失败。我不能每次都添加版本因为项目有很多文件。当runat =" server"时,也不允许使用代码块。适用。
我想使用一个普遍接受的解决方案,所以我不再需要担心css / js文件版本。
答案 0 :(得分:3)
在MVC Core 1.0中,有一个用于此目的的标记帮助程序。如果您使用的是不同版本的MVC,那么以前的答案应该有所帮助。
<link rel="stylesheet" src="wherever.css" asp-append-version="true" />
答案 1 :(得分:2)
script
标记不会被选为控件,因此如果要在控制器中处理它,则需要将其包装在自定义控件中。或者您可以直接在视图中添加时间戳:
<script type="text/javascript" src="path/to/file.js?v=<%= Tools.BuildDate() %>" />
以下是一些信息:http://madskristensen.net/post/cache-busting-in-aspnet
答案 2 :(得分:2)
这应该
<script src="ScriptsFolder/ScriptFile.js?v=<%=Tools.BuildDate() %>"></script>
<link href="StylesFolder/StyleFile.css?v=<%= Tools.BuildDate() %>" rel="stylesheet" />
当Tools.BuildDate()返回的值发生变化时,浏览器将被强制重新加载脚本/样式文件,因为资源URL已经更改,例如从url / ScriptsFolder / ScriptFile.js?v = 1234到url / ScriptsFolder / ScriptFile.js?v = 5678。 到目前为止,这应该是最简单和最快速的解决方案,因为它只会将查询字符串v = value附加到资源URL。在获取指定的资源时,服务器将完全忽略附加的查询字符串。
答案 3 :(得分:1)
在不知道您使用的是什么版本的ASP.NET(或MVC)的情况下,我可以给您一个简单的方法。你总是可以建立一个“帮手”来为你做繁重的工作。这是MVC和ASP.NET 5帮助程序处理它的方式,但几乎可以使用任何版本。我通常不喜欢内联代码,但可以安全地使用静态帮助程序来防止运行时错误。
首先构建一个静态帮助器实用程序:
public static class ScriptHelper
{
public static IHtmlString Render(params string[] paths)
{
return RenderFormat(DefaultTagFormat, paths);
}
public static IHtmlString RenderFormat(string tagFormat, params string[] paths)
{
if (string.IsNullOrEmpty(tagFormat))
{
throw new ArgumentException("Tag Format cannot be null");
}
if (paths == null)
{
throw new ArgumentNullException("Paths cannot be empty");
}
if (paths.Any(string.IsNullOrEmpty))
{
throw new ArgumentException("paths");
}
return BuildHtml(tagFormat, paths);
}
private static string defaultFormat = "<script src=\"{0}?ver={1}\"></script>";
public static string DefaultTagFormat
{
get
{
return defaultFormat;
}
set { defaultFormat = value; }
}
private static IHtmlString BuildHtml(string tagFormat, params string[] paths)
{
StringBuilder builder = new StringBuilder();
foreach (string path in paths)
{
StringBuilder builder = new StringBuilder();
foreach (string path in paths)
{
// Substitute your logic for version number
var version = "1234";
// You could factory this to a concrete type based on file extension etc.
var fileToOutPut = new VersionedJsFile(path,version,tagFormat);
builder.Append(fileToOutPut.RenderOutput());
builder.Append(Environment.NewLine);
}
return new HtmlString(builder.ToString());
}
}
您可以添加额外的逻辑来环绕路径,验证路径,虚拟路径等。最好使用可以在路径(来自帮助程序)和版本中传递的render方法创建对象。这是完成它的oop方式,并且更灵活。这样你可以让它成为一个“VersionHelper”,让它处理css / js / etc。
internal abstract class HtmlFile
{
public abstract string RenderOutput();
}
internal class VersionedJsFile : HtmlFile
{
private string _version;
private string _path;
private string _format;
public VersionedJsFile(
string path,
string version,
string format)
{
if (version != null) _version = version;
if (path != null) _path = path;
if(!string.IsNullOrEmpty(format))
_format = format;
}
public override string RenderOutput()
{
if (!string.IsNullOrEmpty(_path)
&& !string.IsNullOrEmpty(_format))
{
string versionedFilePath = string.Format(_format, _path, _version);
return versionedFilePath;
}
return string.Empty;
}
}
然后将帮助器添加到页面/母版页/布局中:
<%: ScriptHelper.Render("/scripts/bootstrap.js") %>
如您所见,帮助程序使用params对象,因此您可以同时应用于多个文件。
<强>输出:强>
<script src="/scripts/bootstrap.js?ver=1234"></script>
可以很容易地增强助手。