簡體   English   中英

ASP.NET MVC-捆綁配置順序

[英]ASP.NET MVC - Bundle Config order

我正在嘗試在ASP.NET MVC 5應用程序中使用特定的語言環境(es-CL)。 我有以下內容:

  1. 將web.config uiculture和區域性更改為“ es-CL”
  2. 安裝了GlobalizejQuery.Validation.Globalize
  3. 更改了我視圖中的默認語言: <html lang="es-cl">
  4. 創建了一個新的捆綁包,並將其包含在適當的視圖中。

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之前加載的,這不是我想要的。

為什么會這樣呢? 是否可以依靠單個捆綁軟件中的包含順序,還是我被迫將此單個腳本放入另一個捆綁軟件中並在我的視圖中指定它?

默認情況下,帶通配符的名稱的綁定順序是字母順序的(如注釋中所指出)。 但是,它也根據它認為您的依賴關系樹的順序進行排序,並且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/changing-the-ordering-for-single-bundles-in-asp-net-4/

為了進一步閱讀,MikeSmithDev問題的答案可以進一步了解流行腳本庫的默認順序:

捆綁包中文件的排序-已知的庫是什么?

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

為了減少創建捆綁包期間的代碼 ,建議您創建一個擴展方法。

需要基礎設施類:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM