3

javascript や css ファイルなどの静的リソースの取得方法を変更することで、ASP.net MVC 4 プロジェクト (VB.net) に静的リソースの改善を実装しようとしています。

これを達成するために、このリンク ( ASP.NET & MVC 4: Cookieless domain for bundle 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 に答える