私は MVC 3 と MVC Contrib を使用してポータブル領域を作成しています。問題は、ポータブル領域が同様のビュー (ホーム、ユーザー管理など) を持っていることです。
たとえば、各ポータブル領域には、ホーム ビュー (Views/Home/Index.cshtml) とホーム コントローラー (Controllers/Home.cs) があります。ページにアクセスするには、MySite/PortableAreaName/Controller/View に移動するようにルーティングが設定されています。
問題は、最初のポータブル エリアのホーム ページとユーザー管理ページしか読み込まないことです。最初にそのビューを見つけてから、URL で指定された領域に関係なくロードします。
すべてにプレフィックスを付けることもできますが (例: Area1Home、Area1UserManagement)、よりスケーラブルなソリューションを見つけたいと思います。それぞれ 10 個のビューを持つ 50 個以上のポータブル エリアを取得した場合、どのビュー名を使用したかを追跡するか、すべてのビューにプレフィックスを付ける必要があります。
助言がありますか?さらに情報が必要な場合は、お知らせください。
更新 1 - 機能しませんでした
twang が提供する記事を使用して解決し、次のコードをメイン プロジェクト (リンクされた記事の「PortableAreas」) に追加します。
記事: http://elegantcode.com/2012/04/06/mvc-portable-areas/
メイン プロジェクト > Global.asax.cs
protected void Application_Start()
{
// ...
AreaRegistration.RegisterAllAreas();
PortableAreaRegistration.RegisterEmbeddedViewEngine();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
// ...
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Login", action = "Index", id = UrlParameter.Optional },
new string[] { "PortableAreas.Controllers" } // main project namespace
);
}
ポータブル エリア > MyPortableAreaRegistration.cs
public class MyPortableAreaRegistration : PortableAreaRegistration
{
public override string AreaName
{
get
{
return "MyPortableArea";
}
}
public override void RegisterArea(AreaRegistrationContext context, IApplicationBus bus)
{
RegisterRoutes(context);
RegisterAreaEmbeddedResources();
}
private void RegisterRoutes(AreaRegistrationContext context)
{
context.MapRoute(
AreaName + "_default",
base.AreaRoutePrefix + "/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional },
new[] { "MyPortableArea.Controllers", "MvcContrib" }
);
}
}
私が理解している限り、次の場所がリソースのデフォルトです。
- マイポータブルエリア/コンテンツ/画像
- MyPortableArea/スクリプト
これらのフォルダーにリソースを保持している限り、それらを登録するべきではありません。
更新 2
以前の修正は機能しませんでした。上記のコードを使用しても、間違ったビューやリソースなどが読み込まれることがあります。これを修正する方法を知っている人はいますか?
デバッグすると、正しいコントローラーとそのコントローラー内の正しいビューに移動しますが、間違ったビューをロードします (たとえば、Area2 のコントローラーと Area2 の Home page メソッドになりますが、Area1 のホームページをロードします。
たとえば、2 つのポータブル領域がありますが、常に最初の領域が読み込まれます
MyPortableArea1/Controls/Home, MyPortableArea1/Scripts/Views/Home/index.js MyPortableArea2/Controls/Home, MyPortableArea2/Scripts/Views/Home/index.js
一度に全部登録するからだと思いますか?次に、ルートの一致が見つかると、最初の一致が使用されます (これは間違っている場合があります)。
アップデート 3
コードをステップ実行した後、レイアウトのセクションが正しく読み込まれていないようです。たとえば、MyPortableArea2 の HomeController > Index() に到達し、レイアウトをロードしてから、レイアウトは @RenderBody() セクションで MyPortableArea1 のコンテンツをロードします。
更新 4
http://mvccontrib.codeplex.com/から最新バージョンの MvcContrib に更新されました。これはうまくいきませんでした。
更新 5
だから私は少しテストを行い、間違ったページをロードする理由を突き止めました.Areaがまったく見つかりません. それはシステムにもないようです!
例: PortableArea1/Home/Index
public ActionResult Index()
{
return View("~/Areas/PortableArea1/Views/Home/Index.cshtml");
}
例: PortableArea2/Home/Index
public ActionResult Index()
{
return View("~/Areas/PortableArea2/Views/Home/Index.cshtml");
}
間違ったページをロードすると、ビューが見つからないというエラーが表示されるようになりました。ポータブルエリアをロードしないのはなぜですか??