我想改变:
www.testurl.com/sports/blog/1
体育是我的区域,博客是我的行动,1是博客文章的ID,以:
www.testurl.com/sports/blog/test-title-of-blog
博客仍然是我的行动但是ID没有显示,而是博客的标题/永久链接。
以下是此行动的AreaRegistration:
context.MapRoute(
"sports",
"sports/{action}/{content}",
new { area = "Sports", controller = "Sports", action = "", content = "" });
这是我目前的行动:
[HttpGet]
public ActionResult Blog(string content)
{
int contentId;
if (Int32.TryParse(content, out contentId))
{
model = service.GetBlogById(contentId);
}
else
{
model = service.GetBlogByTitle(content);
}
//Change URL to be: www.testurl.com/sports/blog/ + model.SEOFriendlyTitle
return View(model);
}
用户可以通过博客的ID进行搜索,也可以通过其标题进行搜索,但我只希望标题出现在网址栏中,而不是ID。
由于可能导致的持续维护,我无法通过重定向规则执行此操作。
控制器是否适合这样做? - 请记住,在我使用ID从数据库中检索之前,我可能没有我的标题
如何更改网址以显示标题与ID?
答案 0 :(得分:2)
我认为如果ID是数字并且是有效的contentId,您应该将RedirectResult返回到新的Url:
int contentId;
if (Int32.TryParse(content, out contentId))
{
model = service.GetBlogById(contentId);
if(model != null)
{
return RedirectResult(/*url using the title*/);
}
}
else
{
model = service.GetBlogByTitle(content);
}
//Change URL to be: www.testurl.com/sports/blog/ + model.SEOFriendlyTitle
return View(model);
当然,这将导致另一次往返服务器,但我可以看到一种方法来更改浏览器URL而无需重定向页面。您还应确保您网站上所有已发布的网址都使用的是标题而不是ID。
我希望它会有所帮助。
答案 1 :(得分:0)
我建议快速阅读。
http://www.dominicpettifer.co.uk/Blog/34/asp-net-mvc-and-clean-seo-friendly-urls
如果你真的不能在Url中拥有ID并且不想进行重定向,那么我认为将Url作为Slugs存储在数据库中是唯一的另一种选择。
* 如果你打算这样做会有一些观点。 *
在数据库级别向列添加唯一约束以避免重复。
在此列上创建数据库索引以加快阅读速度。
所以使用此Url
www.testurl.com/sports/blog/test-title-of-blog
这是您唯一的slug,您将查询数据库而不是ID
test-title-of-blog