2010-02-01 14 views
16

come creare dinamicamente gli URL/link come: www.restaurant.com/restaurant/restaurant-name-without-some-characters-like-space-coma-etc/132Come aggiungere il titolo della pagina in url in asp.net mvc? (Generazione url)

quali sono le parole chiave che posso usare per google alcuni articoli su questo argomento? (come generare e gestire questo tipo di URL all'interno di asp.net mvc)

Ci sono alcune domande: Come generare collegamenti? (memorizza le lumache in db?) Reindirizza o no se slug non è canonico?

modificare: a quanto pare sono chiamati lumache

risposta

2

Un modo per farlo è il seguente sulla stringa

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 

Ora si può passare il cleanString (per titoli, nomi, ecc) nella ActoinLink/Url.I parametri di azione e funzionerà benissimo.

Il modello è stata presa dal http://snipplr.com/view/18414/string-to-clean-url-generator/

Io non sono al 100% sul modello Regex, se qualche Regex eroe può carillon e offrire uno migliore che sarebbe grande. Dal test del Regex, non corrisponde agli spazi, ma questo non dovrebbe essere un problema perché la prima riga sostituisce tutti gli spazi con trattini.

Aggiornamento:

Per utilizzare questo codice, è necessario configurare i percorsi per accettare parametri aggiuntivi.

Useremo un titolo di articolo del blog come esempio.

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

Nel vostro punto di vista ASP.NET MVC, è possibile effettuare le seguenti operazioni:

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

Nel precedente esempio, io uso SanitizeTitle come HTML 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

non sono un eroe regex ma penso che sarebbe meglio: input = Regex.Replace (input, @ "[| \\ /]", "-"); // Sostituisci i caratteri di "rottura" con "-" input = Regex.Replace (input, @ "[^ a-zA-Z0-9 -_. ~]", ""); // Sostituisce i caratteri rimanenti non sicuri (RFC3986) con "" input = input.Trim (new [] {'-', '_', '.', '~'}). ToLower(); // Taglia i caratteri non alfanumerici iniziali o finali e converti in caratteri minuscoli – JohannesH

+1

Crap ... Nessuna interruzione di riga nei commenti. – JohannesH

6

È necessario utilizzare qualcosa come segue.

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

E un metodo di estensione semplice:

public static class UrlExtensions 
{ 

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

} 
+0

cosa c'è "*" per "{* title}"? – Ante

+0

Questo è un parametro catch-all. Tutto dopo l'ID è il titolo. Inoltre rende anche l'ultimo parametro opzionale. –

+1

Quando e dove si chiama il metodo UrlExtensions.ResolveSubjectForUrl? – Chris

2

ho solo chiesto un relevant question oggi su SO riguardo alla generazione di slug, alias/slug un titolo.

Quando si recupera un URL con slug, è possibile creare un'azione che richiede sia ID (e altri argomenti richiesti) sia slug e semplicemente ignorare lo slug.

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

O più elegante, Usa sulla rotta di ignorare trialing stringa dietro il vostro URL e mappa per Foobar(int id).

4

Ho sempre memorizzato le lumache nel database accanto a qualsiasi entità a cui fare riferimento. Quindi per un post del blog, avresti un campo "slug" nella tabella "post".

Per gestirlo in ASP.Net MVC è semplice: basta utilizzare un percorso regolare per acquisire lo slug in un parametro (possibilmente anche solo usando {id}), quindi il controller cercherà lo slug in database, caricare l'entità e visualizzarla normalmente.

Sebbene sia possibile utilizzare un semplice RegEx per sostituire gli spazi e quant'altro per generare le lumache, in realtà ciò si interrompe molto rapidamente. È necessario considerare tutti i tipi di caratteri che possono apparire nei titoli. Il blog di Michael Kaplan è stato strettamente collegato a questo scopo preciso; he's shared a function che eliminerà i segni diacritici dalle stringhe.

Così, il vostro algoritmo "generare lumaca" dovrebbe in genere assumere la forma di:

  1. Tagliare la stringa di condurre/spazi finali
  2. Striscia di segni diacritici che utilizzano la funzione di Michael Kaplan o equivalente
  3. Minuscolo il stringa per canonica
  4. Sostituire tutti i caratteri non-parola con i trattini
+0

Perché dovresti salvarli nel database? –

+0

perché? non devi farlo. In generale penso che sia più ottimale. Ad esempio, cosa succede se si desidera modificare quel particolare slug/url. Non so forse renderlo più breve o qualsiasi altra cosa. non sarai in grado di farlo senza modificare il campo del titolo. Ha senso? – Victor