BundleTable.Bundles.GetBundleFor() returns 但不是里面的项目
BundleTable.Bundles.GetBundleFor() returns but not Items inside
简述:
包含来自 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"));
这里有一些注释:
~/bundles/admin/somestyle
物理上不存在。
~/Areas/Admin/Content/css/aaa2.css
是由自定义 VirtualPathProvider
处理的虚拟路径
~/bundles/css
默认提供 MapPathBasedVirtualPathProvider
当前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
- 找到文件 => 自定义 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
,.Items 有一个条目 ~/Content/site.css
。
bundleOrdinaryUrl
是 "/bundles/css?v=6bMbVqKBetPV3UISUSkpqR5wiBsbzK_c6J21LUZAzaU1"
问题:
为什么解析“~/bundles/admin/somestyle”显示没有添加项目,即使项目已注册并且 VirtualPathProvider 正确处理它?
相关链接:
- ASP.NET Bundling/Minification and Embedded Resources
- http://www.codeproject.com/Articles/728146/ASP-NET-MVC-bundles-internals
您需要在捆绑注册之前注册您的 VirtualPathProvider ,以便能够找到您的文件。任何找不到的文件都不会包含在 bundle.Items
中
var vpp = new MyVirtualPathProvider();
BundleTable.VirtualPathProvider = vpp;
BundleConfig.RegisterBundles(BundleTable.Bundles);
当然,除非您已经将其注册为 HostingEnvironment.VirtualPathProvider。
简述:
包含来自 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"));
这里有一些注释:
~/bundles/admin/somestyle
物理上不存在。~/Areas/Admin/Content/css/aaa2.css
是由自定义VirtualPathProvider
处理的虚拟路径
~/bundles/css
默认提供MapPathBasedVirtualPathProvider
当前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
- 找到文件 => 自定义 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
,.Items 有一个条目~/Content/site.css
。bundleOrdinaryUrl
是 "/bundles/css?v=6bMbVqKBetPV3UISUSkpqR5wiBsbzK_c6J21LUZAzaU1"
问题:
为什么解析“~/bundles/admin/somestyle”显示没有添加项目,即使项目已注册并且 VirtualPathProvider 正确处理它?
相关链接:
- ASP.NET Bundling/Minification and Embedded Resources
- http://www.codeproject.com/Articles/728146/ASP-NET-MVC-bundles-internals
您需要在捆绑注册之前注册您的 VirtualPathProvider ,以便能够找到您的文件。任何找不到的文件都不会包含在 bundle.Items
中var vpp = new MyVirtualPathProvider();
BundleTable.VirtualPathProvider = vpp;
BundleConfig.RegisterBundles(BundleTable.Bundles);
当然,除非您已经将其注册为 HostingEnvironment.VirtualPathProvider。