[英]Automatically add version to js files inside asp.net header runat=“server”
我正在嘗試自動重新加載已審核的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 =“server”添加到腳本標簽,但這樣asp.net嘗試編譯這些文件並構建失敗。 我不能每次都添加版本因為項目有很多文件。 當應用runat =“server”時,也不允許使用代碼塊。
我想使用一個普遍接受的解決方案,所以我不必再擔心css / js文件版本了。
在MVC Core 1.0中,有一個用於此目的的標記幫助程序。 如果您使用的是不同版本的MVC,那么以前的答案應該有所幫助。
<link rel="stylesheet" src="wherever.css" asp-append-version="true" />
script
標記不會被選為控件,因此如果要在控制器中處理script
標記,則需要將其包裝在自定義控件中。 或者您可以直接在視圖中添加時間戳:
<script type="text/javascript" src="path/to/file.js?v=<%= Tools.BuildDate() %>" />
以下是一些更多信息: http : //madskristensen.net/post/cache-busting-in-aspnet
這應該做
<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。 獲取指定的資源時,服務器將完全忽略附加的查詢字符串。
如果不知道你使用的是什么版本的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>
幫手很容易增強。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.