Asp.net mvcエリアのリソースバンドリングをどのように行いますか?これは、ルートのAreaRegistration
と同様にASP.NET MVCフレームワークによって規制されていますか?
エリア内にBundleConfig
クラスを作成し、これをApp_Start
フォルダー内のグローバルBundleConfig
から呼び出すことができますが、これは気分がよくありません。
この件に関する情報は見つかりません。どんな助けでも私たちの考えはありがたいです。
これがどうにか規制されることを望んでいました-しかし、フレームワークのコードに飛び込んだ後、これに対する答えは否定的です。
私がやろうと決めたのは、
ソリューション構造
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);
}
}
あなたの質問は、エリアごとに別々のスクリプトと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"));
}
_