ASP.NET MVC – 捆绑configuration顺序
我想在我的ASP.NET MVC 5应用程序中使用特定的区域(es-CL)。 我有以下几点:
- 将web.config文化和文化改为“es-CL”
- 安装了Globalize和jQuery.Validation.Globalize包
- 在我的意见中更改了默认语言:
<html lang="es-cl">
- 创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", ...);