打开发布模式时捆绑不在MVC5中工作

我在BundleConfig.cs中配置了以下捆绑包:

bundles.Add(new StyleBundle("~/bundles/css").Include( "~/assets/bootstrap/css/bootstrap.css", "~/assets/css/global/all.css")); 

我使用以下方法引用它:

 @Styles.Render("~/bundles/css") 

当我处于调试模式(web.config compilation debug="true" )时,它按预期工作,因为它将两个css文件呈现为正常,即:

   

但是,当我设置debug="false" ,上述行为仍然会发生,因为它确实识别文件,但它只是正常渲染它们。

确认捆绑绝对可以工作我已经在BundleConfig中启用了优化,即BundleTable.EnableOptimizations = true;

每当我执行上述操作时,它会捆绑css并按预期显示,即:

  

编辑:

有些人提到将以下代码添加到我的BundleConfig.cs文件中将实现我的目标:

 #if DEBUG BundleTable.EnableOptimizations = false; #else BundleTable.EnableOptimizations = true; #endif 

我理解并理解这个响应,但根据文档,MVC捆绑的默认行为是在发布模式下捆绑但不在调试模式下捆绑。 我不明白为什么我需要添加额外的代码才能在它应该这样做的时候执行此操作。

编辑2

我忏悔了。 事实certificate我打开了Views文件夹中的web.config而不是主web.config。 我更改了主web.config中的设置,这对我来说很好。 我责怪ReSharper

这是默认行为。

通过在Web.config文件中的编译元素中设置debug属性的值来启用或禁用捆绑和缩小。

http://www.asp.net/mvc/overview/performance/bundling-and-minification

在此处输入图像描述

我解决这个问题的方法是强制它在BundleConfig中完成我想要它做的事情。 我不认为MVC4与配置文件有相同的选项(或者我从来没有让它们工作)。

这就是我在RegisterBundles方法结束时所拥有的:

 #if DEBUG BundleTable.EnableOptimizations = false; #else BundleTable.EnableOptimizations = true; #endif 

这种方式总是在那里,很明显。 但是,当你启动项目时,你必须记住把它放在那里,但那并不是什么大不了的事。

如果您不熟悉这些,那么#if DEBUG是一个预处理程序指令 ,它告诉CLR在存在DEBUG构建参数时执行该块中的内容(应该只在DEBUG模式下出现,尽管可以从项目属性)。 如果该变量不存在(释放模式或任何其他模式),则它将执行另一个块。

默认的Release Web.config转换删除了调试属性,如下所示:

  

但是,这不会导致发生预期的捆绑行为。 相反,您必须创建一个转换,从字面上将debug属性设置为“false”,如下所示:

  

另一个可能的问题是,在Application_Start()方法中的Global.asax.cs文件中,您错过了对BundleConfig的调用。

例如,假设您的方法使用默认名称RegisterBundles(BundleCollection bundles)然后在Global.asax.cs文件中,您将要添加BundleConfig.RegisterBundles(BundleTable.Bundles);Application_Start()方法中。

所以你的Global.asax.cs文件看起来像这样:

 using System; using System.Collection.Generic; using System.Linq; using System.Web; using System.Http; using System.Mvc; using System.Routing; using System.Optimization; namespace MyProject { public class MvcApplication : System.Web.HttpApplication { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); // ** This line right below might be what you are missing ** BundleConfig.RegisterBundles(BundleTable.Bundles); } } 

我更改了css文件夹时遇到了这个问题。 我的问题是我更改了css文件的BundleConfig文件:

BundleConfig.cs:

 bundles.Add(new StyleBundle("~/Content/css").Include( "~/Content/css/bootstrap.css", .... 

意见包括:

 @Styles.Render("~/Content/css") 

出于某种原因,这没有奏效。 ‘bundles’似乎是一个关键字或其他东西(不确定)。 你必须这样离开:

 bundles.Add(new StyleBundle("~/bundles/css").Include( "~/Content/css/bootstrap.css", ... 

浏览次数:

 ... @Styles.Render("~/bundles/css") ... 

我不需要修改’BundleTable.EnableOptimizations’也不需要修改web.config或其他任何东西。

希望这有助于某人。

在对这个问题进行了几个小时的斗争之后,我建议你也尝试这个:

  1. 在您使用捆绑包的视图的最开头添加:

    @ {BundleTable.EnableOptimizations = true; }

  2. 重置IIS

  3. 重新加载您的页面并检查minify是否有效

在我的情况下,在我的解决方案的某个地方将“BundleTable.EnableOptimizations”从true更改为false。 当我在使用捆绑包之前将其强制为TRUE时,我得到了这个function。

在我注意到它有效之后,我将它移到了BundleConfig类的静态方法中:

 public static void EnableOptimizations() { #if DEBUG BundleTable.EnableOptimizations = false; #else BundleTable.EnableOptimizations = true; #endif } 

所以我可以从视图中调用它并让它为开发人员禁用minify

 @{ BundleConfig.EnableOptimizations(); }