web-dev-qa-db-fra.com

ASP.NET MVC - Ordre de configuration des ensembles

J'essaie d'utiliser des paramètres régionaux spécifiques (es-CL) dans mon application ASP.NET MVC 5. J'ai le suivant:

  1. Web.config uiculture et culture remplacés par "es-CL"
  2. Installé les packages Globalize et jQuery.Validation.Globalize
  3. Changement de la langue par défaut dans mes vues: <html lang="es-cl">
  4. Créé un nouvel ensemble et inclus dans les vues appropriées.

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

Dans les vues appropriées:

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

Cependant, le code source généré est le suivant:

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

Veuillez noter que le script jquery.validate.globalize.js est chargé avant globalize.js , ce qui n'est pas ce que je veux.

Pourquoi cela arrive-t-il? Est-il possible d'inclure l'ordre d'inclusion dans un seul lot ou suis-je obligé de placer ce script unique dans un autre paquet et de le spécifier à mon avis?

78
Leonardo Herrera

Par défaut, l'ordre de regroupement est alphabétique pour les noms avec des caractères génériques (comme indiqué dans les commentaires). Cependant, il ordonne également en fonction de ce qu’il pense de votre arbre de dépendance, et les scripts jQuery semblent être placés en haut. Vous devez créer un objet qui implémente IBundleOrder:

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

Cela empêche la commande par défaut. Maintenant pour l'utiliser:

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/

Pour en savoir plus, une réponse à la question de MikeSmithDev permet de mieux comprendre le classement par défaut des bibliothèques de scripts populaires:

Commande de fichiers dans un paquet - Quelles sont les bibliothèques connues?

97
Mister Epic

Dans la dernière version de MVC 5 (au 27 octobre 2014), vous devriez plutôt utiliser cette classe:

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

Et créez le paquet comme l’autre réponse:

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);
30
Sebastián Rojas

Pour réduire les codes lors de la création d'ensembles, je vous suggère de créer une méthode d'extension.

Exiger des classes d'infrastructure:

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

Maintenant, utilisez-le simplement comme ceci:

commande tout en un ????

bundles.Add(new ScriptBundle("~/bundles/jqueryval")
               .NonOrdering()
               .Include(
                    "~/Scripts/globalize/globalize.js",
                    "~/Scripts/globalize/cultures/globalize.culture.es-CL.js",
                    //...
                );
24
RAM