MVC3:为什么Html.Action不生成预期的URL

时间:2012-06-15 04:14:45

标签: asp.net-mvc-3 url-routing

我有一个“项目”控制器和一个“仪表板”操作,它采用名为“accountID”的参数。

 public ActionResult Dashboard(String accountID)
 {
     return View();
 }

我的路线定义如下:

routes.MapRoute(
    "ProjectsHome",
    "{accountID}/projects",
    new { controller = "Projects", action = "Dashboard" }
);

我们的想法是拥有一个像/ 1111 / projects这样的URL,其中1111代表accountID。然后,URL将执行Projects控制器的Dashboard操作。

我面临的问题是@Html.ActionLink("Projects", "Dashboard", "Projects", new { accountID = "1111" }, null)生成一个像/ Projects / Dashboard?accountID = 1111这样的网址,我期待像/ 1111 / projects

这样的东西

我的解决方法是使用@Url.RouteUrl("ProjectsHome", new { accountID = "1111"}),但我想知道为什么Html.ActionLink不会选择我定义的路由并相应地格式化URL?

另一个有趣的事实是,在控制器的一个代码中,我有类似return RedirectToAction("Dashboard", "Projects", new { accountID = newAccount.ID });的东西,它按照我的预期构建了URL。

注意:我没有定义其他路线,除了通用的“全能”路线。我使用ASP.NET MVC3。

2 个答案:

答案 0 :(得分:0)

我能够复制你得到的结果的唯一方法是将“ProjectsHome”路线置于下面的通用“全能”路线。当我将它放在通用路线上方时,ActionLink会以您想要的形式生成URL。

MVC路由引擎扫描路由表,直到它找到一个可以匹配的路由表,这意味着它永远不会到达捕获所有路径之后的已定义路由。

答案 1 :(得分:0)

地图路线需要像这样定义 -

routes.MapRoute(     “ProjectsHome”     “{帐户ID} /工程”,     new {controller =“Projects”,action =“Dashboard”, accountID = UrlParameter.Optional } );

您错过了在地图路线中定义帐户ID。