ASP.NET MVC - Порядок настройки комплекта

Я пытаюсь использовать конкретную локаль (es-CL) в моем приложении ASP.NET MVC 5. У меня есть следующее:

  1. Изменил web.config в области сельского хозяйства и культуры на "es-CL"
  2. Установлены пакеты Globalize и jQuery.Validation.Globalize.
  3. Изменен язык по умолчанию в моих представлениях: <html lang="es-cl">
  4. Создан новый 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",
                ...);
Другие вопросы по тегам