2011-10-29 19 views
12

Estoy usando asp.net mvc 2 y creo una localización basada en rutas.ASP.NET MVC Url.Acción y nombre de la ruta valor

  1. mi ruta se ve así: {culture}/{controller}/{action}
  2. me vaya a mi controlador de casa: en/Home/Index
  3. mi punto de vista controlador de casa tienen una enlaces a otros controladores:

    <a href='<%= Url.Action("Prods","Products") %>' >Products</a> 
    <a href='<%= Url.Action("Index","About") %>' >About</a> 
    

primer enlace código generado: /en/Products/Prods pero el segundo genera: /Home/Index

No puedo entender por qué Url.Action omite el parámetro de ruta {culture} cuando paso el valor Index en la acción argumento? ¿Qué estoy haciendo mal?

configuración Ruta:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

routes.MapRoute("Login", // Route name 
       "{controller}/Index", // URL with parameters 
       new { controller = "Login", action = "Index" } // Parameter defaults 
       ).RouteHandler = new SingleCultureMvcRouteHandler(); 

routes.MapRoute("Default", // Route name 
       "{controller}/{action}/{id}", // URL with parameters 
       new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
       );  

Entonces

foreach (Route r in routes) 
{ 
    if (!(r.RouteHandler is SingleCultureMvcRouteHandler)) 
    { 
     r.RouteHandler = new MultiCultureMvcRouteHandler(); 

     r.Url = "{culture}/" + r.Url; 

     if (r.Defaults == null) 
     { 
      r.Defaults = new RouteValueDictionary(); 
     } 

     r.Defaults.Add("culture", "en"); 

     if (r.Constraints == null) 
     { 
      r.Constraints = new RouteValueDictionary(); 
     } 

     r.Constraints.Add("culture", new CultureConstraint(cultures)); 
    } 
} 

Gracias por toda la ayuda

+0

Si incluye la configuración de ruta completa, es más fácil encontrar el problema. –

+0

@ João Angelo Gracias por responder, busque la actualización –

+0

@marc_s Gracias, lo agrego después de todas las rutas aquí: r.Url = "{culture} /" + r.Url; –

Respuesta

41

Al generar URL sus mejores opciones es utilizar siempre los nombres de ruta porque de esta manera usted no recibe en las sutilezas del algoritmo utilizado para seleccionar la ruta que se utilizará para generar la URL.

Mi consejo es que no use Url.Action y en su lugar use Url.RouteUrl, que le permite especificar el nombre de la ruta que se debe usar para construir la URL.

Al utilizar siempre los nombres de las rutas, también hace que su código sea más robusto para los cambios, por ejemplo, puede agregar nuevas rutas sin tener que preocuparse de que puedan romper su código existente para la generación de URL.

1

Para crear un enlace Url.Action, cualquier acción Index sin un token id coincidirá con la ruta Login. La ruta de inicio de sesión utiliza SingleCultureMvcRouteHandler, por lo que la cultura no se antepondrá a esos enlaces.

Cuestiones relacionadas