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

时间:2011-11-21 18:58:25

标签: c# javascript css 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>

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

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

1 个答案:

答案 0 :(得分:4)

你可以这样做:

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;
}

版本服务看起来像这样:

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
}

您可能需要查看cassette

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