ASP.NET MVC - Порядок настройки комплекта
Я пытаюсь использовать конкретную локаль (es-CL) в моем приложении ASP.NET MVC 5. У меня есть следующее:
- Изменил web.config в области сельского хозяйства и культуры на "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 загружается до globalize.js, а это не то, что мне нужно.
Почему это происходит? Можно ли полагаться на порядок включения в одном пакете, или я вынужден поместить этот единственный скрипт в другой пакет и указать его на мой взгляд?
3 ответа
По умолчанию порядок связывания является алфавитным для имен с подстановочными знаками (как указано в комментариях). Тем не менее, он также упорядочивает на основе того, что он думает, ваше дерево зависимостей, и 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);
ссылка: http://stevescodingblog.co.uk/changing-the-ordering-for-single-bundles-in-asp-net-4/
Для дальнейшего чтения ответ на вопрос MikeSmithDev дает дополнительное понимание порядка по умолчанию для популярных библиотек сценариев:
В последней версии MVC 5 (27 октября 2014 года) вам следует использовать этот класс:
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);
Чтобы уменьшить количество кодов при создании пакетов, я предлагаю вам создать метод расширения.
Требуются классы инфраструктуры:
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",
...);