私は次のことをすることになりました:
まず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
、アップデートを考え出します。