为什么以下 Html.ActionLink 称呼:

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

生成具有查询参数的URL,而不是“静止”的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'for Method'system.web.mvc.mvc.actionsult Advance(int64,weblity.core.steptype)'neblets.controllers.cocontrollers.casecontroller '。要使参数可选,其类型应为参考类型或可随机类型。

有帮助吗?

解决方案

此刻的自定义路线捕捉太多

您的异常只告诉您,您的自定义路线正在捕获您不打算捕捉的东西。因此,如果要对您的应用程序root 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的请求。当然。

您会知道哪种最适合您。

其他提示

是的,如果没有途径,例如“ {Controller}/{Action}/{ID}/{step}”,那么ActionLink方法将简单地将“步骤”作为QueryString参数传递。

在您的路线中,您指定了Steptype的参数,但是您传递了一个称为步骤的参数。

您的ActionLink参数名称必须与路由参数名称匹配,否则您将完全了解您所看到的内容。

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

尝试使用 Routelink 看看这是否对您有用。

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

如果调用Routelink产生有效的链接,则至少意味着您的路由已正确设置。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top