ASP.NET MVC Beta-コントローラーとビューのグループ化は可能ですか?
-
04-07-2019 - |
質問
最新のベータリリースを使用してASP.NET MVCアプリケーションをビルドする途中です。デフォルトのプロジェクトレイアウトを変更することは可能かどうか
/Views/Home/Index.aspx /Views/Home/About.aspx
to
/Blog/Views/Home/Index.aspx /Blog/Views/Home/About.aspx
/Forum/Views/Home/Index.aspx /Forum/Views/Home/About.aspx
目標は、「アプリケーション」をある程度分離することです。単一のWebプロジェクト内で、Thomas Owensのような人が既にここで質問しました。 -by-other-dev "> MVCフレームワークの下で、他の開発者が期待するディレクトリ構造はどれですか
もちろん、これにはビューだけでなくコントローラーも含まれる必要があります。
解決
これは新しい概念ではありません。 「エリア」と呼ばれます。 モノレールで。最近、 ATL.NETフォーラムで、このトピックに関する多くの話題がありました。 など。スティーブサンダーソンはこれを行う方法ですが、明らかにいくつかの問題が残っています。それに応じて、どうやらMVCチームは" 詳細な外観"将来のリリースに備えて。
他のヒント
はい、これは可能です。ひとつの方法が考えられます。他にもあるかもしれません。
最初のステップは、デフォルトルートを変更してアプリケーション名を含めることです。
routes.MapRoute("Default",
"{applicationName}/{controller}/{action}/{id})",
null, null);
2つの「アプリケーション」をグループ化することを想定しています。単一のアセンブリ内の異なる名前空間に。したがって、次のような2つの名前空間があります。
- MyApp.Blog.Controllers
- MyApp.Forum.Controllers
次に、適切なコントローラーをインスタンス化するようにコントローラーファクトリを変更する必要があります。これを行うには、DefaultControllerFactoryをサブタイプし、GetControllerTypeメソッドをオーバーライドします。
protected override System.Type GetControllerType(string controllerName)
{
string applicationName;
if (RequestContext != null &&
RequestContext.RouteData.Values.TryGetValue(
"applicationName", out applicationName)) {
// return controller type using app name to
// look up namespace and controllerName argument
return ...
}
// if no match, maybe it's a different controller/route
return base.GetControllerType(controllerName);
}
最後に、MVCにControllerFactoryを使用するように指示する必要があります。 Global.asax.csの場合:
private void Application_Start(object sender, EventArgs e)
{
RegisterRoutes(RouteTable.Routes);
ControllerBuilder.Current.SetControllerFactory(
MyApp.MyControllerFactory());
}
ビューの検索も同様に処理できます。この場合、WebFormViewEngineをサブタイプします。
「エリア」に似たコントローラーをグループ化する1つのアプローチを説明するブログ投稿を書きました。モノレールで。ただし、ネストされた領域にはまだ対応していません。
http://haacked.com/archive/2008 /11/04/areas-in-aspnetmvc.aspx