如何使用mvc 4中的bundle删除版本生成器的querysting标记

Rus*_*sty 4 asp.net-mvc-4 bundling-and-minification

嗨我正在使用mvc4应用程序并使用bundle来呈现脚本和CSS

下面是我如何创建捆绑包:

bundles.Add( new StyleBundle( "~/Content/css" ).Include(
                    "~/Content/bootstrap/css/bootstrap.css",
                    "~/Content/bootstrap/css/bootstrap-responsive.css",
                    "~/Content/site.css" ) );
Run Code Online (Sandbox Code Playgroud)

现在它像我在浏览器源中看到的那样生成这样的包:

<link href="/Content/css?v=8HZAB6C8ZnrIPYNFzMQKt0AR4AUsUYBjxPPkbGSRIZo1" rel="stylesheet">
Run Code Online (Sandbox Code Playgroud)

我想要的是删除链接中版本的"v"查询字符串.

谢谢

小智 6

我已经为mvc-bundling创建了一个扩展,它允许你在url中移动查询字符串部分.它可以生成这样的网址

/bundles/css/20130315191550.css

/捆绑/ CSS/_NNIf4XxdPCITzjlKPMgZwHMSUsPyxxGaNCIe6mgAkg1

代码可从http://github.com/unger/Bundling.Extensions获得

也许这可以让你对如何解决它有所了解?


Adr*_*ode 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);
            }
        }
Run Code Online (Sandbox Code Playgroud)

可以这样在RegisterBundles方法中注册

 BundleResolver.Current = new ReplaceQueryStringBundlerResolver(BundleResolver.Current);
Run Code Online (Sandbox Code Playgroud)

它基本上指示当前的解析器使用我们所需的网址格式。

此解决方案更好,因为我们不必在调用代码中进行任何更改Styles.RenderScripts.Render调用。

由于我们需要将这些新的绑定映射Urls到bundles表,因此我尝试与当前的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>
Run Code Online (Sandbox Code Playgroud)

如果我可以在BundleHandler处理捆绑请求的类中挂钩,我将提供一个更新。