Próbuję użyć określonych ustawień regionalnych (es-CL) w mojej aplikacji ASP.NET MVC 5. Mam następujące rzeczy:
- Zmieniono kulturę i kulturę pliku web.config na „es-CL”
- Zainstalowano pakiety Globalize i jQuery.Validation.Globalize
- Zmieniono domyślny język w moich widokach:
<html lang="es-cl">
- Utworzono nowy pakiet i uwzględniono go w odpowiednich widokach.
W 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"));
W odpowiednich widokach:
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
@Scripts.Render("~/bundles/globalization")
}
Jednak wygenerowany kod źródłowy jest następujący:
<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>
Zwróć uwagę, że skrypt jquery.validate.globalize.js jest ładowany przed globalize.js , co nie jest tym, czego chcę.
Dlaczego to się dzieje? Czy można polegać na kolejności dołączania w pojedynczym pakiecie, czy też jestem zmuszony umieścić ten pojedynczy skrypt w innym pakiecie i określić go w moim widoku?
javascript
asp.net
asp.net-mvc
Leonardo Herrera
źródło
źródło
@section Scripts { @Scripts.Render("~/bundles/jqueryval") }
wydaje się, że rozwiązał problem z ładowaniem moich skryptówOdpowiedzi:
Domyślnie kolejność grupowania jest alfabetyczna dla nazw z symbolami wieloznacznymi (jak wskazano w komentarzach). Jednak porządkuje również na podstawie tego, co według niego jest twoje drzewo zależności, i
jQuery
skrypty wydają się być umieszczane na górze. Musisz stworzyć obiekt, który implementujeIBundleOrder
:class NonOrderingBundleOrderer : IBundleOrderer { public IEnumerable<FileInfo> OrderFiles(BundleContext context, IEnumerable<FileInfo> files) { return files; } }
Zapobiega to domyślnemu porządkowaniu. Teraz, aby go użyć:
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/
Aby uzyskać więcej informacji, odpowiedź na pytanie MikeSmithDev zapewnia dalszy wgląd w domyślną kolejność popularnych bibliotek skryptów:
Kolejność plików w pakiecie - jakie są znane biblioteki?
źródło
jquery.validate.globalize.js
jest to wymagane dla pozostałych dwóch. Z ref: „[Bundler] automatycznie umieści nawet znane pliki javascript frameworków jako pierwsze w pakiecie, takie jak skrypty jQuery lub Prototype, aby upewnić się, że zostaną uruchomione, zanim Twój własny kod wykorzystujący ich typy zostanie wykonany”W ostatniej wersji MVC 5 (27 października 2014 r.) Należy zamiast tego użyć tej klasy:
class AsIsBundleOrderer : IBundleOrderer { public IEnumerable<BundleFile> OrderFiles(BundleContext context, IEnumerable<BundleFile> files) { return files; } }
I utwórz pakiet jak inną odpowiedź:
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);
źródło
Aby zmniejszyć kody podczas tworzenia paczek, sugeruję utworzenie metody rozszerzającej.
Wymagaj klas infrastruktury:
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", //... );
źródło