gpt4 book ai didi

c# - ASP.NET MVC ActionLink : Strange URL generated

转载 作者:行者123 更新时间:2023-12-01 20:05:28 26 4
gpt4 key购买 nike

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

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

The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int64' for method 'System.Web.Mvc.ActionResult Advance(Int64, Website.Core.StepType)' in 'Website.Controllers.CaseController'. To make a parameter optional its type should be either a reference type or a Nullable type.

最佳答案

目前自定义路线捕获太多

您的异常仅告诉您您的自定义路由正在捕获您不希望捕获的内容。因此,如果有对您的应用程序根 URL 的请求:

http://localhost/Website

您的自定义路线会捕获它。并设置其默认值。并调用您的 CaseController.Advance() 操作。当然会抛出异常,因为 id 未定义。

将自定义路由保留在默认路由前面

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

但是您应该做什么改变呢?如果只有一个 Controller 需要它,则将其更改为:

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

如果还有其他 Controller ,可以保持原样,只需添加约束即可:

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

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

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

在这种情况下,该路由将仅捕获那些实际定义了 id 的请求。当然,作为一个数字。

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

关于c# - ASP.NET MVC ActionLink : Strange URL generated,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2211463/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com