ASP.NET MVC - Bundle Config命令

Leo*_*era 78 javascript asp.net asp.net-mvc

我正在尝试在我的ASP.NET MVC 5应用程序中使用特定的语言环境(es-CL).我有以下几点:

  1. 将web.config uiculture和culture更改为"es-CL"
  2. 安装了GlobalizejQuery.Validation.Globalize
  3. 更改了我的视图中的默认语言: <html lang="es-cl">
  4. 创建了一个新的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"));
Run Code Online (Sandbox Code Playgroud)

在适当的观点:

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
    @Scripts.Render("~/bundles/globalization")
}
Run Code Online (Sandbox Code Playgroud)

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

<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>
Run Code Online (Sandbox Code Playgroud)

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

为什么会这样?是否可以在单个包中依赖包含顺序,或者我是否被迫将此单个脚本放在不同的包中并在我的视图中指定它?

Mis*_*pic 98

默认情况下,对于带有通配符的名称,捆绑顺序是按字母顺序排列的(如注释中所述).但是,它也会根据它认为你的依赖树的顺序进行排序,并且jQuery脚本似乎可以插入到顶部.您需要创建一个实现的对象IBundleOrder:

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

这可以防止默认排序.现在使用它:

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);
Run Code Online (Sandbox Code Playgroud)

参考:http://stevescodingblog.co.uk/changing-the-ordering-for-single-bundles-in-asp-net-4/

为了进一步阅读,MikeSmithDev的问题的答案提供了对流行脚本库的默认排序的进一步了解:

对包中的文件进行排序 - 已知的库是什么?

  • 这里编程并不好玩.为什么VS让这个变得复杂? (6认同)
  • 这存在的事实让我大吃一惊是多么愚蠢.真的..捆绑者知道如何更好地订购我的依赖关系比我输入它们更好?Gulp.js(甚至Grunt)FTW! (4认同)
  • 特定顺序是:jquery.js jquery-min.js jquery-*jquery-ui*jquery.ui*jquery.unobtrusive*jquery.validate*modernizr-*dojo.*mootools-core*mootools-*prototype.js prototype-*scriptaculous-*ext.js ext-* (3认同)

Seb*_*jas 30

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

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

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

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);
Run Code Online (Sandbox Code Playgroud)


RAM*_*RAM 25

要在创建包期间减少代码,我建议您创建一个扩展方法.

需要基础架构类:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在只需使用它:

一体化命令

bundles.Add(new ScriptBundle("~/bundles/jqueryval")
               .NonOrdering()
               .Include(
                    "~/Scripts/globalize/globalize.js",
                    "~/Scripts/globalize/cultures/globalize.culture.es-CL.js",
                    //...
                );
Run Code Online (Sandbox Code Playgroud)