ASP.NET MVC - Bundle-Konfigurationsreihenfolge

83

Ich versuche, ein bestimmtes Gebietsschema (es-CL) in meiner ASP.NET MVC 5-Anwendung zu verwenden. Ich habe folgendes:

  1. Die Kultur und Kultur von web.config wurde in "es-CL" geändert.
  2. Installierte die Pakete Globalize und jQuery.Validation.Globalize
  3. Die Standardsprache in meinen Ansichten wurde geändert: <html lang="es-cl">
  4. Erstellt ein neues Bundle und wird in die entsprechenden Ansichten aufgenommen.

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

In den entsprechenden Ansichten:

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
    @Scripts.Render("~/bundles/globalization")
}

Der generierte Quellcode lautet jedoch wie folgt:

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

Bitte beachten Sie, dass das Skript jquery.validate.globalize.js vor globalize.js geladen wird, was ich nicht möchte.

Warum passiert das? Ist es möglich, sich auf die Include-Reihenfolge in einem einzelnen Bundle zu verlassen, oder bin ich gezwungen, dieses einzelne Skript in ein anderes Bundle zu stellen und es meiner Ansicht nach anzugeben?

Leonardo Herrera
quelle
1
Werfen
Paul McCowat
@PaulMcCowat ja, aber ich verwende die minimierten Versionen noch nicht. Ich verwende Microsoft.AspNet.Web.Optimizations 1.1.0.
Leonardo Herrera
@LeonardoHerrera Ich würde denken, es ist wie Chris in seinen Kommentaren erwähnt, dass bekannte Dateien in eine vom Bundler angegebene Reihenfolge verschoben werden ... aber ich kann nicht sicher sein, da ich nicht weiß, was diese Dateien sind, was dazu geführt hat mich zu fragen . Es würde mich interessieren, ob die Verwendung des IBundleOrderer für Sie funktioniert, da die Angabe der Bestellung nicht funktioniert hat.
MikeSmithDev
Schauen Sie sich die Antwort von @Softlion in [diesem Link] [1] [1] an: stackoverflow.com/questions/11979718/…
Omid-RH
@section Scripts { @Scripts.Render("~/bundles/jqueryval") }scheint das Problem behoben zu haben, dass meine Skripte nicht in der
richtigen

Antworten:

102

Standardmäßig ist die Bündelungsreihenfolge für Namen mit Platzhaltern alphabetisch (wie in den Kommentaren angegeben). Die Reihenfolge basiert jedoch auch darauf, was Ihrer Meinung nach Ihr Abhängigkeitsbaum ist, und jQuerySkripte scheinen nach oben verschoben zu werden. Sie müssen ein Objekt erstellen, das Folgendes implementiert IBundleOrder:

class NonOrderingBundleOrderer : IBundleOrderer
{
    public IEnumerable<FileInfo> OrderFiles(BundleContext context, IEnumerable<FileInfo> files)
    {
        return files;
    }
}

Dies verhindert die Standardbestellung. Nun, um es zu benutzen:

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/

Zur weiteren Lektüre bietet eine Antwort auf die Frage von MikeSmithDev weitere Einblicke in die Standardreihenfolge für beliebte Skriptbibliotheken:

Reihenfolge der Dateien innerhalb eines Bundles - Welche Bibliotheken sind bekannt?

Mister Epic
quelle
Nicht zu picken, aber "Standardmäßig ist die Bündelungsreihenfolge alphabetisch" ist wahr, wenn Sie Dinge wie Platzhalter verwenden ... Wenn Sie die Reihenfolge angeben, wie er es getan hat, sollte es seine Reihenfolge verwenden. Ich kann nur annehmen, dass sich der Bundler um bekannte Dateitypen bewegt und seine Reihenfolge ignoriert.
MikeSmithDev
Es sieht so aus, als würde der Bundler auch mit einer Logik über Abhängigkeiten bestellen. Es glaubt, dass jquery.validate.globalize.jsdies für die beiden anderen erforderlich ist. Aus dem Verweis: "[Der Bundler] wird sogar bekannte Framework-Javascript-Dateien automatisch in das Bundle einfügen, z. B. jQuery- oder Prototype-Skripte, um sicherzustellen, dass sie ausgeführt werden, bevor Ihr eigener Code, der ihre Typen verwendet, ausgeführt wird"
Mister Epic,
3
Die spezifische Reihenfolge lautet: 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
Hier macht Programmieren keinen Spaß. Warum macht VS das kompliziert?
Jaider
5
Die Tatsache, dass dies existiert, beeindruckt mich, wie dumm es ist. Wirklich ... der Bundler weiß besser, wie er meine Abhängigkeiten besser ordnen kann, als ich sie eingegeben habe? Gulp.js (oder sogar Grunt) FTW!
John Culviner
30

In der letzten Version von MVC 5 (am 27. Oktober 2014) sollten Sie stattdessen diese Klasse verwenden:

class AsIsBundleOrderer : IBundleOrderer
{
    public IEnumerable<BundleFile> OrderFiles(BundleContext context, IEnumerable<BundleFile> files)
    {
        return files;
    }
}

Und erstellen Sie das Bundle wie die andere Antwort:

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);
Sebastián Rojas
quelle
Wo finde ich diese Informationen? Können Sie bitte einen Link angeben?
PussInBoots
Ich versuche nur, die Methode der aktuellen Antwort für diese Frage zu verwenden, aber ich habe mein selkf mit einem Fehler in ASP.NET MVC 5 gefunden, also überprüfe ich die IBundleOrderer-Oberfläche und nehme die Änderungen vor
Sebastián Rojas
Es gibt keine Orderer-Eigenschaft. Ich benutze MVC 5.2.x
Legends
1
Ich teste es gerade mit MVC 5.2.3 und tehres ist die Orderer-Eigenschaft.
Sebastián Rojas
28

Um die Codes beim Erstellen von Bundles zu reduzieren , empfehle ich Ihnen, eine Erweiterungsmethode zu erstellen.

Infrastrukturklassen erforderlich:

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

Verwenden Sie es jetzt einfach so:

Alles in einem Befehl 😎

bundles.Add(new ScriptBundle("~/bundles/jqueryval")
               .NonOrdering()
               .Include(
                    "~/Scripts/globalize/globalize.js",
                    "~/Scripts/globalize/cultures/globalize.culture.es-CL.js",
                    //...
                );
RAM
quelle
1
Schöne Denkweise!
Aruna