首先创建一个路由:
routes.MapRoute(
"ViewProduct",
"Products/{id}/{productName}",
new { controller = "Product", action = "Details", id = "", productName = "" }
);
然后创建操作方法如下所示:
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);
}
你基本上在URL与一个存储在数据库中比较实体名称,如果它们不匹配,则执行301永久重定向。确保它是一个'永久'重定向(301状态码),而不是临时重定向(302)。这样,搜索引擎会将其视为网址的永久变更,并相应地更新其索引,如果实体的标题在搜索引擎编入索引后发生变化(例如,某人更改了产品名称),则可能会发生这种情况。
另一件需要注意的事情是,如果您的标题允许任何自由文本,您需要删除任何对URL无效的字符,并使其对人类和搜索引擎更具可读性,因此UrlEncoder.ToFriendlyUrl在上面的代码方法,实现的过程如下:
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();
}
}
所以,当你写出来的网址进入查看时,一定要使用这种方法如编码标题
<a href="/Products/@Model.Id/@Url.ToFriendlyUrl(Model.Title)">@Model.Title</a>
我写这个博客张贴在这里http://www.dominicpettifer.co.uk/Blog/34/asp-net-mvc-and-clean-seo-friendly-urls
看到这个相关的问题和答案http://stackoverflow.com/questions/2174820/how-to-add-page-title-in-url-in-asp-net-mvc-url-generation和http:/ /stackoverflow.com/questions/677158/stackoverover-question-routing – jao 2011-05-19 07:51:15