4

こんにちはimvc4アプリケーションを使用し、バンドルを使用してスクリプトとcssをレンダリングします

以下は私がバンドルを作成した方法です:

bundles.Add( new StyleBundle( "~/Content/css" ).Include(
                    "~/Content/bootstrap/css/bootstrap.css",
                    "~/Content/bootstrap/css/bootstrap-responsive.css",
                    "~/Content/site.css" ) );

これで、ブラウザのソースに表示されるように、次のようなバンドルが生成されます。

<link href="/Content/css?v=8HZAB6C8ZnrIPYNFzMQKt0AR4AUsUYBjxPPkbGSRIZo1" rel="stylesheet">

私が欲しいのは、リンク内のバージョンの「v」クエリ文字列を削除することです。

ありがとう

4

4 に答える 4

6

mvc-bundlingの拡張機能を作成しました。これにより、代わりにURL内でクエリ文字列部分を移動できます。このようなURLを生成できます

/bundles/css/20130315191550.css

/ bundles / css / _NNIf4XxdPCITzjlKPMgZwHMSUsPyxxGaNCIe6mgAkg1

コードはhttp://github.com/unger/Bundling.Extensionsで入手できます

多分これはあなたにそれを解決する方法についてのいくつかのアイデアを与えることができますか?

于 2013-10-03T20:29:42.203 に答える
5

私は次のことをすることになりました:

まずBundleResolver、この実装でデフォルトを変更しました

public class ReplaceQueryStringBundlerResolver : IBundleResolver
        {
            private readonly IBundleResolver _resolver;

            public ReplaceQueryStringBundlerResolver(IBundleResolver resolver)
            {
                _resolver = resolver;
            }

            public IEnumerable<string> GetBundleContents(string virtualPath)
            {
                return _resolver.GetBundleContents(virtualPath);
            }

            //The important part, modifies the generated Url
            public string GetBundleUrl(string virtualPath)
            {
                var bundleUrl = _resolver.GetBundleUrl(virtualPath);
                bundleUrl = bundleUrl.Replace("?v=", "/v/");
                return bundleUrl;
            }

            public bool IsBundleVirtualPath(string virtualPath)
            {
                return _resolver.IsBundleVirtualPath(virtualPath);
            }
        }

そして、これはこのようにRegisterBundlesメソッドに登録できます。

 BundleResolver.Current = new ReplaceQueryStringBundlerResolver(BundleResolver.Current);

これは基本的に、現在のリゾルバーに必要なURL形式を使用するように指示します。

Styles.Render呼び出し元のコードのどこかを変更したりScripts.Render呼び出したりする必要がないため、このソリューションの方が優れています。

これらの新しいバンドルUrlsをバンドルテーブルにマップする必要があるため、現在のApiと同様のことを試みましたが、それを機能させることができなかったため、一時的な解決策として、web.configに書き換えルールを追加しました。に書き直し/v/ます?v=。理想的には、最適化モジュールがこれを行う必要があります。これは、書き換えルールにより、いくつかの命名規則に従うことが制限されており、すべてのバンドルの仮想パスはで始まる必要があるためです。"~/bundles/"

<rule name="RewriteBundlesWithNoQueryStrings" stopProcessing="true">
  <match url="^bundles/(.*)/v/(.*)" />
  <action type="Rewrite" url="/bundles/{R:1}?v={R:2}" />
</rule>
<rule name="RewriteBundlesWithNoQueryStringsToDefault" stopProcessing="true">
  <match url="^bundles/(.*)/(.*)" />
  <action type="Rewrite" url="/bundles/{R:1}" />
</rule>

バンドルリクエストを処理するクラスで何かをフックできる場合はBundleHandler、アップデートを考え出します。

于 2016-07-26T14:43:51.833 に答える
2

いいえ。その場合、ブラウザは古いバージョンのバンドルをキャッシュします。これは、そのクエリ文字列がコンテンツが変更されたときのフィンガープリントであるためです。

バックログには、指紋がURLにどのように表示されるかをカスタマイズできるようにするアイテムがありますが、現在、それをオフにする方法はありません。

簡単な回避策は、バンドルへのパスを明示的にレンダリングすることです。これは、クエリ文字列が必要ない場合はパスが変更されないためです。

于 2013-01-10T18:53:56.510 に答える
1

次のような単純な拡張機能を記述してください。

public enum RenderType{Css, Js}
public static class _Extentions
{
    public static string RemoveQueryString(this IHtmlString _HtmlString, RenderType _RenderType){
        string Render = _HtmlString.ToHtmlString().Replace(Environment.NewLine, "").Replace("?v=", "/v/");
        Render = Render.Replace(_RenderType == RenderType.Css ? "\" rel=" : "\"></script>", _RenderType == RenderType.Css ? ".css\"  rel=" : ".js\"></script>");
        return Render;
    }      
}

そして、次のようにURL書き換えを使用します。

<rule name="rewrite css" enabled="true" stopProcessing="true">
<match url="^css/v/(.+).css"/>
<conditions logicalGrouping="MatchAll" trackAllCaptures="false"/>
<action type="Rewrite" url="/css?v={R:1}"/>
</rule> 
<rule name="rewrite js" enabled="true" stopProcessing="true">
<match url="^js/v/(.+).js"/>
<conditions logicalGrouping="MatchAll" trackAllCaptures="false"/>
<action type="Rewrite" url="/js?v={R:1}"/>
</rule> 

そしてそれをこのように使用します:

<%=Styles.Render("~/css").RemoveQueryString(RenderType.Css)%>
<%=Scripts.Render("~/js").RemoveQueryString(RenderType.Js)%>

Render関数の仮想パスとURL書き換えの仮想パスは一致している必要があることに注意してください。

Scripts.Render( "〜/ js ").RemoveQueryString(RenderType.Js)

match url = "^ js /v/(.+).js"

于 2015-06-15T15:00:16.193 に答える