web-dev-qa-db-ja.com

ASP.NET MVCエリアのリソースをバンドルする方法は?

Asp.net mvcエリアのリソースバンドリングをどのように行いますか?これは、ルートのAreaRegistrationと同様にASP.NET MVCフレームワークによって規制されていますか?

エリア内にBundleConfigクラスを作成し、これをApp_Startフォルダー内のグローバルBundleConfigから呼び出すことができますが、これは気分がよくありません。

この件に関する情報は見つかりません。どんな助けでも私たちの考えはありがたいです。

21
Martijn B

これがどうにか規制されることを望んでいました-しかし、フレームワークのコードに飛び込んだ後、これに対する答えは否定的です。

私がやろうと決めたのは、

ソリューション構造

  • エリア:
    • 管理者
      • RouteConfig.cs
      • BundleConfig.cs
      • AdminAreaRegistration.cs

RouteConfig.cs

internal static class RouteConfig
{
    internal static void RegisterRoutes(AreaRegistrationContext context)
    {
        //add routes
    }
}

BundleConfig.cs

internal static class BundleConfig
{
    internal static void RegisterBundles(BundleCollection bundles)
    {           
        //add bundles
    }
}

AdminAreaRegistration.cs

public class AdminAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "Admin";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        RegisterRoutes(context);
        RegisterBundles();
    }

    private void RegisterRoutes(AreaRegistrationContext context)
    {
        RouteConfig.RegisterRoutes(context);
    }

    private void RegisterBundles()
    {
        BundleConfig.RegisterBundles(BundleTable.Bundles);            
    }       
}
35
Martijn B

あなたの質問は、エリアごとに別々のスクリプトとCSSフォルダがあることを意味していますか?これは型にはまらない(完全にもっともらしい)。または、ルートレベルに単一のスクリプトフォルダーがあり、それを各エリアのサブフォルダーに分割している場合はどうでしょうか。どちらの方法でも、エリア固有のバンドルを取得するには、わずかに異なることを行う必要があります。

MVC4アプリケーションには、App_Startフォルダーにある静的BundleConfigクラスが付属しています。その後、バンドルはGlobal.asaxから初期化されます。 MVC4プロジェクトを使用していない場合は、アップグレードするか、すぐに使用可能なMVC4プロジェクトを開始して、これらのファイルのレイアウトを確認してください。

バンドルは、(バンドルを参照できる)仮想パスを宣言し、バンドルするファイルを指定するだけで構成されます。バンドルするファイルを指定するには、ファイル名を明示的にリストするか、ファイル名の文字を一致させるか、すべてのファイルを含めるディレクトリを指定します。

まず、このグローバルBundleConfigを使用して、すべてのエリアのバンドルを指定します。これがうまくいかなかったり、扱いにくくなった場合は、いつでも後で中断できます。

含めるファイルを指定します。バンドルの仮想パスには、対象となるエリアをプレフィックスする必要があります。そうすれば、ビューからエリア名を使用して簡単に参照できます。おそらく__Layout.cshtml_です。

たとえば、ここにはそれぞれ異なるスクリプトを持つ2つの領域があります:serおよびGroup

App_Start/BundleConfig.cs

_public class BundleConfig
{
    public static void RegisterBundles(BundleCollection bundles)
    {
        /// Bundle For User Area
        bundles.Add(new ScriptBundle("~/user/bundles/scripts").Include(
                    "~/Scripts/User/myuserscript1.js",
                    "~/Scripts/User/myuserscript2.js"));

        /// Bundle For Group Area
        bundles.Add(new ScriptBundle("~/group/bundles/scripts").Include(
                    "~/Scripts/Group/mygroupscript1.js",
                    "~/Scripts/Group/mygroupscript2.js"));
    }
}
_

次に、メインの_Layout.cshtmlでScripts.Render()を使用して、ユーザーが現在表示しているエリアに応じて、正しいエリアバンドルをレンダリングできます。これを行うには、まず現在のエリアを次のように取得する必要があります。

Views/Shared/_Layout.cshtml:

_<head>
    @{
        var currentArea = (ViewContext.RouteData.DataTokens["area"]
                              ?? String.Empty).ToString().ToLower();
    }
    @Scripts.Render("~/" + currentArea + "/bundles/scripts")
</head>
_

編集する

バンドルをエリア内から管理したい場合は、エリア登録が適しています。 BundleConfigで参照されるBundleTable静的プロパティはグローバルなので、どこからでも参照できます。このコードはコンパイルされますが、テストしていません。それはテストと呼ばれるエリア用です:

Areas/Test/TestAreaRegistration.cs

_    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Test_default",
            "Test/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
        );

        BundleTable.Bundles.Add(new Bundle("~/test/bundles/scripts").Include(
                    "~/Areas/Test/Scripts/jquery.js"));
    }
_
23
Nick