动作命中MVC后更改URL?

时间:2012-11-26 17:04:11

标签: c# asp.net-mvc url url-routing

我想改变:

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。

由于可能导致的持续维护,我无法通过重定向规则执行此操作。

  1. 控制器是否适合这样做? - 请记住,在我使用ID从数据库中检索之前,我可能没有我的标题

  2. 如何更改网址以显示标题与ID?

2 个答案:

答案 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存储在数据库中是唯一的另一种选择。

* 如果你打算这样做会有一些观点。 *

  1. 在数据库级别向列添加唯一约束以避免重复。

  2. 在此列上创建数据库索引以加快阅读速度。

  3. 所以使用此Url

    www.testurl.com/sports/blog/test-title-of-blog
    

    这是您唯一的slug,您将查询数据库而不是ID

    test-title-of-blog