【问题标题】:MVC3: Why Html.Action does not generate the expected URLMVC3:为什么 Html.Action 不生成预期的 URL
【发布时间】:2012-06-15 04:14:45
【问题描述】:

我有一个“项目”控制器和一个“仪表板”操作,它采用名为“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

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

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

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

【问题讨论】:

  • 不确定到底发生了什么,但我无法再重现它了。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    地图路线需要这样定义 -

    routes.MapRoute( “项目之家”, "{accountID}/projects", 新的 { 控制器 = “项目”,动作 = “仪表板”,accountID = UrlParameter.Optional } );

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-22
      • 1970-01-01
      • 2018-02-05
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多