Asp.net MVC 强制更新捆绑包中的 javascript 文件

Asp.net MVC Force update of javascript file in a bundle

当我开发一个网页时,我通常在每次更改它时在 .js 引用之后包含一个参数,以强制浏览器获取新版本并防止它与旧版本保持一致。

例如,如果我的引用是这样的:

<script src="myfile.js" />

浏览器会缓存javascript文件,当我发布新的时,它不会获取,保留旧的。所以我将引用更改为:

<script src="myfile.js?ver=2" />

由于浏览器通过URL索引缓存,它会认为这是一个不同的文件并重新获取它。

但是,如果我的 javascript 在 asp.net 捆绑包中,我该怎么做呢?

bundles.Add(new ScriptBundle("~/bundles/global").Include(
               "~/Scripts/my/global.js"));

我试过下面的代码但没有用。在这种情况下,如何强制浏览器重新下载脚本?

bundles.Add(new ScriptBundle("~/bundles/global").Include(
               "~/Scripts/my/global.js?ver=2",

就个人而言,我无法忍受捆绑器,并且一直手动管理我的脚本。 所以这个答案可能不完全是你正在寻找的,但将有助于解决每次都必须手动更新 ?ver=# 的问题。

创建一个 class,也许 FileVersionRepo 在应用程序启动时(在 Global.asax 内)将包含一个 private static Dictionary<string,string>,其中键是文件名,值是是 FileInfo.LastWriteTime.ToFileTime().ToString() 值。当应用程序池重新启动或应用程序发布时,这将只读取文件的 lastWriteTime 一次。

这对于 CSS 个文件也很方便。

public static class FileVersionRepo {
    private static Object _lock = new Object();
    private static Dictionary<string,string> fileVals = new Dictionary<string,string>();

    public string GetVal(string key) { return fileVals[key]; }
    public string SetVal(string key, string path) {
        lock (_lock)
        {
            var fileInfo = new FileInfo(path);
            if (fileInfo.Exists)
                FileWriteTimes[key] = fileInfo.LastWriteTime.ToFileTime().ToString();
            else
                return;// maybe throw exception here?
        }
    }
}

然后在你的 Global.asax.cs:

protected virtual void Application_Start(object sender, EventArgs e)
{
    ...
    FileVersionRepo.SetVal("global.js", "path/global.js");
}

然后在您的视图中:

using FileVersionRepo;

<script src="global.js?ver=@FileVersionRepo.GetVal("global.js")"><script>

默认 MVC 项目创建一个 jquery 包,如下所示

我认为你的包应该是这样的:

       bundles.Add(new ScriptBundle("~/bundles/global").Include(
           "~/Scripts/jquery-{version}.js",

希望对您有所帮助!