2010-05-08 16 views
5

En mi aplicación tengo un controlador llamado Snippets tanto en el área predeterminada (en la raíz de la aplicación) como en mi área llamada Manage. Yo uso T4MVC y personalizados rutas, así:T4MVC y nombres de controlador duplicados en diferentes áreas

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

Y me sale este error:

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

Sé que hay sobrecargas para MapRoute que tomar namespaces argumento, pero no hay tales sobrecargas con Soporte T4MVC. Puede ser que me estoy perdiendo algo? La posible sintaxis puede ser:

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

o, parece bastante bueno para mí tener espacio de nombres como propiedad T4MVC:

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

Gracias de antemano!

Respuesta

5

Tiene sentido. Supongo que eres el primero en toparte con esto. Trate de reemplazar todos los métodos MapRoute en T4MVC.tt por lo siguiente:

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

Tenga en cuenta que usted puede conseguir una gran escritura en el espacio de nombres del controlador sin la ayuda de T4MVC simplemente escribiendo:

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

debo añadir que idealmente, no tendría que pasar los espacios de nombres, ya que su intento de apuntar a un controlador específico ya está capturado en la llamada MVC.Snippets.Rss(). Sin embargo, no pude encontrar una manera obvia de hacer que esto funcione sin grandes cambios en T4MVC.

De todos modos, revise y pruebe el cambio, y cuénteme cómo funciona para usted. Si se ve bien, lo conseguiré.

¡Gracias!

Cuestiones relacionadas