为什么以下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'。 使参数可选为其类型 应该是引用类型或 可空类型。
答案 0 :(得分:2)
是的,如果没有“{controller} / {action} / {id} / {step}”这样的路由,那么ActionLink方法只会将“step”作为查询字符串参数传递。
答案 1 :(得分:2)
您的例外只会告诉您自定义路由正在捕获您不想捕获的内容。因此,如果您的应用程序根URL有请求:
您的自定义路线会抓住它。并设置它的默认值。并致电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生成有效链接,则至少意味着您的路线设置正确。