MVC URL结构

时间:2013-10-23 15:14:43

标签: asp.net-mvc asp.net-mvc-routing actionlink

在Index.cshtml中有以下链接:

 @Html.ActionLink("Edit", "Edit", new { clientId = item.ClientId ,      overrideId=item.OverrideId})

并路由为:

 routes.MapRoute(
          name: "Edit",
           url: "{controller}/{action}/{clientId}/{overrideId}",
          defaults: new { controller = "ClientOverride", action = "Edit", clientId =       UrlParameter.Optional, overrideId = UrlParameter.Optional }
       );

从Index到Edit重定向时,会创建以下URL:

... / clientoverride /编辑/ 6?overrideId = 1

虽然我希望有类似的东西:

... / clientoverride /编辑/ 6/1

为什么会创建如此不一致的URL?我该怎么做才能使它看起来像一个树结构,最后是clientoverride / edit / 6/1?

2 个答案:

答案 0 :(得分:0)

尝试使用Html.RouteLink代替Html.ActionLink

对于具有多个参数的路由的链接,最好使用@Html.RouteLink作为自定义路由。

在您的实例中,您使用@Html.RouteLink("Edit", "Edit", new { clientId = item.ClientId, overrideId = item.OverrideId})

以上示例使用Html.RouteLink(LINKTEXT, ROUTENAME, VALUES)

您获得所见URL的原因是Html.ActionLink始终采用默认路由格式,因此任何其他参数最终都会转换为查询字符串。

确保您的自定义路线也高于默认路线。

答案 1 :(得分:0)

将此放在用于clientoverride控制器的所有规则之上: -

    routes.MapRoute(
         name: "Edit",
          url: "{controller}/{action}/{clientId}/{overrideId}",
         defaults: new { controller = "ClientOverride", action = "Edit", clientId = UrlParameter.Optional, overrideId = UrlParameter.Optional }
      );

由于您的默认路线图正在以此格式/clientoverride/edit/6?overrideId=1形成网址。因此,在更改序列后,它将解决您的问题。