2

为什么以下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});

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

参数字典包含“Website.Controllers.CaseController”中方法“System.Web.Mvc.ActionResult Advance(Int64, Website.Core.StepType)”的不可为空类型“System.Int64”的参数“id”的空条目'。要使参数可选,其类型应该是引用类型或 Nullable 类型。

4

4 回答 4

2

是的,如果没有诸如“{controller}/{action}/{id}/{step}”之类的路由,那么 ActionLink 方法将简单地将“step”作为查询字符串参数传递。

于 2010-02-06T00:46:49.963 回答
2

自定义路线目前捕获太多

您的异常仅告诉您自定义路线正在捕获您不打算捕获的东西。因此,如果有对您的应用程序根 URL 的请求:

http://localhost/网站

您的自定义路线会抓住它。并设置它的默认值。并呼吁你的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 的请求。当然,作为一个数字。

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

于 2010-02-06T22:51:59.600 回答
1

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

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

编辑:好的,您在我输入此答案时更改了代码!

于 2010-02-06T00:58:20.833 回答
1

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

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

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

于 2010-02-06T01:40:05.660 回答