En primer lugar crear una ruta:
routes.MapRoute(
"ViewProduct",
"Products/{id}/{productName}",
new { controller = "Product", action = "Details", id = "", productName = "" }
);
A continuación, cree el método de acción, así:
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);
}
Básicamente, se está comparando el título de una entidad en la dirección URL con la que está almacenada en la base de datos, si no coinciden, realice una redirección permanente 301. Asegúrese de que sea una redirección 'permanente' (código de estado 301) en lugar de una redirección temporal (302). De esta manera, los motores de búsqueda lo tratarán como un cambio permanente de la URL y actualizarán sus índices en consecuencia, esto podría suceder si el título de su entidad cambia después de que un motor de búsqueda lo haya indexado (por ejemplo, alguien cambia el nombre del producto).
Otra cosa que debe tener en cuenta, si su título permite texto libre, debe eliminar cualquier carácter que no sea válido para una URL y hacerlo más legible para humanos y motores de búsqueda, de ahí el UrlEncoder.ToFriendlyUrl método en el código anterior, la ejecución es el siguiente:
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();
}
}
Así que cuando usted escribe las direcciones URL en la vista, asegúrese de codificar los títulos con este método por ejemplo,
<a href="/Products/@Model.Id/@Url.ToFriendlyUrl(Model.Title)">@Model.Title</a>
He escrito un post sobre esto aquí http://www.dominicpettifer.co.uk/Blog/34/asp-net-mvc-and-clean-seo-friendly-urls
vea esta pregunta y respuestas relacionadas http://stackoverflow.com/questions/2174820/how-to-add-page-title-in-url-in-asp-net-mvc-url-generation y http://stackoverflow.com/questions/677158/stack-overflow-question-routing – jao