如何从MVC3中的_Layout.CSHTML页面调用并传递c#帮助程序代码?

时间:2014-08-21 11:11:45

标签: c# javascript asp.net-mvc asp.net-mvc-3 caching

为了强制浏览器在asp.net应用程序中获取最新的js和css文件,我得到了以下代码。但是我如何在Layout.cshtml中使用它。

我在控制器中编写了该方法,如何在脚本的位置传递给Layout.cshtml

public static class JavascriptExtension {
public static MvcHtmlString IncludeVersionedJs(this HtmlHelper helper, string filename) {
    string version = GetVersion(helper, filename);
    return MvcHtmlString.Create("<script type='text/javascript' src='" + filename + version + "'></script>");
}

private static string GetVersion(this HtmlHelper helper, string filename){
    var context = helper.ViewContext.RequestContext.HttpContext;
    if (context.Cache[filename] == null) {
        var physicalPath = context.Server.MapPath(filename);
        var version = "?v=" +
          new System.IO.FileInfo(physicalPath).LastWriteTime
            .ToString("yyyyMMddhhmmss");
        context.Cache.Add(physicalPath, version, null,
          DateTime.Now.AddMinutes(1), TimeSpan.Zero,
          CacheItemPriority.Normal, null);
        context.Cache[filename] = version;
        return version;
    }
    else {return context.Cache[filename] as string;}
}

然后在CSHTML页面中:  @ Html.IncludeVersionedJs( “/ MyJavascriptFile.js”) 在呈现的HTML中,它显示为:   

1 个答案:

答案 0 :(得分:1)

Views文件夹的web.config文件中包含扩展类的命名空间。例如,(用您的命名空间替换 NamespaceOfJavascriptExtension ):

<system.web.webPages.razor>
  <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
  <pages pageBaseType="System.Web.Mvc.WebViewPage">
    <namespaces>
      <add namespace="System.Web.Mvc" />
      <add namespace="System.Web.Mvc.Ajax" />
      <add namespace="System.Web.Mvc.Html" />
      <add namespace="System.Web.Routing" />
      <add namespace="NamespaceOfJavascriptExtension" />
    </namespaces>
  </pages>
</system.web.webPages.razor>

然后确保清理并构建项目(您可能需要重新打开解决方案)。然后,您应该可以在布局文件中使用@Html.IncludeVersionedJs("/MyJavascriptFile.js")