如何使这个支持Twitter的URL的ASP.NET MVC路由工作?

时间:2009-04-23 13:33:49

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

尝试以与http://site.com/username

相同的方式映射以下路线样式:http://www.twitter.com/user

我最初的解决方案是拥有这些路线:

//site.com/rathboma - maps to user details for rathboma
            routes.MapRoute("Users", "{id}", new { controller = "Users", action = "Details" });

            routes.MapRoute(
                "Default",                                              // Route name
                "{controller}/{action}/{id}",                           // URL with parameters
                new { controller = "Home", action = "Index", id = "oneday" }  // Parameter defaults
            );

这很好用,直到我尝试在我的'Links'控制器中执行以下操作:

public ActionResult Details(string id)
        {
            int newId;
            if (!int.TryParse(id, out newId))
                return RedirectToAction("Index");


            WebLink results = Service.GetWebLink(newId, 5);

            if (results == null)
                return RedirectToAction("Index");

            return View(results);
        }

这些RedirectToAction方法尝试将浏览器返回http://site.com/Users(我确实有一个用户控制器),而不是直接转到http://site.com/Links/index

为什么会这样?

我应该如何组织路线以使其正常工作?

如果必须的话,我很高兴牺牲http://site.com/links并转移到http://site.com/links/index。但是我该如何强制执行呢?

感谢所有人的帮助

修改

我知道造成这种情况的原因是,它正在尝试重定向到http://site.com/links(索引页面),但链接被选为用户名并重定向到/ users / details,当它找不到用户时'链接'它试图重定向到映射到/ users的UsersController Index操作,并且循环继续('users'不是它可以找到的用户,因此无限重定向)。

所以我想我的子问题是:如何让mvc始终使用/ links / index而不是仅仅使用/ links作为索引页面?

2 个答案:

答案 0 :(得分:2)

尝试在用户路线前添加此路线:

routes.MapRoute("Links", 
                "{controller}/{id}", 
                 new { controller = "Links", action = "Details" });

这应该适用于

http://mysite.com/Links/id

&安培;

http://mysite.com/username

答案 1 :(得分:0)

我相信在您的链接控制器中将RedirectToAction("Index");更改为RedirectToAction("Index", "Links");可以解决问题,而无需更改路由。

问题是你有两条非常贪婪的路线。我要做的是将默认路线分解为不那么贪婪的路线,如下所示:

routes.MapRoute("Links", 
                "Links/{id}", 
                 new { controller = "Links", action = "Index" });


routes.MapRoute("Users", 
                "{id}", 
                 new { controller = "Users", action = "Details" });

routes.MapRoute("Default", 
                "", 
                 new { controller = "Home", action = "Index" });

使网址如下:

site.com/links/5  - hits the Links controller
site.com/name     - hits the Users controller
site.com/         - hits the home controller