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",
                ...);