2010-02-01 17 views
16

Cómo crear dinámicamente las direcciones URL/enlaces como: www.restaurant.com/restaurant/restaurant-name-without-some-characters-like-space-coma-etc/132¿Cómo agregar el título de la página en url en asp.net mvc? (Generación url)

cuáles son las palabras clave que puedo usar para googlear algunos artículos sobre este tema? (Cómo genererate y manejar este tipo de URL que contiene asp.net mvc)

Hay algunas preguntas: ¿Cómo generar enlaces? (¿almacena slugs en db?) ¿Redirige o no si slug no es canónico?

de edición: al parecer se les llama babosas

Respuesta

2

Una forma de hacer esto es el siguiente en la cadena de

string cleanString = originalString.ToLower().Replace(" ", "-"); // ToLower() on the string thenreplaces spaces with hyphens 
cleanString = Regex.Replace(cleanString, @"[^a-zA-Z0-9\/_|+ -]", ""); // removes all non-alphanumerics/underscore/hyphens 

Ahora usted puede pasar el cleanString (para los títulos, nombres, etc.) en el ActoinLink/Parámetros de acción del Url. Y funcionará de maravilla.

El patrón fue tomada desde http://snipplr.com/view/18414/string-to-clean-url-generator/

No estoy 100% en el patrón de expresión, si algún héroe Regex pueda intervenir y ofrecer una mejor uno que sería grande. Desde la prueba de Regex, no coincide con los espacios, pero esto no debería ser un problema porque la primera línea reemplaza todos los espacios con guiones.

Actualización:

Para utilizar este código, tiene que configurar sus rutas para aceptar parámetros adicionales.

Utilizaremos el título de un artículo de blog como ejemplo.

 routes.MapRoute(
      "",            // Route name 
      "View/{ID}/{Title}",       // URL with parameters 
      new { controller = "Articles", action = "View"} // Parameter defaults 
     ); 

En sus puntos de vista ASP.NET MVC, a continuación, puede hacer lo siguiente:

<%= Html.ActionLink("View Article", "View", "Articles", new { ID = article.ID, Title = Html.SanitizeTitle(article.Title) }, null) %> 

En el ejemplo anterior, lo uso como un SanitizeTitleHTML helper.

public static SanitizeTitle(this HtmlHelper html, string str) 
{ 
    string cleanString = originalString.ToLower().Replace(" ", "-"); // ToLower() on the string thenreplaces spaces with hyphens 
    cleanString = Regex.Replace(cleanString, @"[^a-zA-Z0-9\/_|+ -]", ""); // removes all non-alphanumerics/underscore/hyphens 
    return cleanString; 
} 
+0

no soy ningún héroe de expresiones regulares pero creo que esto sería mejor: input = Regex.Replace (input, @ "[| \\ /]", "-"); // Reemplazar caracteres "quebrados" por "-" input = Regex.Replace (input, @ "[^ a-zA-Z0-9 -_. ~]", ""); // Reemplazar los caracteres restantes no seguros (RFC3986) con "" input = input.Trim (new [] {'-', '_', '.', '~'}). ToLower(); // Recorta los caracteres no alfanuméricos iniciales o finales y convierte a minúsculas – JohannesH

+1

Mierda ... Sin saltos de línea en los comentarios. – JohannesH

6

Tienes que usar algo de la siguiente manera.

Routes.MapRoute(
    "Post", 
    "posts/{id}/{*title}", 
    new { controller = "Posts", action = "view" } 
); 

y un método simple extensión:

public static class UrlExtensions 
{ 

    public static string ResolveSubjectForUrl(this HtmlHelper source, string subject) 
    { 
     return Regex.Replace(Regex.Replace(subject, "[^\\w]", "-"), "[-]{2,}", "-"); 
    } 

} 
+0

¿qué es "*" para en "{* title}"? – Ante

+0

Ese es un parámetro catch-all. Todo después de id es título. También eso hace que el último parámetro sea opcional también. –

+1

¿Cuándo y dónde llama al método UrlExtensions.ResolveSubjectForUrl? – Chris

2

me acaba de pedir un relevant question hoy en SO con respecto a la generación de babosa, alias/slugear un título.

Cuando recupere un URL con slug, puede crear una acción que tome ID (y otros argumentos necesarios) y slug y simplemente ignorar el slug.

public ActionResult Foobar(int id, string slug) 
{ 
    //-- Do Something 
} 

O más elegante, Uso mapa de rutas para ignorar trialing cuerda detrás de su URL y mapa para Foobar(int id).

4

Siempre he almacenado babosas en la base de datos junto con cualquier entidad a la que hagan referencia. Entonces, para una publicación de blog, tendría un campo "slug" en la tabla "publicaciones".

Manejarlo en ASP.Net MVC es fácil - solo usa una ruta regular que capturaría la barra en un parámetro (posiblemente incluso usando {id}), y luego su controlador buscaría la barra en el base de datos, cargue la entidad y muéstrela como normal.

Aunque puede usar un simple RegEx para reemplazar espacios y otras cosas para generar sus babosas, en realidad esto se descompone bastante rápido. Debe tener en cuenta todo tipo de personajes que pueden aparecer en sus títulos. El blog de Michael Kaplan ha sido fuertemente relacionado para este propósito; he's shared a function que quitará las marcas diacríticas de las cadenas.

Por lo tanto, el algoritmo de "generar babosa" En general, debería tomar la forma de:

  1. Recorte la cadena de conducir/espacios en blanco
  2. Strip signos diacríticos utilizando la función de Michael Kaplan o equivalente
  3. Minúsculas la cadena para canonicalización
  4. reemplazar todos los caracteres no-palabras con guiones
+0

¿Por qué los almacenarías en la base de datos? –

+0

¿por qué? no tienes que hacerlo En general, creo que es más óptimo. Por ejemplo, ¿qué sucede si quiere editar ese slug/url en particular? No lo sé, quizás lo haga más corto o lo que sea. no podrás hacerlo sin cambiar el campo de título. ¿Tiene sentido? – Victor