Почему изменение заказа при использовании MVC bundleConfig.cs? [Дубликат]

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

72
задан Sparky 11 October 2013 в 17:55
поделиться

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);

ref: http://stevescodingblog.co.uk/changing-the-ordering-for-single-bundles-in-asp-net-4/

Для дальнейшего чтения ответ на вопрос MikeSmithDev дает дополнительную информацию о стандартном заказе для популярных библиотек скриптов:

Заказ файлов в комплекте - Что являются известными библиотеками?

84
ответ дан Community 18 August 2018 в 03:56
поделиться
  • 1
    Не для nitpick, но «по умолчанию, порядок связывания является алфавитным». это правда, когда вы используете такие вещи, как дикие карты ... когда вы указываете заказ, как и он, он должен использовать свой заказ. Я могу только предположить, что сборщик перемещается по известным типам файлов и игнорирует его порядок. – MikeSmithDev 11 October 2013 в 18:54
  • 2
    Похоже, что диспетчер также заказывает какую-то логику зависимостей. Он считает, что jquery.validate.globalize.js требуется для двух других. Из ссылки ref: «[Связчик] даже автоматически помещает известные файлы javascript в фреймворк сначала в комплекте, например, сценарии jQuery или Prototype, чтобы убедиться, что они запускаются до того, как ваш собственный код, который использует их типы, будет запущен & quot; – Mister Epic 11 October 2013 в 19:37
  • 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 19 February 2014 в 14:48
  • 4
    здесь программирование - это не весело. почему VS делает это сложным? – Jaider 8 November 2014 в 20:00
  • 5
    Тот факт, что это существует, дует мой разум с тем, насколько он глуп. На самом деле .. расслоение лучше знает, как упорядочить мои зависимости лучше, чем я их набрал? Gulp.js (или даже Grunt) FTW! – John Culviner 27 April 2016 в 01:59

Чтобы уменьшить коды во время создания пакетов, я предлагаю вам создать метод расширения.

Требовать классы инфраструктуры:

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;
    }
}

Теперь просто используйте его следующим образом:

Все в одной команде

16
ответ дан RAM 18 August 2018 в 03:56
поделиться

В последней версии 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);
27
ответ дан Sebastián Rojas 18 August 2018 в 03:56
поделиться
  • 1
    Где я могу найти эту информацию? Можете ли вы предоставить ссылку, пожалуйста? – PussInBoots 6 November 2014 в 15:07
  • 2
    Я просто пытаюсь использовать метод текущего ответа для этого вопроса, но я нашел свой selkf с ошибкой в ​​ASP.NET MVC 5, поэтому я проверяю интерфейс IBundleOrderer и вносил изменения – Sebastián Rojas 7 November 2014 в 16:52
  • 3
    Нет свойства Заказчика. Я использую MVC 5.2.x – Legends 18 June 2016 в 01:18
  • 4
    Я просто тестирую его с помощью MVC 5.2.3, а tehres - это свойство Orderer. – Sebastián Rojas 19 June 2016 в 19:11
Другие вопросы по тегам:

Похожие вопросы: