用于防止缓存的 url.content 的 razor 扩展方法

Pat*_*ott 2 javascript css c# asp.net-mvc razor

我想覆盖 Url.Content 以将查询字符串参数附加到 Url.Content 上的结果字符串。

原因是,我开发了一个 Web 应用程序,并且每次发布时,用户都必须清除缓存才能获得新的 css 和 js。对此的解决方案是将版本号附加到查询字符串以强制加载新版本。

一个有效的解决方案如下:

@{ var version = "?v=" + ViewBag.VersionNumber; }
<head>
<link href="@Url.Content("~/ux/css/base.css")@version" rel="stylesheet" type="text/css" />
</head>
Run Code Online (Sandbox Code Playgroud)

版本在配置文件中设置,因此每个版本都会更新版本。不过,我希望这更加自动化,因为目前任何时候添加新的 css 引用时,我们都必须记住将 @version 添加到字符串中。返回带有已附加版本号的路径的扩展方法将是完美的。

此外,如果有人知道我可以通过 TFS 签入或编译自动更改版本号,那也将非常有用。

san*_*oIT 5

你可以这样做:

public static string VersionedContent(this UrlHelper urlHelper, string contentPath)
{
    string result = urlHelper.Content(contentPath);
    var versionService = Engine.IocService.GetInstance<IVersionService>();
    string tag = versionService.GetVersionTag();
    if (result.Contains('?'))
    {
        result += "&v="+tag;
    }
    else
    {
        result += "?v="+tag;
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

版本服务看起来像这样:

public class VersionService : IVersionService
{
    string _versionTag;
    public VersionService()
    {
        _versionTag = Assembly.GetExecutingAssembly().GetName().Version.ToString();
        _versionTag = _versionTag.Replace('.', '-');
    }
    #region IVersionedContentService Members

    public string GetVersionTag()
    {
        return _versionTag;
    }

    #endregion
}
Run Code Online (Sandbox Code Playgroud)

你可能想看看卡带

* 编辑 * 对于自动。使用 TFS 构建编号,请查看: automatic-assembly-file-version-numbering-in-tfs-2010