首先創建一個路由:
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