2010-06-10 7 views
7

Estoy migrando un sitio de ASP.NET MVC 1 a ASP.NET MVC 2. Por el momento, el sitio es compatible con las siguientes rutas:ASP.NET MVC 2 - do UrlParameter.Optional entries debe estar al final de la ruta?

/{country}/{language}/{controller}/{action} 
/{country}/{controller}/{action} 
/{language}/{controller}/{action} 
/{controller}/{action} 

Los formatos para country y language son distinguibles por expresiones regulares y tienen restricciones adecuadas. En MVC 1, registré cada uno de estos como una ruta separada, para cada una de alrededor de 20 combinaciones. En MVC 2, he estado tratando de hacer que funcione lo mismo con una ruta para cubrir las cuatro cajas, usando UrlParameter.Optional, pero parece que no puedo hacerlo funcionar; si defino country y language como ambos opcionales, entonces la ruta /Home/Index por ejemplo, no coincide con éxito la ruta. Esto es lo que estoy tratando de hacer:

routes.MapRoute("Default", 
    "{country}/{language}/{controller}/{action}", 
    new { country = UrlParameter.Optional, language = UrlParameter.Optional, 
     controller = "Home", action = "Index" }, 
    new { country = COUNTRY_REGEX, language = LANGUAGE_REGEX }); 

se trata simplemente imposible porque mis opcionales están en el inicio de la ruta, o solo estoy perdiendo algo? No encuentro ninguna documentación para decirme que lo que estoy haciendo es imposible o para apuntarme en la dirección correcta.

+0

También me interesa el truco para lograr dicho sistema de enrutamiento si es posible ... –

+0

En lugar de especificarlos todos en uno, ¿por qué no definir simplemente las rutas múltiples para manejarlo? –

+0

Si lees la mitad de la pregunta, eso es lo que estoy haciendo en este momento. Pero en cuatro combinaciones por 20 diferentes tipos de ruta eso es mucho mapeo. Estoy tratando de averiguar si puedo simplificar esto usando UrlParameter.Optional. –

Respuesta

2

Hmm. Interesante.

Esto es lo mejor que se me ocurrió. Supongo que esta es una mala idea, pero es la única solución que se me ocurre. Me interesaría escuchar algunas sugerencias/inquietudes/quejas.

Se podría trazar una ruta miopes como esto:

routes.MapRoute(
    "Localized", 
    "{*loc}", 
    new { controller = "Localizer", action = "RedirectIt" }, 
    new { loc = REGEX_CONSTRAINT_FOR_ENTIRE_ROUTE_VALUE } 
); 

Luego, en el controlador de localizador, puede redirigir a la acción correcta sin embargo lo desea:

public class LocalizerController : Controller 
{ 
    public ActionResult RedirectIt(string loc) 
    { 
     //split up the loc string 
     //and determine the correct redirect path for the request 
    } 
} 

estoy un hombre de trucos baratos. ¿Qué puedo decir?

+0

Bueno, vale la pena un +1 por ser la única respuesta y dar con algo que podría funcionar, pero obviamente prefiero evitar la redirección. Gracias sin embargo. –

+0

Sí. No es lindo. Y yo no lo usaría yo mismo. Pero, oye, creo que podría ser la única opción viable. –

+0

Bueno, definitivamente es la mejor respuesta que he tenido (!), Así que me toca el tic ... –

Cuestiones relacionadas