2010-05-08 4 views
5

Dans mon application, j'ai le contrôleur nommé Snippets à la fois dans la zone par défaut (dans l'application racine) et dans ma zone appelée Manage. J'utiliser des itinéraires T4MVC et personnalisés, comme ceci:T4MVC et noms de contrôleurs dupliqués dans différentes zones

routes.MapRoute(
    "Feed", 
    "feed/", 
    MVC.Snippets.Rss() 
); 

Et je reçois cette erreur:

Multiple types were found that match the controller named 'snippets'. This can happen if the route that services this request ('{controller}/{action}/{id}/') does not specify namespaces to search for a controller that matches the request. If this is the case, register this route by calling an overload of the 'MapRoute' method that takes a 'namespaces' parameter.

The request for 'snippets' has found the following matching controllers: Snippets.Controllers.SnippetsController Snippets.Areas.Manage.Controllers.SnippetsController

Je sais qu'il ya des surcharges pour MapRoute qui prennent en argument namespaces, mais il n'y a pas de telles surcharges avec Support T4MVC. Peut-être qu'il me manque quelque chose? La syntaxe possible peut être:

routes.MapRoute(
    "Feed", 
    "feed/", 
    MVC.Snippets.Rss(), 
    new string[] {"Snippets.Controllers"}   
); 

ou, il me semble tout à fait bon d'avoir l'espace de noms comme propriété T4MVC:

routes.MapRoute(
    "Feed", 
    "feed/", 
    MVC.Snippets.Rss(), 
    new string[] {MVC.Snippets.Namespace}   
); 

Merci à l'avance!

Répondre

5

Fait sens. Je suppose que vous êtes juste le premier à tomber sur ça. Essayez de remplacer toutes les méthodes MAPROUTE dans T4MVC.tt par ce qui suit:

public static Route MapRoute(this RouteCollection routes, string name, string url, ActionResult result) { 
     return MapRoute(routes, name, url, result, null /*namespaces*/); 
    } 

    public static Route MapRoute(this RouteCollection routes, string name, string url, ActionResult result, object defaults) { 
     return MapRoute(routes, name, url, result, defaults, null /*constraints*/, null /*namespaces*/); 
    } 

    public static Route MapRoute(this RouteCollection routes, string name, string url, ActionResult result, string[] namespaces) { 
     return MapRoute(routes, name, url, result, null /*defaults*/, namespaces); 
    } 

    public static Route MapRoute(this RouteCollection routes, string name, string url, ActionResult result, object defaults, object constraints) { 
     return MapRoute(routes, name, url, result, defaults, constraints, null /*namespaces*/); 
    } 

    public static Route MapRoute(this RouteCollection routes, string name, string url, ActionResult result, object defaults, string[] namespaces) { 
     return MapRoute(routes, name, url, result, defaults, null /*constraints*/, namespaces); 
    } 

    public static Route MapRoute(this RouteCollection routes, string name, string url, ActionResult result, object defaults, object constraints, string[] namespaces) { 
     // Start by adding the default values from the anonymous object (if any) 
     var routeValues = new RouteValueDictionary(defaults); 

     // Then add the Controller/Action names and the parameters from the call 
     foreach (var pair in result.GetRouteValueDictionary()) { 
      routeValues.Add(pair.Key, pair.Value); 
     } 

     var routeConstraints = new RouteValueDictionary(constraints); 

     // Create and add the route 
     var route = new Route(url, routeValues, routeConstraints, new MvcRouteHandler()); 

     if (namespaces != null && namespaces.Length > 0) { 
      route.DataTokens = new RouteValueDictionary(); 
      route.DataTokens["Namespaces"] = namespaces; 
     } 

     routes.Add(name, route); 
     return route; 
    } 

Notez que vous pouvez obtenir un typage fort sur l'espace de noms de contrôleur sans l'aide de T4MVC simplement en écrivant:

string[] { typeof(MyApplication.Controllers.SnippetsController).Namespace } 

Je dois ajouter que idéalement, vous ne devriez pas passer du tout aux espaces de noms, puisque votre intention de cibler un contrôleur spécifique est déjà capturée dans l'appel MVC.Snippets.Rss(). Cependant, je ne pouvais pas trouver un moyen évident de faire ce travail sans grands changements à T4MVC.

Quoi qu'il en soit, s'il vous plaît examiner et tester le changement, et laissez-moi savoir comment cela fonctionne pour vous. Si ça a l'air bien, je vais l'entrer.

Merci!