有没有办法从控制器更改当前的 url 参数,以便在加载页面时,地址栏中会显示其他/不同的参数?
这就是我的意思,假设我有一个动作“产品”:
public ActionResult Product(int productId)
{
..
}
我映射了路由,以便product/4545/purple-sunglasses
映射到上面的函数,产品名称实际上被忽略了,但我想要,如果没有指定产品名称,控制器应该添加这个,所以产品很容易进入搜索引擎等。
有没有办法从控制器更改当前的 url 参数,以便在加载页面时,地址栏中会显示其他/不同的参数?
这就是我的意思,假设我有一个动作“产品”:
public ActionResult Product(int productId)
{
..
}
我映射了路由,以便product/4545/purple-sunglasses
映射到上面的函数,产品名称实际上被忽略了,但我想要,如果没有指定产品名称,控制器应该添加这个,所以产品很容易进入搜索引擎等。
看看这里: http: //www.dominicpettifer.co.uk/Blog/34/asp-net-mvc-and-clean-seo-friendly-urls
有一个很长的描述如何做到这一点。最后一部分告诉您有关 301 重定向的信息,您应该使用它来指示搜索引擎爬虫可以在您希望的所需 URL 下找到该页面。
不要忘记查看 url-encoding,应该可以为您节省一些工作并提供更高质量的 url。
以下是博客文章中的一些基本片段:
设置您的路由:
routes.MapRoute(
"ViewProduct",
"products/{id}/{productName}",
new { controller = "Product", action = "Detail", id = "", productName = "" }
);
将名称部分添加到您的控制器并检查它是否是正确的名称:
public ActionResult Detail(int id, string productName)
{
Product product = IProductRepository.Fetch(id);
string realTitle = product.Title; // Add encoding here
if (realTitle != urlTitle)
{
Response.Status = "301 Moved Permanently";
Response.StatusCode = 301;
Response.AddHeader("Location", "/Products/" + product.Id + "/" + realTitle); // Or use the UrlHelper here
Response.End();
}
return View(product);
}
更新
网址显然已损坏。本文描述了大部分相同的功能: http: //www.deliveron.com/blog/post/SEO-Friendly-Routes-with-ASPnet-MVC.aspx
感谢 Stu1986C 的评论/新链接!