85

我正在尝试在我的 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"));

在适当的视图中:

@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之前加载的,这不是我想要的。

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

4

3 回答 3

104

默认情况下,带有通配符的名称的捆绑顺序是按字母顺序排列的(如评论中所指出的)。但是,它也会根据它认为的依赖关系树进行排序,并且jQuery脚本似乎被排在了顶部。您需要创建一个实现的对象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);

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

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

捆绑中文件的排序 - 已知的库是什么?

于 2013-10-11T17:09:53.387 回答
31

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

class AsIsBundleOrderer : IBundleOrderer
{
    public IEnumerable<BundleFile> OrderFiles(BundleContext context, IEnumerable<BundleFile> 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 AsIsBundleOrderer();

bundles.Add(bundle);
于 2014-10-28T06:24:48.863 回答
30

为了减少创建bundle时的代码,我建议你创建一个扩展方法。

需要基础设施类:

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",
                    //...
                );
于 2016-08-03T10:32:04.217 回答