Estoy tratando de usar una configuración regional específica (es-CL) en mi aplicación ASP.NET MVC 5. Tengo lo siguiente:
- Se cambió web.config uicultura y cultura a "es-CL"
- Instaló los paquetes Globalize y jQuery.Validation.Globalize
- Cambié el idioma predeterminado en mis vistas:
<html lang="es-cl">
- Se creó un nuevo paquete y se incluyó en las vistas correspondientes.
En 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"));
En las vistas apropiadas:
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
@Scripts.Render("~/bundles/globalization")
}
Sin embargo, el código fuente generado es el siguiente:
<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>
Tenga en cuenta que el script jquery.validate.globalize.js se está cargando antes de globalize.js , que no es lo que quiero.
¿Por qué está pasando esto? ¿Es posible confiar en el orden de inclusión en un solo paquete, o me veo obligado a poner este único script en un paquete diferente y especificarlo en mi vista?
javascript
asp.net
asp.net-mvc
Leonardo Herrera
fuente
fuente
@section Scripts { @Scripts.Render("~/bundles/jqueryval") }
parece haber resuelto el problema de la carga de mis scripts fuera de orden ....Respuestas:
De forma predeterminada, el orden de agrupación es alfabético para los nombres con comodines (como se indica en los comentarios). Sin embargo, también ordena en función de lo que cree que es su árbol de dependencia, y los
jQuery
scripts parecen colocarse en la parte superior. Necesita crear un objeto que implementeIBundleOrder
:class NonOrderingBundleOrderer : IBundleOrderer { public IEnumerable<FileInfo> OrderFiles(BundleContext context, IEnumerable<FileInfo> files) { return files; } }
Esto evita el pedido predeterminado. Ahora para usarlo:
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/
Para leer más, una respuesta a la pregunta de MikeSmithDev proporciona más información sobre el orden predeterminado para las bibliotecas de scripts populares:
Ordenar archivos dentro de un paquete: ¿Cuáles son las bibliotecas conocidas?
fuente
jquery.validate.globalize.js
es necesario para los otros dos. De la referencia: "[El empaquetador] incluso pondrá archivos javascript de framework conocidos primero en el paquete automáticamente, como jQuery o scripts de Prototype, para asegurarse de que se ejecuten antes de que se ejecute su propio código que usa sus tipos"En la última versión de MVC 5 (al 27 de octubre de 2014), debería usar esta clase en su lugar:
class AsIsBundleOrderer : IBundleOrderer { public IEnumerable<BundleFile> OrderFiles(BundleContext context, IEnumerable<BundleFile> files) { return files; } }
Y crea el paquete como la otra respuesta:
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);
fuente
Para reducir los códigos durante la creación de paquetes, le sugiero que cree un método de extensión.
Requerir clases de infraestructura:
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", //... );
fuente