2008-10-23 11 views
2

Je suis sur la façon de construire une application ASP.NET MVC avec la dernière version bêta et je me demande s'il est possible de modifier le projet par défaut Mise en page deASP.NET MVC Beta - Grouper les contrôleurs et les vues possibles?

/Views/Home/Index.aspx /Vues/Accueil/About.aspx

à

/Blog/Views/Home/Index.aspx /Blog/Views/Home/About.aspx

/Forum/Views/Home/Index.aspx /Forum/Views/Home/About.aspx

L'objectif est d'obtenir une séparation entre les « applications » au sein d'un seul projet Web, quelque chose comme Thomas Owens a déjà posé ici: Under an MVC framework, which directory structure would be expected by other developers?

Bien sûr, cela devrait inclure les contrôleurs aussi bien, non seulement les vues.

Répondre

0

Ce n'est pas un nouveau concept. Il est appelé "zones" dans Monorail. Il y a eu beaucoup de buzz sur ce sujet récemment sur le ATL.NET forum et ailleurs. Steve Sanderson a trouvé un way to do this mais apparemment il laisse quelques problèmes. En réponse, apparemment l'équipe MVC va prendre un "deep look" pour une prochaine version.

+0

Merci beaucoup, Tim, et Craig aussi. Cela semble être le meilleur moyen d'attendre la sortie finale et de ne pas jouer avec ces hacks, qui semblent ne pas être parfaits du tout aujourd'hui. Peut-être que je devrais utiliser à nouveau WebForms jusqu'à ASP.NET MVC est prêt à 100% :-(. –

1

Oui, cela devrait être possible. Je peux penser à un sens; il peut y avoir d'autres.

La première étape consiste à modifier la route par défaut pour inclure le nom de l'application:

routes.MapRoute("Default", 
       "{applicationName}/{controller}/{action}/{id})", 
       null, null); 

Je présume que vous allez regrouper les deux « applications » dans différents espaces de noms dans un seul ensemble. Donc, vous pourriez avoir deux espaces de noms comme:

  • MyApp.Blog.Controllers
  • MyApp.Forum.Controllers

Ensuite, vous devez changer l'usine de façon à ce qu'il instancie le contrôleur droit. Vous pouvez le faire par le sous-typage DefaultControllerFactory et redéfinissant la méthode 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); 
    } 

Enfin, vous devez dire MVC utiliser votre ControllerFactory. Dans Global.asax.cs:

private void Application_Start(object sender, EventArgs e) 
    { 
     RegisterRoutes(RouteTable.Routes); 
     ControllerBuilder.Current.SetControllerFactory(
      MyApp.MyControllerFactory()); 
    } 

Les vues de localisation peuvent être traitées de manière similaire. Dans ce cas, vous sous-tapez WebFormViewEngine.

+0

Cette technique me résoudre une question connexe, en essayant de mettre en œuvre les contrôleurs hiérarchiques. – Giraffe

Questions connexes