ASP.NET MVC - Порядок налаштування пакета


84

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

  1. Змінено веб-сферу культури та культури на web.config на "es-CL"
  2. Встановив пакети Globalize та jQuery.Validation.Globalize
  3. Змінено мову за замовчуванням у моїх поданнях: <html lang="es-cl">
  4. Створив новий пакет і включив у відповідні подання.

У 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 , що я не хочу.

Чому це відбувається? Чи можна покластися на порядок включення в одному наборі, чи я змушений помістити цей єдиний сценарій в інший набір і вказати його на мій погляд?


1
Подивіться на це питання stackoverflow.com/questions/11979718 / ...
Пол McCowat

@PaulMcCowat так, але я ще не використовую мініфіковані версії. Я використовую Microsoft.AspNet.Web.Optimizations 1.1.0.
Леонардо Еррера

@LeonardoHerrera Я б вважав, що це подібно до того, як Кріс згадував у своїх коментарях, що відомі файли переміщуються до порядку, визначеного пакетом ... але я не можу бути впевненим, оскільки я не знаю, що це за файли, що призвело мене запитати . Мені буде цікаво дізнатись, чи працює IBundleOrderer для вас, оскільки вказівка ​​замовлення не відповідає.
MikeSmithDev

подивіться на відповідь @Softlion у [це посилання] [1] [1]: stackoverflow.com/questions/11979718/…
Omid-RH

@section Scripts { @Scripts.Render("~/bundles/jqueryval") }схоже, вирішив проблему із завантаженням моїх скриптів не в порядку ....
petrosmm

Відповіді:


103

За замовчуванням порядок групування є алфавітним для імен із символами підстановки (як зазначено в коментарях). Однак він також замовляє на основі того, що, на його думку, є вашим деревом залежностей, і 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 надає подальше розуміння порядку замовлення за замовчуванням для популярних бібліотек сценаріїв:

Впорядкування файлів у пакеті - Які відомі бібліотеки?


Не для nitpick, але "за замовчуванням порядок об'єднання в алфавітному порядку" відповідає дійсності, коли ви використовуєте такі речі, як підстановочні картки ... коли ви вказуєте порядок, як він, він повинен використовувати його замовлення. Я можу лише припустити, що пакувач рухається навколо відомих типів файлів і ігнорує його замовлення.
MikeSmithDev

Схоже, пакувальник також замовляє, використовуючи певну логіку щодо залежностей. Він вважає, що jquery.validate.globalize.jsце потрібно для двох інших. З посилання: "[Пакувальник] навіть автоматично розміщує відомі фреймворкові файли javascript на першому місці в наборі, такі як скрипти jQuery або Prototype, щоб переконатися, що вони працюють до того, як буде виконано ваш власний код, який використовує їх типи"
Mister Epic

3
Конкретний порядок: jquery.js jquery-min.js jquery- * jquery-ui * jquery.ui * jquery.unobtrusive * jquery.validate * modernizr- * dojo. * Mootools-core * mootools- * prototype.js prototype- * scriptaculous- * ext.js ext- *
ravndal

6
ось тут програмування не приносить задоволення. чому VS ускладнює це?
Джайдер

5
Той факт, що це існує, вражає мене тим, наскільки це глупо. Дійсно .. пакувальник знає краще, як упорядкувати свої залежності краще, ніж я їх набрав? Gulp.js (або навіть Grunt) FTW!
Джон Калвінер,

30

В останній версії 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);

Де я можу знайти цю інформацію? Ви можете надати посилання, будь ласка?
PussInBoots

Я просто намагаюся використати метод поточної відповіді на це запитання, але я виявив свій selkf з помилкою в ASP.NET MVC 5, тому перевірив інтерфейс IBundleOrderer і вніс зміни
Себастьян Рохас

Немає власності замовника. Я використовую MVC 5.2.x
Legends

1
Я просто перевіряю це за допомогою MVC 5.2.3, і це є власністю Замовників.
Себастьян Рохас,

28

Щоб зменшити коди під час створення пакетів, пропоную створити метод розширення.

Потрібні класи інфраструктури:

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

1
Хороший спосіб мислення!
Аруна,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.