【问题标题】:ASP.net MVC static resource bundles and Scripts.Render()ASP.net MVC 静态资源包和 Scripts.Render()
【发布时间】:2013-11-06 11:12:25
【问题描述】:

我正在尝试通过更改检索静态资源(如 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

【问题讨论】:

  • 出于兴趣,你为什么要这样做——是为了让你在脚本调用中添加额外的属性吗?
  • 我正在尝试这样做,因此 cookie 数据不会与获取静态资源的请求一起发送,因为它们不需要 cookie。这也意味着可以建立更多的并发浏览器连接以加快页面加载速度。
  • 投反对票的不是我,所以我说不出为什么。在午餐时间完全错过了静态域引用,这实际上是我以前使用过的一种技术(减去捆绑)。在调试模式下可以使用未压缩的单独文件对您来说很重要吗?
  • 另外,我可以使用正确的语言获取任何代码,您是在使用带有 VisualBasic.NET 还是 C# 的 ASP.NET MVC?上面的示例(异常)暗示了前者。
  • 感谢您抽出宝贵时间!我宁愿他们是这样,因为它使调试任何潜在的 JS 错误变得更加容易。抱歉,我正在使用 VB.net。

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


【解决方案1】:

我设法找到了解决此问题的方法,因此希望通过将其放在这里让所有人都可以看到这将帮助其他遇到我遇到类似问题的人。


按照我在原始问题中发布的解决方法的相同想法,我创建了 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")

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

  • 我在函数调用中添加了一个 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("~/Content/Style")

我将调用替换为:

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

我希望这对某人有用!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2013-08-01
    • 2022-12-04
    • 2015-04-12
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多