asp.net mvcエリアのリソースバンドルをどのように行いますか?これは、ルートの場合と同じようにASP.NET MVCフレームワークによって規制されていますAreaRegistration
か?
エリア内でクラスを作成し、フォルダー内BundleConfig
のグローバルからこれを呼び出すことはできますが、これは私には気分が良くありません。BundleConfig
App_Start
この件に関する情報が見つかりません。私たちの考えが高く評価されている助け。
asp.net mvcエリアのリソースバンドルをどのように行いますか?これは、ルートの場合と同じようにASP.NET MVCフレームワークによって規制されていますAreaRegistration
か?
エリア内でクラスを作成し、フォルダー内BundleConfig
のグローバルからこれを呼び出すことはできますが、これは私には気分が良くありません。BundleConfig
App_Start
この件に関する情報が見つかりません。私たちの考えが高く評価されている助け。
これがどういうわけかもっと規制されていることを望んでいましたが、フレームワークコードに飛び込んだ後、これに対する答えは否定的です.
私がやろうと決めたことは次のとおりです。
ソリューション構造
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 フォルダーがあることを意味しますか? これは型破りです (完全にもっともらしいですが)。それとも、ルート レベルに 1 つのスクリプト フォルダーがあり、それを各エリアのサブ フォルダーに分割しているでしょうか? いずれにせよ、エリア固有のバンドルを取得するには、わずかに異なることを行う必要があります。
MVC4 アプリケーションにBundleConfig
は、App_Start フォルダーにある静的クラスが付属しています。その後、バンドルは Global.asax から初期化されます。MVC4 プロジェクトを使用していない場合は、アップグレードするか、すぐに使用できる MVC4 プロジェクトを開始して、これらのファイルのレイアウトを確認してください。
バンドルは、(そこからバンドルを参照できる) 仮想パスを宣言してから、バンドルするファイルを指定するだけで構成されます。バンドルされるファイルは、ファイル名を明示的にリストするか、ファイル名の文字が一致するか、またはすべてのファイルが含まれるディレクトリを指定することによって指定できます。
まず、このグローバルBundleConfig
を使用して、すべてのエリアのバンドルを指定します。これがスケールしない場合や扱いにくい場合は、後でいつでも解決できます。
含めるファイルを指定します。バンドルの仮想パスの前に、その対象のエリアを付ける必要があります。そうすれば、ビューからエリア名を使用して参照するのが簡単になります_Layout.cshtml
。
たとえば、ここではそれぞれ異なるスクリプトを持つ 2 つの Areas があります: Userと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"));
}
}
次に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"));
}