wyc*_*ean 31 asp.net-mvc routes
如果缺少部分URL,如何将ASP.NET MVC中的请求重定向到其正确的规范版本?
使用Stack Overflow作为示例,站点将问题标题添加到其路径的末尾,但使用路径中的问题ID来实际查找问题.如果省略标题,您将被重定向到正确的URL.
例如,访问URL:
stackoverflow.com/questions/9033
Run Code Online (Sandbox Code Playgroud)
将重定向到
stackoverflow.com/questions/9033/hidden-features-of-c
Run Code Online (Sandbox Code Playgroud)
这是如何运作的?
Sun*_*oot 39
首先创建一条路线:
routes.MapRoute(
"ViewProduct",
"Products/{id}/{productName}",
new { controller = "Product", action = "Details", id = "", productName = "" }
);
Run Code Online (Sandbox Code Playgroud)
然后像这样创建Action方法:
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);
}
Run Code Online (Sandbox Code Playgroud)
您基本上将URL中的实体标题与存储在数据库中的实体标题进行比较,如果它们不匹配则执行301永久重定向.确保它是"永久"重定向(301状态代码)而不是临时重定向(302).这样,搜索引擎会将其视为URL的永久更改,并相应地更新其索引,如果在搜索引擎索引后实体的标题发生更改(例如某人更改了产品名称),则可能会发生这种情况.
另外需要注意的是,如果你的标题允许任何自由文本,你需要删除任何对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();
}
}
Run Code Online (Sandbox Code Playgroud)
因此,当您将URL写入视图时,请务必使用此方法对标题进行编码,例如
<a href="/Products/@Model.Id/@Url.ToFriendlyUrl(Model.Title)">@Model.Title</a>
Run Code Online (Sandbox Code Playgroud)
我在这里写了一篇博客文章http://www.dominicpettifer.co.uk/Blog/34/asp-net-mvc-and-clean-seo-friendly-urls