从控制器更改URL?

7

有没有一种方式可以从控制器更改当前url参数,以便在加载页面时,在地址栏中显示其他/不同的参数?

这是我的意思,假设我有一个名为“Products”的操作:

public ActionResult Product(int productId)
{
  ..
}

我映射了路由,使得product/4545/purple-sunglasses被映射到上面的函数,实际上产品名称被忽略了,但是我希望,如果没有指定产品名称,控制器应该添加它,这样产品就可以轻松地进入搜索引擎等。

1个回答

7
请看这里:http://www.dominicpettifer.co.uk/Blog/34/asp-net-mvc-and-clean-seo-friendly-urls 其中有非常详细的说明。最后一部分告诉您需要使用301重定向,以指示搜索引擎爬虫所需URL下找到该页面。
不要忘记查看URL编码,可以为您节省一些工作并提供高质量的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提供的评论/新链接!


2
谢谢。顺便说一句,将链接内容的关键部分复制到您的帖子中始终是一个好习惯,这样如果明天该链接失效,用户仍然可以从您的答案中受益。此外,这样做也更易于访问,答案对人们来说也更加可见。 - Shimmy Weitzhandler
2
该链接已失效。以下是新链接:http://www.deliveron.com/blog/post/SEO-Friendly-Routes-with-ASPnet-MVC.aspx - Stu1986C
已将新链接添加到答案中。谢谢! - René Wolferink
1
今天起这两个链接都已失效。 - Youp Bernoulli
毫不奇怪,经过这么长时间后它已经消失了。无论如何,代码的基本部分已经在答案中了。 - René Wolferink

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接