web-dev-qa-db-ja.com

ASP.NET MVC-バンドル構成の順序

ASP.NET MVC 5アプリケーションで特定のロケール(es-CL)を使用しようとしています。私は次を持っています:

  1. Web.config uicultureおよびcultureを「es-CL」に変更しました
  2. Globalize および jQuery.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、これは私が望むものではありません。

なぜこうなった?単一のバンドルでインクルード順序に依存することは可能ですか、それともこの単一のスクリプトを別のバンドルに入れて、ビューで指定する必要がありますか?

78

デフォルトでは、ワイルドカードを使用した名前のバンドリング順はアルファベット順です(コメントで指摘されているとおり)。ただし、依存関係ツリーの考えに基づいて順序付けされ、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の質問への回答は、一般的なスクリプトライブラリのデフォルトの順序についてのさらなる洞察を提供します。

バンドル内のファイルの順序-既知のライブラリは何ですか?

97
Mister Epic

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

バンドルの作成中にコードを減らすにするには、拡張メソッドを作成することをお勧めします。

インフラストラクチャクラスが必要です。

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

これを次のように使用します:

1つのコマンドですべて????

bundles.Add(new ScriptBundle("~/bundles/jqueryval")
               .NonOrdering()
               .Include(
                    "~/Scripts/globalize/globalize.js",
                    "~/Scripts/globalize/cultures/globalize.culture.es-CL.js",
                    //...
                );
24
RAM