2011-12-12 25 views
5

He definido la siguiente ruta:ASP.NET MVC 3 - rutas SEO friendly personalizada

routes.MapRoute(
    null, 
    "foo/{id}/{title}", 
    new { controller = "Boo", action = "Details" } 
); 

Cuando llamo a este método:

Url.Action("Details", "Boo", new { id = article.Id, title = article.Title }) 

me sale el siguiente URL:
http://localhost:57553/foo/1/Some%20text%20Š

Me gustaría crear una nueva ruta que minúscula todos los caracteres y reemplace algunos de ellos.

p. Ej.
http://localhost:57553/foo/1/some-text-s

Reglas:

Uppercase -> lowercase  
' ' -> '-' 
'Š' -> 's' 
etc. 

Cualquier ayuda sería muy apreciada!

Respuesta

6

parece un candidato perfecto para una ruta personalizada:

public class MyRoute : Route 
{ 
    public MyRoute(string url, object defaultValues) 
     : base(url, new RouteValueDictionary(defaultValues), new MvcRouteHandler()) 
    { 
    } 

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) 
    { 
     values = new RouteValueDictionary(values); 
     var title = values["title"] as string; 
     if (!string.IsNullOrEmpty(title)) 
     { 
      values["title"] = SEOify(title); 
     } 
     return base.GetVirtualPath(requestContext, values); 
    } 

    private string SEOify(string title) 
    { 
     throw new NotImplementedException(); 
    } 
} 

que se registrará como esto:

routes.Add(
    "myRoute", 
    new MyRoute(
     "foo/{id}/{title}", 
     new { controller = "Boo", action = "Details" } 
    ) 
); 

Ahora todo lo que tiene que hacer es poner en práctica sus necesidades de SEO en la SEOify función que dejé. Por cierto, puedes obtener inspiración del camino StackOverflow does it para los títulos de las preguntas.

+0

¡Impresionante! +1. ¿Qué pasa con las rutas personalizadas frente a los ayudantes de URL? Encontré una solución similar en SO hace unos años (¿pero ahora no puedo encontrarla?) Y ahora todo el mundo está sugiriendo ayudantes de URL sobre un enrutador personalizado. –

+0

@ šljaker, no entiendo lo que pregunta cuando dice 'rutas personalizadas contra URL helpers'. ¿Estás preguntando qué es mejor: usar una ruta personalizada que realizará esto o escribir ayudantes personalizados como Html.ActionLink, Url.Action, ...? Si este es el caso, una ruta personalizada es mucho mejor a medida que centraliza toda su lógica de enrutamiento y la forma en que se ven sus URL en las rutas que es donde debe hacerse, en lugar de dispersar dicha lógica en todo su código. Es mucho más fácil modificarlo en una sola ubicación y todos los asistentes de HTML estándar lo usarán automáticamente en toda la aplicación. –

+0

sí, eso es lo que quería saber! ¡Gracias! –