ASP.NET MVC - Конфигурация Bundle Config
Я пытаюсь использовать определенный язык (es-CL) в своем приложении ASP.NET MVC 5. У меня есть следующее:
- Изменено web.config uiculture и культура для "es-CL"
- Установлены пакеты Globalize и jQuery.Validation.Globalize
- Изменен язык по умолчанию в моих представлениях:
<html lang="es-cl">
- Создал новый Bundle и включил в соответствующие представления.
В BundleConfig.cs:
bundles.Add(new ScriptBundle("~/bundles/jqueryval")
.Include("~/Scripts/jquery.validate.js")
.Include("~/Scripts/jquery.validate.unobtrusive.js"));
bundles.Add(new ScriptBundle("~/bundles/globalization")
.Include("~/Scripts/globalize/globalize.js")
.Include("~/Scripts/globalize/cultures/globalize.culture.es-CL.js")
.Include("~/Scripts/jquery.validate.globalize.js"));
В соответствующих представлениях:
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
@Scripts.Render("~/bundles/globalization")
}
Однако сгенерированный исходный код следующий:
<script src="/Scripts/jquery.validate.js"></script>
<script src="/Scripts/jquery.validate.unobtrusive.js"></script>
<script src="/Scripts/jquery.validate.globalize.js"></script>
<script src="/Scripts/globalize/globalize.js"></script>
<script src="/Scripts/globalize/cultures/globalize.culture.es-CL.js"></script>
Обратите внимание, что jquery.validate.globalize.js script загружается до globalize.js, чего я не хочу.
Почему это происходит? Можно ли полагаться на включенный порядок в одном пакете, или мне пришлось поместить этот единственный script в другой пакет и указать его в моем представлении?
Ответы
Ответ 1
По умолчанию порядок связывания является алфавитным для имен с подстановочными знаками (как указано в комментариях). Тем не менее, он также заказывает, основываясь на том, что он думает о вашем дереве зависимостей, и jQuery
скрипты, похоже, попадают в верхнюю часть. Вам нужно создать объект, который реализует IBundleOrder
:
class NonOrderingBundleOrderer : IBundleOrderer
{
public IEnumerable<FileInfo> OrderFiles(BundleContext context, IEnumerable<FileInfo> files)
{
return files;
}
}
Это предотвращает порядок по умолчанию. Теперь его использовать:
var bundle = new ScriptBundle("~/bundles/globalization")
.Include("~/Scripts/globalize/globalize.js")
.Include("~/Scripts/globalize/cultures/globalize.culture.es-CL.js")
.Include("~/Scripts/jquery.validate.globalize.js");
bundle.Orderer = new NonOrderingBundleOrderer();
bundles.Add(bundle);
ref: http://stevescodingblog.co.uk/changing-the-ordering-for-single-bundles-in-asp-net-4/
Для дальнейшего чтения ответ на вопрос MikeSmithDev дает дополнительное представление о стандартном заказе для популярных библиотек script:
Заказ файлов в комплекте - Какие известные библиотеки?
Ответ 2
В последней версии MVC 5 (27 октября 2014 года) yo должен использовать этот класс вместо:
class AsIsBundleOrderer : IBundleOrderer
{
public IEnumerable<BundleFile> OrderFiles(BundleContext context, IEnumerable<BundleFile> files)
{
return files;
}
}
И создайте связку, как и другой ответ:
var bundle = new ScriptBundle("~/bundles/globalization")
.Include("~/Scripts/globalize/globalize.js")
.Include("~/Scripts/globalize/cultures/globalize.culture.es-CL.js")
.Include("~/Scripts/jquery.validate.globalize.js");
bundle.Orderer = new AsIsBundleOrderer();
bundles.Add(bundle);
Ответ 3
Чтобы уменьшить коды во время создания пакетов, я предлагаю вам создать метод расширения.
Требовать классы инфраструктуры:
class NonOrderingBundleOrderer : IBundleOrderer
{
public IEnumerable<BundleFile> OrderFiles(BundleContext context, IEnumerable<BundleFile> files)
{
return files;
}
}
static class BundleExtentions
{
public static Bundle NonOrdering(this Bundle bundle)
{
bundle.Orderer=new NonOrderingBundleOrderer();
return bundle;
}
}
Теперь просто используйте его так:
Все в одной команде 😎
bundles.Add(new ScriptBundle("~/bundles/jqueryval")
.NonOrdering().Include(
"~/Scripts/globalize/globalize.js",
"~/Scripts/globalize/cultures/globalize.culture.es-CL.js",
...);