Créez d'abord une route :
routes.MapRoute(
"ViewProduct",
"Products/{id}/{productName}",
new { controller = "Product", action = "Details", id = "", productName = "" }
);
Ensuite, créez la méthode Action comme suit :
public ActionResult Details(int? id, string productName)
{
Product product = ProductRepository.Fetch(id);
string realTitle = UrlEncoder.ToFriendlyUrl(product.Title);
string urlTitle = (productName ?? "").Trim().ToLower();
if (realTitle != urlTitle)
{
string url = "/Products/" + product.Id + "/" + realTitle;
return new PermanentRedirectResult(url);
}
return View(product);
}
En fait, vous comparez le titre de l'entité dans l'URL avec celui stocké dans la base de données. S'ils ne correspondent pas, vous effectuez une redirection permanente 301. Assurez-vous qu'il s'agit d'une redirection "permanente" (code de statut 301) et non d'une redirection temporaire (302). De cette façon, les moteurs de recherche considéreront qu'il s'agit d'un changement permanent de l'URL et mettront à jour leurs index en conséquence. Cela peut se produire si le titre de votre entité change après qu'un moteur de recherche l'a indexée (par exemple, quelqu'un change le nom du produit).
Une autre chose à savoir, si votre titre autorise du texte libre, vous devez supprimer tous les caractères qui ne sont pas valides pour une URL, et le rendre plus lisible pour les humains et les moteurs de recherche, d'où la méthode UrlEncoder.ToFriendlyUrl dans le code ci-dessus, la mise en œuvre est ci-dessous :
public static class UrlEncoder
{
public static string ToFriendlyUrl (this UrlHelper helper,
string urlToEncode)
{
urlToEncode = (urlToEncode ?? "").Trim().ToLower();
StringBuilder url = new StringBuilder();
foreach (char ch in urlToEncode)
{
switch (ch)
{
case ' ':
url.Append('-');
break;
case '&':
url.Append("and");
break;
case '\'':
break;
default:
if ((ch >= '0' && ch <= '9') ||
(ch >= 'a' && ch <= 'z'))
{
url.Append(ch);
}
else
{
url.Append('-');
}
break;
}
}
return url.ToString();
}
}
Ainsi, lorsque vous écrivez les URL dans la vue, assurez-vous de coder les titres avec cette méthode, par ex.
<a href="http://stackoverflow.com/Products/@Model.Id/@Url.ToFriendlyUrl(Model.Title)">@Model.Title</a>
J'ai écrit un article sur ce sujet ici. http://www.dominicpettifer.co.uk/Blog/34/asp-net-mvc-and-clean-seo-friendly-urls