Объединение не работает в 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 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"/>

EDIT:

Несколько человек упомянули, что добавление следующего кода в мой файл BundleConfig.cs приведет к следующему:

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

Я понимаю и ценю этот ответ, однако, согласно документации, поведение пакета MVC по умолчанию заключается в том, чтобы связывать в режиме деблокирования, но не в режиме отладки. Я не понимаю, почему мне нужно добавить дополнительный код, чтобы он делал это, когда он уже делал это.

ИЗМЕНИТЬ 2

У меня есть признание. Оказывается, у меня появился файл web.config из папки Views, а не основной web.config. Я изменил настройку в главном web.config, и это отлично работает для меня. Я обвиняю ReSharper

Ответы

Ответ 1

Это поведение по умолчанию.

Пакетирование и минимизация включаются или отключаются путем установки значения атрибута debug в элементе компиляции в файле Web.config.

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

enter image description here

Ответ 2

Способ, которым я обходился, - заставить его в BundleConfig делать именно то, что я хочу, чтобы он делал. Я не думаю, что у MVC4 были такие же параметры с конфигурационным файлом (или я просто не заставил их работать).

Итак, это то, что у меня есть в конце моего метода RegisterBundles:

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

Таким образом, это всегда есть, просто посмотреть. Тем не менее, вы должны помнить о том, чтобы положить это там, когда вы запускаете проект, но это не огромная сделка.

Если вы не знакомы с ними, #if DEBUG представляет собой директивы препроцессора, которые сообщают CLR, что делать в этом блоке когда присутствует параметр сборки DEBUG (он должен присутствовать только в режиме DEBUG, хотя это можно изменить из свойств проекта). Если эта переменная отсутствует (режим деблокирования или любой другой режим), тогда он будет выполнять другой блок.

Ответ 3

Преобразование Release Web.config по умолчанию удаляет атрибут отладки следующим образом:

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

Однако это не приведет к возникновению ожидаемого поведения связывания. Вместо этого вы должны создать преобразование, которое буквально устанавливает атрибут отладки как "false", например:

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

Ответ 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);

    }
}

Ответ 5

У меня была эта проблема, когда я изменил папку css. Моя проблема заключалась в том, что я изменил файл BundleConfig для файлов CSS:

BundleConfig.cs:

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

Просмотры включены:

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

По какой-то причине это не сработало. "связки", кажется, ключевое слово или что-то (не уверен). Вы должны оставить это так:

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

Просмотры:

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

У меня нет необходимости изменять "BundleTable.EnableOptimizations", ни web.config, ни что-либо еще.

Надеюсь, это кому-нибудь поможет.

Ответ 6

После нескольких часов борьбы с этой проблемой, я рекомендую попробовать и это:

  1. Добавьте это в самом начале представления, которое вы используете в вашем комплекте:

    @{BundleTable.EnableOptimizations = true; } }

  2. Сброс IIS

  3. Перезагрузите страницу и проверьте, работает ли minify

В моем случае где-то в моем решении менялось "BundleTable.EnableOptimizations" с true на false. Когда я заставляю это ИСТИНА прямо перед использованием пакета, я получаю это работает.

После того, как я заметил, что это работает, я переместил это в статический метод в своем классе BundleConfig:

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

Так что я могу вызвать его из представления и отключить минификацию для разработчиков

@{
    BundleConfig.EnableOptimizations();
}

Ответ 7

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

решить мою проблему. debug=true отсутствовал в моей веб-конфигурации при публикации.