ASP.NET MVC – 捆绑configuration顺序

我想在我的ASP.NET MVC 5应用程序中使用特定的区域(es-CL)。 我有以下几点:

  1. 将web.config文化和文化改为“es-CL”
  2. 安装了Globalize和jQuery.Validation.Globalize包
  3. 在我的意见中更改了默认语言: <html lang="es-cl">
  4. 创build了一个新的Bundle并包含在相应的视图中。

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

在适当的意见:

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

但是,生成的源代码如下所示:

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

请注意, jquery.validate.globalize.js脚本正在加载globalize.js之前,这不是我想要的。

为什么发生这种情况? 是否有可能依靠单一包中的包含顺序,还是我不得不把这个单独的脚本放在不同的包中,并在我的视图中指定它?

默认情况下,绑定顺序是按字母顺序排列的,通配符名称(如注释中指出的那样)。 不过,它也会根据它的依赖关系树来进行sorting,而且jQuery脚本似乎也被排在最前面。 您需要创build一个实现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的问题的答案提供了进一步深入了解stream行脚本库的默认sorting:

一个包中的文件sorting – 什么是已知的库?

在MVC 5的最后一个版本(2014年10月27日)中,您应该使用这个类:

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

并像其他响应一样创build包:

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

为了在创build包时减less代码 ,我build议你创build一个扩展方法。

需要基础设施类:

 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", ...);