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

时间:2015-03-25 11:18:02

标签: c# css .net 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"));

我使用以下内容引用它:

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

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

<link href="/assets/bootstrap/css/bootstrap.css" rel="stylesheet"/>
<link href="/assets/css/global/all.css" rel="stylesheet"/>

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

确认捆绑绝对有效我在BundleConfig中启用了优化,即BundleTable.EnableOptimizations = true;

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

<link href="/bundles/css?v=WBKHkZAJly7jUzHrVDT8SwfaQE-CA9dbOUQUlLKadNE1" rel="stylesheet"/>

编辑:

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

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

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

编辑2

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

7 个答案:

答案 0 :(得分:24)

这是默认行为。

  

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

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

  

enter image description here

答案 1 :(得分:14)

我解决这个问题的方法是强迫它BundleConfig完全按照我的意愿去做。我不认为MVC4与配置文件有相同的选项(或者我从来没有让它们工作)。

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

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

这种方式总是在那里,很明显。但是,当您启动项目时,您必须记住将其放在那里,但这并不是一件大事。

如果您不熟悉这些,#if DEBUGpreprocessor directives,它告诉CLR在存在DEBUG构建参数时执行该块中的内容(应该只存在)在DEBUG模式下,虽然可以从Project Properties更改。如果该变量不存在(释放模式或任何其他模式),则它将执行另一个块。

答案 2 :(得分:6)

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

<compilation xdt:Transform="RemoveAttributes(debug)" />

但是,这不会导致出现预期的捆绑行为。相反,您必须创建一个转换,将字面上的调试属性设置为&#34; false&#34;,如下所示:

<compilation debug="false" xdt:Transform="SetAttributes" />

答案 3 :(得分:4)

另一个可能的问题是,在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);

    }
}

答案 4 :(得分:0)

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

BundleConfig.cs:

Elif

包括观点:

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

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

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

查看:

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

我无需修改'BundleTable.EnableOptimizations',也无需修改web.config或其他任何内容。

希望这有助于某人。

答案 5 :(得分:0)

在解决了这个问题几个小时之后,我建议您也尝试一下:

  1. 在使用捆绑包的视图的开始处添加此内容:

    @ {     BundleTable.EnableOptimizations = true; }

  2. 重置IIS

  3. 重新加载页面并检查缩小是否有效

在我的情况下,我的解决方案中的某个地方将“ BundleTable.EnableOptimizations”从true更改为false。当我在使用捆绑软件之前将其强制为TRUE时,就可以正常工作。

在我注意到它起作用后,我将其移到BundleConfig类的静态方法中:

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

所以我可以从视图中调用它,并将其最小化,以防止开发人员使用

@{
    BundleConfig.EnableOptimizations();
}

答案 6 :(得分:0)

<compilation debug="true" targetFramework="4.5.2" />

解决我的问题。 发布时,我的网络配置中缺少debug=true