Visual Studio 2012条件捆绑

我刚刚开始使用VS 2012 RC。 我创建了一个包含母版页和单个Web表单的测试站点。 目前,我正在使用此代码捆绑网站上的整个Styles文件夹:

Global.asax中

 BundleTable.Bundles.EnableDefaultBundles(); 

的Site.Master

  

问题:测试站点有一个站点级CSS文件,用于控制站点的整体外观。 除了站点级CSS之外,每个页面都可以有自己的CSS定义。 是否可以在母版页中仅包含site.css文件,然后在每个页面需要时有条件地将.css文件添加到软件包中?

我在Default.aspx后面的代码中尝试了这个,但它不起作用:

 BundleTable.Bundles.Add(new Bundle("~/Styles/Default.css")); 

我的建议:

转到Global.asax 。 确保Application_Start方法包含以下行:

 protected void Application_Start() { ... BundleConfig.RegisterBundles(BundleTable.Bundles); } 

按如下方式查找或创建类BundleConfig ,最好在文件夹App_Start

 public class BundleConfig { public static void RegisterBundles(BundleCollection bundles) { ... bundles.Add(new StyleBundle("~page1").Include( "~/Styles/site.css", "~/Styles/page1.css")); bundles.Add(new StyleBundle("~page2").Include( "~/Styles/site.css", "~/Styles/page2.css")); ... bundles.Add(new StyleBundle("~pageN").Include( "~/Styles/site.css", "~/Styles/pageN.css")); } } 

现在在每个适当的页面中使用相应的bundle:

  

或者更好的代码:

 @Styles.Render("~/Styles/page1") 

(这是cshtml ,但aspx语法肯定非常相似)。

请注意,每页必须有一个单独的包。 您不应该动态修改同一个包。 捆绑包有虚拟url。 在你的例子中它只是css 。 这些都是由浏览器缓存的,因此无论天气如何,您都可以动态更改bundle的内容,浏览器可能会认为这是相同的,并且不会重新获取它。


如果您不想将每个页面手动添加到上述方法。 你可以自动化它。 以下代码可以让您了解如何:

 public class MyStyleHelper { public static string RenderPageSpecificStyle(string pagePath) { var pageName = GetPageName(pagePath); string bundleName = EnsureBundle(pageName); return bundleName; } public static string GetPageName(string pagePath) { string pageFileName = pagePath.Substring(pagePath.LastIndexOf('/')); string pageNameWithoutExtension = Path.GetFileNameWithoutExtension(pageFileName); return pageNameWithoutExtension; } public static string EnsureBundle(string pageName) { var bundleName = "~/styles/" + pageName; var bundle = BundleTable.Bundles.GetBundleFor(bundleName); if (bundle == null) { bundle = new StyleBundle(bundleName).Include( "~/styles/site.css", "~/styles/" + pageName + ".css"); BundleTable.Bundles.Add(bundle); } return bundleName; } } 

用法: