21

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

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

この件に関する情報が見つかりません。私たちの考えが高く評価されている助け。

4

2 に答える 2

36

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

私がやろうと決めたことは次のとおりです。

ソリューション構造

  • エリア:
    • 管理者
      • 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);            
    }       
}
于 2012-11-12T10:58:54.163 に答える
24

あなたの質問は、各領域に個別のスクリプトと css フォルダーがあることを意味しますか? これは型破りです (完全にもっともらしいですが)。それとも、ルート レベルに 1 つのスクリプト フォルダーがあり、それを各エリアのサブ フォルダーに分割しているでしょうか? いずれにせよ、エリア固有のバンドルを取得するには、わずかに異なることを行う必要があります。

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

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

まず、このグローバルBundleConfigを使用して、すべてのエリアのバンドルを指定します。これがスケールしない場合や扱いにくい場合は、後でいつでも解決できます。

含めるファイルを指定します。バンドルの仮想パスの前に、その対象のエリアを付ける必要があります。そうすれば、ビューからエリア名を使用して参照するのが簡単になります_Layout.cshtml

たとえば、ここではそれぞれ異なるスクリプトを持つ 2 つの Areas があります: UserGroupです。

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

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

ビュー/共有/_Layout.cshtml:

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

編集

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

エリア/テスト/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"));
    }
于 2012-11-11T22:37:43.403 に答える