ASP.net MVC静态资源包和Scripts.Render()

时间:2013-11-06 11:12:26

标签: asp.net-mvc bundle extension-methods

我正在尝试通过改变检索javascript和css文件等静态资源的方式,在我的ASP.net MVC 4项目(VB.net)中实现一些静态资源改进。

我一直在关注此链接(ASP.NET & MVC 4: Cookieless domain for bundling and static resources )以帮助完成此操作,但我遇到了一个问题,即未呈现非捆绑的javascript和css文件。

通常在渲染.js或.css包时,请使用以下内容:

@Scripts.Render("~/bundles/jquery")

这将在开发模式下在〜/ bundles / jquery包中单独呈现每个脚本标记,并在生产时呈现指向缩小包的单个脚本标记。

根据上面的链接,当脚本捆绑到一个文件中时,您可以使用以下行:

<script src="@Url.StaticContent("~/bundles/jquery")" type="text/javascript"></script>

这适用于捆绑文件,因为src属性有效且StaticContent函数能够更改src URL。但是在开发模式下,捆绑文件不存在,因为没有发生捆绑,并且所有脚本都通过 @ Scripts.Render 单独呈现给浏览器,因此此方法不起作用。

有没有人知道是否有可能为Scripts助手创建一个扩展方法来完成我需要的工作,或者我将不得不做这样的事情?

@If Misc.IsLocalDev Then
    @Scripts.Render("~/bundles/jquery")
Else
    @<script src="@Url.StaticContent("~/bundles/jquery")" type="text/javascript"></script>
End If

1 个答案:

答案 0 :(得分:2)

我设法找到了这个问题的解决方案,所以希望通过把它放在这里让所有人看到这将有助于其他人遇到类似的问题。


与我在原始问题中发布的解决方法相同的想法,我创建了2个新的帮助函数,以帮助在我的视图中生成必要的脚本和样式引用...

脚本

<ExtensionAttribute()> _
Public Function RenderScripts(helper As HtmlHelper, async As Boolean, ParamArray Paths() As String) As IHtmlString

    If Misc.IsLocalDev Then
        Return Optimization.Scripts.Render(Paths)
    Else
        Dim url As UrlHelper = New UrlHelper(HttpContext.Current.Request.RequestContext, RouteTable.Routes)
        Dim html As String = ""
        For Each Path In Paths
            If async = True Then
                html = html & "<script async src=""" & url.StaticContent(Path) & GetAppVersionSuffix() & """ type=""text/javascript""></script>"
            Else
                html = html & "<script src=""" & url.StaticContent(Path) & GetAppVersionSuffix() & """ type=""text/javascript""></script>"
            End If
        Next
        Return New HtmlString(html)
    End If

End Function

所以不要使用:

  

@ Scripts.Render( “〜/捆绑/ jquery的”)

我用:

替换了这些电话
  

@ Html.RenderScripts(False,“〜/ bundles / jquery”)

关于上述方法的几点说明......

  • 我在函数调用中添加了 async 参数,以允许我使用现代浏览器aynsc脚本。
  • GetAppVersionSuffix()函数调用返回附加到脚本源末尾的程序集版本,例如?v = 1.2.3.4 。这可确保浏览器在发布新版本时获取脚本和样式表的新副本。
  • Misc.IsLocalDev 函数是一个特殊的函数,用于在我在本地计算机上进行开发时更改Web应用程序的某些部分的行为方式。在这种情况下,它确保呈现非捆绑脚本和样式而不是缩小/捆绑的脚本以便于调试。

样式

<ExtensionAttribute()> _
Public Function RenderStyles(helper As HtmlHelper, ParamArray Paths() As String) As IHtmlString

    If Misc.IsLocalDev Then
        Return Optimization.Styles.Render(Paths)
    Else
        Dim url As UrlHelper = New UrlHelper(HttpContext.Current.Request.RequestContext, RouteTable.Routes)
        Dim html As String = ""
        For Each Path In Paths
            html = html & "<link href=""" & url.StaticContent(Path) & GetAppVersionSuffix() & """ rel=""Stylesheet"" />"
        Next
        Return New HtmlString(html)
    End If

End Function

再次,而不是使用:

  

@ Styles.Render( “〜/内容/风格”)

我用:

替换了这些电话
  

@ Html.RenderStyles( “〜/内容/风格”)

我希望这对某人有用!