我最终做了以下事情:
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
,我会提出更新。