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


84

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の前にロードされていることに注意してください。これは、私が望んでいることではありません。

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



@PaulMcCowatはい、しかし私はまだ縮小版を使用していません。Microsoft.AspNet.Web.Optimizations1.1.0を使用しています。
レオナルドエレーラ

@LeonardoHerrera私はバンドラで指定された既知のファイルを順に動き回るされていることを、クリスは彼のコメントで述べたように、それはあると思うだろう...しかし、私はその、それらのファイルがあるかわからないので、確認することはできません主導します私に聞いてください。注文を指定しても機能しなかったため、IBundleOrdererの使用が機能するかどうかを知りたいと思います。
MikeSmithDev 2013年

[このリンク] [1] [1]の@Softlionの回答をご覧ください:stackoverflow.com/questions/11979718/…–
Omid-RH

@section Scripts { @Scripts.Render("~/bundles/jqueryval") }私のスクリプトの問題が故障してロードを解決しているように見えます....
petrosmm

回答:


103

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

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


ちっぽけなことではありませんが、ワイルドカードのようなものを使用する場合、「デフォルトでは、バンドルの順序はアルファベット順です」が当てはまります...彼のように順序を指定するときは、彼の順序を使用する必要があります。私は、バンドラーが既知のファイルタイプを移動していて、彼の順序を無視していると推測することしかできません。
MikeSmithDev 2013年

バンドラーも依存関係に関するロジックを使用して注文しているようです。それはjquery.validate.globalize.js他の2つに必要だと思います。参考文献から:「[バンドラー]は、jQueryやプロトタイプスクリプトなどの既知のフレームワークjavascriptファイルをバンドルの最初に自動的に配置し、それらのタイプを使用する独自のコードが実行される前に実行されるようにします」
Mister Epic

3
具体的な順序は次のとおりです。jquery.jsjquery-min.jsjquery-* jquery-ui * jquery.ui * jquery.unobtrusive * jquery.validate * modernizr- * dojo。* mootools-core * mootools- * prototype.jsprototype- * scriptaculous- * ext.js ext- *
ravndal 2014

6
ここがプログラミングが面白くないところです。なぜVSはこれを複雑にするのですか?
Jaider 2014年

5
これが存在するという事実は、それがどれほど愚かであるかについて私の心を吹き飛ばします。本当に..バンドラーは、私が入力したよりも、依存関係をより適切に順序付ける方法をよく知っていますか?Gulp.js(またはGrunt)FTW!
John Culviner 2016

30

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

この情報はどこにありますか?リンクを教えていただけますか?
PussInBoots 2014年

私はこの質問の現在の応答の方法を使用しようが、私はIBundleOrdererインターフェースをチェックして、変更を行ったので、私は、ASP.NET MVC 5でエラーで私のselkfを見つけた
セバスティアン・ロハス

Ordererプロパティはありません。私はMVC5.2.xを使用しています
Legends

1
MVC 5.2.3でテストしたところ、tehresはOrdererプロパティです。
セバスティアン・ロハス

28

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

インフラストラクチャクラスが必要:

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

1
いい考え方!
アルナ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.