2009-03-11 9 views
3

私はかなり大きなASP MVCアプリケーションを持っています。コントローラディレクトリに多くのコントローラをすべて持たせるのではなく、むしろいくつかの階層を作成します。だから私は、私はまた、ビューASP MVCフォルダ階層

~\Views\Security\Users\ 
~\Views\Security\Roles\ 
~\Views\Maintenance\Customer\ 
~\Views\Maintenance\Product\ 

と同様の操作を行うことができるようにしたいと思い

~\Controllers\Security\ 
~\Controllers\Maintenance\ 
~\Controllers\Reports\ 

のようなものがあるかもしれません、これは簡単に行われていますか?

答えて

4

を、私はあなたが「マスター」は、この記事で言っているようなものを探していると思う:

http://haacked.com/archive/0001/01/01/areas-in-aspnetmvc.aspx

基本的にあなたが作成する必要がありますViewEngineを使用して、ビューの検索場所を指定します。かなりシンプルなコードですが、global.asaxに登録することを忘れないでください!コントローラの部分については、global.asaxにも新しいルートを登録する必要があります。

0

あなたが本当にここにしたいことは、あなたのコントローラーの名前空間の階層に合わせて、あなたのビューのフォルダ階層のためです。これを簡単に行うためにカスタムViewEngineを書くことができます - 詳細はControllerPathViewEngine project on GitHubをご覧ください。

ControllerPathRazorViewEngineクラスのスニペットを使用して、その動作を説明しました。 FindView/FindPartialViewメソッドをインターセプトし、コントローラ名を(コントローラの名前空間と名前に基づいて)フォルダパスに置き換えることで、メインのViewsフォルダ内のネストされたフォルダからビューをロードすることができます。

public class ControllerPathRazorViewEngine : RazorViewEngine 
    { 
     //... constructors etc. 

     public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache) 
     { 
      return FindUsingControllerPath(controllerContext,() => base.FindView(controllerContext, viewName, masterName, useCache)); 
     } 

     public override ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache) 
     { 
      return FindUsingControllerPath(controllerContext,() => base.FindPartialView(controllerContext, partialViewName, useCache)); 
     } 

     private ViewEngineResult FindUsingControllerPath(ControllerContext controllerContext, Func<ViewEngineResult> func) 
     { 
      string controllerName = controllerContext.RouteData.GetRequiredString("controller"); 
      string controllerPath = controllerPathResolver.GetPath(controllerContext.Controller.GetType()); 
      controllerContext.RouteData.Values["controller"] = controllerPath; 
      var result = func(); 
      controllerContext.RouteData.Values["controller"] = controllerName; 
      return result; 
     } 
    }