3

我正在尝试通过更改检索 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
4

1 回答 1

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("~/bundles/jquery")

我将电话替换为:

@Html.RenderScripts(False, "~/bundles/jquery")

关于上述方法的一些注意事项......

  • 我在函数调用中添加了一个异步参数,以允许我使用现代浏览器 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("~/Content/Style")

我将电话替换为:

@Html.RenderStyles("~/Content/Style")

我希望这对某人有用!

于 2013-11-21T15:42:31.437 回答