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

lis*_*ite 30 .net css c# asp.net-mvc bundling-and-minification

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

bundles.Add(new StyleBundle("~/bundles/css").Include(
                      "~/assets/bootstrap/css/bootstrap.css",
                      "~/assets/css/global/all.css"));
Run Code Online (Sandbox Code Playgroud)

我使用以下内容引用它:

@Styles.Render("~/bundles/css")
Run Code Online (Sandbox Code Playgroud)

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

<link href="/assets/bootstrap/css/bootstrap.css" rel="stylesheet"/>
<link href="/assets/css/global/all.css" rel="stylesheet"/>
Run Code Online (Sandbox Code Playgroud)

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

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

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

<link href="/bundles/css?v=WBKHkZAJly7jUzHrVDT8SwfaQE-CA9dbOUQUlLKadNE1" rel="stylesheet"/>
Run Code Online (Sandbox Code Playgroud)

编辑:

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

#if DEBUG
            BundleTable.EnableOptimizations = false;
#else
            BundleTable.EnableOptimizations = true;
#endif
Run Code Online (Sandbox Code Playgroud)

我理解并欣赏这个响应,但根据文档,MVC捆绑的默认行为是在发布模式下捆绑但不在调试模式下捆绑.我不明白为什么我应该添加额外的代码来使它在它应该已经完成​​时执行此操作.

编辑2

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

Tja*_*alt 28

这是默认行为.

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

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

在此输入图像描述


kri*_*gar 14

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

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

#if DEBUG
BundleTable.EnableOptimizations = false;
#else
BundleTable.EnableOptimizations = true;
#endif
Run Code Online (Sandbox Code Playgroud)

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

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


小智 6

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

<compilation xdt:Transform="RemoveAttributes(debug)" />
Run Code Online (Sandbox Code Playgroud)

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

<compilation debug="false" xdt:Transform="SetAttributes" />
Run Code Online (Sandbox Code Playgroud)


Sal*_*igi 5

另一个可能的问题是,在方法中的Global.asax.cs文件内部Application_Start(),您错过了对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);

    }
}
Run Code Online (Sandbox Code Playgroud)