2009-03-11 16 views
3

Ich habe eine ziemlich große ASP MVC-Anwendung. Anstatt viele Controller im Controller-Verzeichnis zu haben, würde ich eher eine Hierarchie erstellen. So könnte ich so etwas wieASP MVC Ordnerhierarchie

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

Ich würde auch mit Ansichten

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

Ist dies leicht getan tun, ähnlich zu können, wie?

Antwort

1

Ich würde denken, Sie müssten Ihren eigenen RouteHandler schreiben, der nicht zu hart sein sollte.

Eine schnelle Google-Suche aufgedreht: This blog post detailing it

4

Ich glaube, Sie suchen etwas wie das, was der „Meister“, sagt in diesem Beitrag:

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

Grundsätzlich müssen Sie eine erstellen ViewEngine, um festzulegen, wo nach den Ansichten gesucht werden soll. Es ist ein ziemlich einfacher Code, vergessen Sie nicht, ihn im global.asax zu registrieren! Wie für den Controller-Teil müssen Sie neue Routen auch in der global.asax registrieren.

0

Was Sie wirklich hier wollen, ist für Hierarchie Ihre Ansichten Ordner, um die Namespace-Hierarchie Ihrer Controller übereinstimmen. Sie können eine benutzerdefinierte ViewEngine schreiben, um dies relativ einfach zu tun - siehe meine ControllerPathViewEngine project on GitHub für Details.

Ich habe ein Snippet der ControllerPathRazorViewEngine-Klasse eingefügt, um darzustellen, wie es funktioniert. Durch das Abfangen der FindView/FindPartialView-Methoden und das Ersetzen des Controllernamens durch einen Ordnerpfad (basierend auf Controller-Namespace und Name) können wir es dazu bringen, Ansichten aus verschachtelten Ordnern im Hauptordner Views zu laden.

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; 
     } 
    }