ASP.NET MVC ActionLink:生成奇怪的URL

时间:2010-02-06 00:44:00

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

为什么以下Html.ActionLink致电:

Html.ActionLink("Approve", "Advance", new { id = Model.ID, step = StepType.Approve })

生成带有查询参数的URL,而不是“restful”URL,即:

http://localhost/Website/Case/Advance/1?step=Refer

我只注册了默认路由,是否需要其他路由才能理解“StepType”参数是什么?

我已尝试在 默认路线后添加此路线:

routes.MapRoute(
    "CaseAdvance",
    "{controller}/{action}/{id}/{step}",
    new {controller = "Case", action = "Advance", id = "", step = StepType.Refer});

但它没有效果。添加新路线注册之前默认值会给我一个错误:

  

参数字典包含一个   参数'id'的null条目   非可空类型'System.Int64'   方法'System.Web.Mvc.ActionResult   Advance(Int64,Website.Core.StepType)'   在   'Website.Controllers.CaseController'。   使参数可选为其类型   应该是引用类型或   可空类型。

4 个答案:

答案 0 :(得分:2)

是的,如果没有“{controller} / {action} / {id} / {step}”这样的路由,那么ActionLink方法只会将“step”作为查询字符串参数传递。

答案 1 :(得分:2)

目前自定义路线捕捉太多

您的例外只会告诉您自定义路由正在捕获您不想捕获的内容。因此,如果您的应用程序根URL有请求:

http://localhost/Website

您的自定义路线会抓住它。并设置它的默认值。并致电CaseController.Advance()行动。当然抛出异常,因为id未定义。

将您的自定义路线保留在默认路线

之前

但您必须更改自定义路由或向其添加路由约束,以便它实际上只捕获那些要捕获的请求。

但是你应该做哪些改变?如果只有一个控制器需要它而不是将其改为:

routes.MapRoute(
    "CaseAdvance",
    "Case/{action}/{id}/{step}",
    new { controller = "Case", action = "Advance", id = "", step = StepType.Refer});

如果有其他控制器井,您可以保持原样,只需添加约束:

routes.MapRoute(
    "CaseAdvance",
    "{controller}/{action}/{id}/{step}",
    new { controller = "Case", action = "Advance", id = "", step = StepType.Refer},
    new { controller = "Case|Other" });

如果可以有任何控制器,您可以要求您的id为数字:

routes.MapRoute(
    "CaseAdvance",
    "{controller}/{action}/{id}/{step}",
    new { controller = "Case", action = "Advance", id = "", step = StepType.Refer},
    new { id = @"\d+" })

在这种情况下,此路由仅捕获实际定义了id的请求。作为一些课程。

你会知道哪一个最适合你。

答案 2 :(得分:1)

在你的路线中,你已经指定了一个stepType参数,但你传递了一个名为step的参数。

您的actionlink参数名称必须与路由参数名称匹配,否则您将获得您所看到的内容。

编辑:好的,你在输入这个答案时更改了你的代码!!

答案 3 :(得分:1)

尝试使用RouteLink,看看它是否适合您。

Html.RouteLink("Approve", "CaseAdvance", new { controller = "Case", action = "Advance", id = Model.ID, step = StepType.Approve })

如果调用RouteLink生成有效链接,则至少意味着您的路线设置正确。