2010-05-08 9 views
5

Nella mia applicazione ho il controller chiamato Snippets sia nell'area di default (nella root dell'applicazione) che nella mia area chiamata Manage. Io uso T4MVC e personalizzati percorsi, in questo modo:T4MVC e nomi di controller duplicati in aree diverse

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

E ottengo questo errore:

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

So che ci sono sovraccarichi per MapRoute che prendono namespaces argomento, ma non ci sono tali sovraccarichi con Supporto T4MVC. Potrebbe essere mi manca qualcosa? La sintassi possibile può essere:

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

o, sembra abbastanza buono per me per avere spazio dei nomi come proprietà T4MVC:

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

Grazie in anticipo!

risposta

5

Ha senso. Immagino che tu sia il primo a imbattersi in questo. Provare a sostituire tutti i metodi della rottaMappa in T4MVC.tt dal seguente:

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

noti che è possibile ottenere forti digitando sul namespace controller senza l'aiuto di T4MVC semplicemente scrivendo:

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

Vorrei aggiungere che idealmente, non dovresti passare affatto Namespace, dal momento che l'intenzione di indirizzare un controller specifico è già stata acquisita nella chiamata MVC.Snippets.Rss(). Tuttavia, non ho trovato un modo ovvio per farlo funzionare senza grandi cambiamenti a T4MVC.

In ogni caso, si prega di rivedere e testare il cambiamento, e fammi sapere come funziona per voi. Se sembra buono, lo farò entrare.

Grazie!