Ответ 1
Это поведение по умолчанию.
Пакетирование и минимизация включаются или отключаются путем установки значения атрибута debug в элементе компиляции в файле Web.config.
http://www.asp.net/mvc/overview/performance/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"/>
EDIT:
Несколько человек упомянули, что добавление следующего кода в мой файл BundleConfig.cs приведет к следующему:
#if DEBUG
BundleTable.EnableOptimizations = false;
#else
BundleTable.EnableOptimizations = true;
#endif
Я понимаю и ценю этот ответ, однако, согласно документации, поведение пакета MVC по умолчанию заключается в том, чтобы связывать в режиме деблокирования, но не в режиме отладки. Я не понимаю, почему мне нужно добавить дополнительный код, чтобы он делал это, когда он уже делал это.
ИЗМЕНИТЬ 2
У меня есть признание. Оказывается, у меня появился файл web.config из папки Views, а не основной web.config. Я изменил настройку в главном web.config, и это отлично работает для меня. Я обвиняю ReSharper
Это поведение по умолчанию.
Пакетирование и минимизация включаются или отключаются путем установки значения атрибута debug в элементе компиляции в файле Web.config.
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 по умолчанию удаляет атрибут отладки следующим образом:
<compilation xdt:Transform="RemoveAttributes(debug)" />
Однако это не приведет к возникновению ожидаемого поведения связывания. Вместо этого вы должны создать преобразование, которое буквально устанавливает атрибут отладки как "false", например:
<compilation debug="false" xdt:Transform="SetAttributes" />
Другая возможная проблема заключается в том, что внутри вашего файла 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);
}
}
У меня была эта проблема, когда я изменил папку 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, ни что-либо еще.
Надеюсь, это кому-нибудь поможет.
После нескольких часов борьбы с этой проблемой, я рекомендую попробовать и это:
Добавьте это в самом начале представления, которое вы используете в вашем комплекте:
@{BundleTable.EnableOptimizations = true; } }
Сброс IIS
В моем случае где-то в моем решении менялось "BundleTable.EnableOptimizations" с true на false. Когда я заставляю это ИСТИНА прямо перед использованием пакета, я получаю это работает.
После того, как я заметил, что это работает, я переместил это в статический метод в своем классе BundleConfig:
public static void EnableOptimizations()
{
#if DEBUG
BundleTable.EnableOptimizations = false;
#else
BundleTable.EnableOptimizations = true;
#endif
}
Так что я могу вызвать его из представления и отключить минификацию для разработчиков
@{
BundleConfig.EnableOptimizations();
}
<compilation debug="true" targetFramework="4.5.2" />
решить мою проблему. debug=true
отсутствовал в моей веб-конфигурации при публикации.