2010-02-01 4 views
16

Comment créer dynamiquement urls/liens comme: www.restaurant.com/restaurant/restaurant-name-without-some-characters-like-space-coma-etc/132Comment ajouter le titre de la page dans url dans asp.net mvc? (Génération url)

quelles sont les mots clés que je peux utiliser pour google quelques articles sur ce sujet? (comment générer et gérer ce type d'URL à l'intérieur asp.net mvc)

Il ya quelques questions: Comment créer des liens? (stocker les limaces en db?) Rediriger ou non si le slug n'est pas canonique?

modifier: apparemment, ils sont appelés limaces

Répondre

2

Une façon de faire est la suivante sur votre chaîne

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 

Maintenant, vous pouvez passer le cleanString (pour les titres, noms, etc.) dans le ActoinLink/Paramètres Url.Action et cela fonctionnera très bien.

Le modèle a été pris de http://snipplr.com/view/18414/string-to-clean-url-generator/

Je ne suis pas à 100% sur le modèle Regex, si un héros Regex peut sonner et offrir un meilleur qui serait génial. De tester le Regex, il ne correspond pas à des espaces, mais cela ne devrait pas poser de problème car la première ligne remplace tous les espaces par des traits d'union.

Mise à jour:

Pour utiliser ce code, vous devez configurer vos itinéraires pour accepter des paramètres supplémentaires.

Nous utiliserons un titre d'article de blog comme exemple.

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

Dans vos vues ASP.NET MVC, vous pouvez effectuer les opérations suivantes:

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

Dans l'exemple précédent, j'utilise SanitizeTitle comme 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

Je ne suis pas le héros regex mais je pense que ce serait mieux: input = Regex.Replace (entrée, @ "[| \\ /]", "-"); // Remplacer les caractères "break" par "-" input = Regex.Replace (entrée, @ "[^ a-zA-Z0-9 -_. ~]", ""); // Remplacer les caractères non sécurisés (RFC3986) par "" input = input.Trim (new [] {'-', '_', '.', '~'}). ToLower(); // Ajoute les caractères non-alphanumériques avant et arrière et convertit en minuscules – JohannesH

+1

Crap ... Pas de sauts de ligne dans les commentaires. – JohannesH

6

Vous devez utiliser quelque chose comme suit.

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

Et une méthode simple d'extension:

public static class UrlExtensions 
{ 

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

} 
+0

qu'est-ce que "*" dans "{* title}"? – Ante

+0

C'est un paramètre fourre-tout. Tout après id est le titre. Cela rend également le dernier paramètre facultatif. –

+1

Quand et où appelez-vous la méthode UrlExtensions.ResolveSubjectForUrl? – Chris

2

Je viens de poser une relevant question aujourd'hui SO en ce qui concerne la génération de limace, alias/slugify un titre.

Lorsque vous récupérez une URL avec slug, vous pouvez créer une action qui prend à la fois ID (et les autres arguments requis) et slug et ignorez simplement le slug.

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

Ou plus élégante, route Utilisez la carte pour ignorer la chaîne trialing derrière votre URL et plan d'accès à Foobar(int id).

4

J'ai toujours stocké des limaces dans la base de données aux côtés de n'importe quelle entité qui serait référencée par eux. Donc, pour un blog, vous auriez un champ "slug" dans le tableau "posts".Pour le gérer dans ASP.Net MVC est facile - vous utilisez simplement une route régulière qui capturerait le slug dans un paramètre (peut-être même simplement en utilisant {id}), puis votre contrôleur chercherait le slug dans le base de données, charger l'entité et l'afficher comme d'habitude.

Bien que vous puissiez utiliser un simple RegEx pour remplacer des espaces et ne pas générer vos limaces, cela se décompose assez rapidement. Vous devez considérer toutes les sortes de caractères qui peuvent apparaître dans vos titres. Le blog de Michael Kaplan a été fortement lié à ce but précis; he's shared a function qui va supprimer les marques diacritiques des chaînes.

Ainsi, votre algorithme « générer limace » doit généralement prendre la forme de:

  1. Couper la chaîne de premier plan/arrière des espaces
  2. Strip diacritiques en utilisant la fonction de Michael Kaplan ou équivalent
  3. Minuscules la chaîne pour canonicalisation
  4. Remplacer tous les caractères non-mot avec des tirets
+0

Pourquoi les stockeriez-vous dans la base de données? –

+0

pourquoi? vous n'avez pas à le faire. De manière générale, je pense que c'est plus optimal. Par exemple, que faire si vous voulez éditer ce slug/url particulier. Je ne sais pas peut-être le rendre plus court ou peu importe. vous ne pourrez pas le faire sans changer le champ du titre. Est-ce que ça fait du sens? – Victor