2010-11-05 32 views
13

Estoy usando routes.add en lugar de routes.maproute (que tiene un espacio de nombres arg) porque extendí la clase de ruta. Necesito agregar espacio de nombres en las rutas porque una de mis áreas tiene el mismo nombre de controlador dentro del sitio. Mi problema es que no sé dónde poner el espacio de nombres ..Cómo agregar espacio de nombres a la extensión de ruta personalizada

 

public class CultureRoute : Route 
    { 
    public CultureRoute(string url, object defaults, object constraints, RouteValueDictionary dataTokens) 
      : base(url, new RouteValueDictionary(constraints), dataTokens, new MvcRouteHandler()) 
     { 
     } 
} 
 

Global.asax

 


      routes.Add("Default", new CultureRoute(
             "{controller}/{action}/{id}", 
             new {controller = "Home", action = "Index", id = UrlParameter.Optional})); 

 

Respuesta

17
 


var dataTokens = new RouteValueDictionary(); 
      var ns = new string[] {"MyProject.Controllers"}; 
      dataTokens["Namespaces"] = ns; 


      routes.Add("Default", new CultureRoute(
             "{controller}/{action}/{id}", 
             new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
             null /*constraints*/, 
             dataTokens 
            )); 

 
1

Para aquellos que estaban buscando una solución para esto:

Usted primero necesita un constructor que acepte el argumento DataTokens, y pasarlo al constructor de Ruta.

Por ejemplo, estaba usando una clase DomainRoute que recogí en línea, que no tenía los argumentos adicionales necesarios para pasar a Domain. Por lo que simplemente implementado un constructor similar a la Ruta de base constructor:

public DomainRoute(string domain, string url, object defaults, object constraints, object dataTokens) 
       : base(url, new RouteValueDictionary(defaults), new RouteValueDictionary(constraints),new RouteValueDictionary(dataTokens),new MvcRouteHandler()) 
{ 
       Domain = domain; 
} 

A continuación, si se ha anulado su método de GetRouteData, que debe devolver los DataTokens en sus RouteData valor de retorno. Para resolver esto, tuve que buscar en el código fuente de Route.cs (GRACIAS JAVA2S).

RouteData data = new RouteData(...); 
RouteValueDictionary dataTokens = DataTokens; 
if (this.DataTokens != null) { 
    RouteValueDictionary rdDataTokens = rd.DataTokens; 
    foreach (var token in dataTokens) 
     rdDataTokens.Add (token.Key, token.Value); 
    } 
} 
return data; 

Ahora simplemente ponga sus espacios de nombres en dataTokens ["Namespaces"] según la publicación de Fleents.

Saludos, Daryl

+0

Hace bastante tiempo ... Creo que estás usando la clase de Maarten B., ¿correcto? Agregar los espacios de nombres como se muestra arriba no funciona para mí en ese momento. Luego los agregará como RouteValueDictionary en un RouteValueDictionary. Actualmente estoy extendiendo eso, para tener un subdominio para el enrutamiento de área. – twomm

+0

Definitivamente hace mucho tiempo ... en la medida en que ni siquiera sé cuál era el problema original o qué estaba resolviendo. =) –

3

EDIT: (Anteriormente creado una ruta propia, pero que no era necesario). Esto debería funcionar. Al menos lo hace en MVC 4 y muy probablemente MVC 3

Route defRoute = new CultureRoute ("{controller}/{action}/{id}", 
      new RouteValueDictionary(new { controller = "Home", action = "Index", id = UrlParameter.Optional }), 
      new SomeRouteHandler()); 
if(defRoute.DataTokens == null) 
     defRoute.DataTokens = new RouteValueDictionary(); 
defRoute.DataTokens.Add("Namespaces", new string[] { "MVCApp.WebUI.Controllers" }); 
     routes.Add(defRoute); 
+0

DataTokens es de solo lectura – TruMan1

+0

Solo tu forma de trabajar es para mí. ¡¡¡Gracias!!! –

Cuestiones relacionadas