0

我有一个“项目”控制器和一个“仪表板”操作,它采用一个名为“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 这样的 URL,我期待像 /1111/projects 这样的东西

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

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

注意:除了通用的“包罗万象”的路线外,我没有定义其他路线。我使用 ASP.NET MVC3。

4

2 回答 2

0

我能够复制您获得的结果的唯一方法是将“ProjectsHome”路由放在通用“catch-all”路由下方。当我将它放在通用路由之上时,ActionLink 会以您想要的形式生成 URL。

MVC 路由引擎会扫描路由表,直到找到可以匹配的路由表,这意味着它永远无法到达在 catch-all 之后定义的路由。

于 2012-06-15T05:18:06.503 回答
0

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

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

您错过了在地图路线中定义 accountID。

于 2012-06-15T09:10:17.073 回答