BundleTable.Bundles.GetBundleFor()返回但不返回Items

时间:2015-02-13 12:43:21

标签: asp.net asp.net-mvc bundling-and-minification

简言之:

包含来自VirtualPath(由自定义VirtualPathProvider提供)的项目的捆绑包不起作用。 v=中未生成哈希值,并且解析它们会将.Items属性显示为空。

详细说明:

假设我们有捆绑注册:

  bundles.Clear();
  bundles.ResetAll();
  BundleTable.EnableOptimizations = true;
  bundles.Add(new StyleBundle("~/bundles/css")
           .Include("~/Content/site.css"));
  bundles.Add(new StyleBundle("~/bundles/admin/somestyle")
           .Include("~/Areas/Admin/Content/css/aaa2.css"));

这里有一些注意事项:

  1. ~/bundles/admin/somestyle实际上不存在。
  2. ~/Areas/Admin/Content/css/aaa2.css是由自定义VirtualPathProvider
  3. 处理的虚拟路径
  4. ~/bundles/css默认提供MapPathBasedVirtualPathProvider
  5. 当前Web.config文件的相关部分:

    <system.webServer>
      <validation validateIntegratedModeConfiguration="false" />
      <modules runAllManagedModulesForAllRequests="false"/>
      <handlers>
         <remove name="OPTIONSVerbHandler" />
         <remove name="TRACEVerbHandler" />
         <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
         <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
         <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
         <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
         <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
         <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    
         <add name="AspNetStaticFileHandler-TIFF" path="*.tiff" verb="*" type="System.Web.StaticFileHandler" />
         <add name="AspNetStaticFileHandler-GIF"  path="*.gif"  verb="*" type="System.Web.StaticFileHandler" />
         <add name="AspNetStaticFileHandler-PNG"  path="*.png"  verb="*" type="System.Web.StaticFileHandler" />
         <add name="AspNetStaticFileHandler-JPG"  path="*.jpg"  verb="*" type="System.Web.StaticFileHandler" />
         <add name="AspNetStaticFileHandler-CSS"  path="*.css"  verb="*" type="System.Web.StaticFileHandler" />
         <add name="AspNetStaticFileHandler-JS"   path="*.js"   verb="*" type="System.Web.StaticFileHandler" />
         <add name="AspNetStaticFileHandler-WOFF" path="*.woff" verb="*" type="System.Web.StaticFileHandler" />
         <add name="AspNetStaticFileHandler-TTF"  path="*.ttf"  verb="*" type="System.Web.StaticFileHandler" />
         <add name="AspNetStaticFileHandler-MAP"  path="*.map"  verb="*" type="System.Web.StaticFileHandler" />
       </handlers>
     </system.webServer>
    

    路由条目:

     routes.IgnoreRoute("favicon.ico");
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
     AreaRegistration.RegisterAllAreas();
     RouteConfig.RegisterRoutes(RouteTable.Routes);
    

    试驾:

    1。尝试直接访问.css文件:

    http://localhost:1010/Areas/Admin/Content/css/aaa2.css - 找到文件=&gt;自定义VirtualPathProvider完成了他的工作。

    2。尝试从HomeController中解析bundles

    public ActionResult Test()
    {
        var bundleVirtual = BundleTable.Bundles.GetBundleFor("~/bundles/admin/somestyle");
        var bundleVirtualUrl = BundleTable.Bundles.ResolveBundleUrl("~/bundles/admin/somestyle");
    
        var bundleOrdinary = BundleTable.Bundles.GetBundleFor("~/bundles/css");
        var bundleOrdinaryUrl = BundleTable.Bundles.ResolveBundleUrl("~/bundles/css");
    
        return View();
     }
    
      找到
    • bundleVirtual,但.Items属性为空。
    • bundleVirtualUrl / bundles / admin / somestyle?v = 请注意 v = 没有哈希值。
    • 找到
    • bundleOrdinary,。项目有一个条目~/Content/site.css
    • bundleOrdinaryUrl “/ bundles / css?v = 6bMbVqKBetPV3UISUSkpqR5wiBsbzK_c6J21LUZAzaU1”

    问题:

    为什么解析“〜/ bundles / admin / somestyle”表示没有添加项目,即使项目已注册且VirtualPathProvider正确处理它?<​​/ p>

    相关链接:

    1. ASP.NET Bundling/Minification and Embedded Resources
    2. http://www.codeproject.com/Articles/728146/ASP-NET-MVC-bundles-internals

1 个答案:

答案 0 :(得分:2)

您需要在捆绑注册之前注册VirtualPathProvider ,以便能够找到您的文件。未找到的任何文件都不会包含在bundle.Items

var vpp = new MyVirtualPathProvider();
BundleTable.VirtualPathProvider = vpp;
BundleConfig.RegisterBundles(BundleTable.Bundles);

除非您已将其注册为HostingEnvironment.VirtualPathProvider。