Я пытаюсь использовать конкретный языковой стандарт (es-CL) в своем приложении ASP.NET MVC 5. Имею следующее:
- Изменено uiculture и culture в 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 , а я не хочу.
Почему это происходит? Можно ли полагаться на порядок включения в одном пакете, или я вынужден поместить этот единственный скрипт в другой пакет и указать его в моем представлении?
javascript
asp.net
asp.net-mvc
Леонардо Эррера
источник
источник
@section Scripts { @Scripts.Render("~/bundles/jqueryval") }
похоже, решил проблему с загрузкой моих скриптов не по порядку ....Ответы:
По умолчанию, для имен с подстановочными знаками порядок объединения является алфавитным (как указано в комментариях). Однако он также упорядочивает на основе того, что, по его мнению, является вашим деревом зависимостей, и
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 дает более подробное представление о порядке по умолчанию для популярных библиотек сценариев:
Упорядочивание файлов в пакете - какие библиотеки известны?
источник
jquery.validate.globalize.js
это необходимо для двух других. Из ссылки: «[Сборщик] даже автоматически помещает известные файлы javascript фреймворка в пакет автоматически, такие как сценарии jQuery или Prototype, чтобы убедиться, что они выполняются до того, как будет выполнен ваш собственный код, использующий их типы»В последней версии 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", //... );
источник