MVC Routing Html.ActionLink使用?id = 1而不是/ id创建URL

JK.*_*JK. 6 url asp.net-mvc asp.net-mvc-routing

当我使用Html.ActionLink()时,创建的URL不是所需的格式:

Html.ActionLink(Model.ProductCode, "Update", new { id = Model.ProductId })
Run Code Online (Sandbox Code Playgroud)

制作此网址

/Update?id=1
Run Code Online (Sandbox Code Playgroud)

当我想要这个网址时:

/Update/1
Run Code Online (Sandbox Code Playgroud)

什么路由选项创建第二个URL?这是我们首选的网址样式.

这两个URL都有效并且显示了正确的页面 - 但是我们只想使用/ id

在Global.asax中,MVC默认路由处理两个URL

routes.MapRoute(
    "Default",                                               // Route name
    "{controller}/{action}/{id}",                            // URL with parameters
    new { controller = "Home", action = "Index", id = "" }); // Parameter defaults
Run Code Online (Sandbox Code Playgroud)

Tom*_*mmy 2

我可以通过关于我的默认路由的路由仍然与一般模式匹配来复制该问题。例子:

\n\n
routes.MapRoute(\n                            "Default2", // Route name\n                            "{controller}/{action}", // URL with parameters\n                            new { controller = "Home", action = "Index"} // Parameter defaults\n                        );\n
Run Code Online (Sandbox Code Playgroud)\n\n

当放置在我的默认路由之上时,我的 URL 中会出现 ?id=1 。您能否确认此 ActionLink 未与您期望其匹配的路由之上的任何路由匹配?

\n\n

编辑:以下内容不会影响 URL

\n\n

然而,在其他场景中使用 UrlParameter.Optional 仍然是有利的。离开是为了繁荣,除非暴民统治另有规定。

\n\n
\n

新的 UrlParameter.Optional 值。如果您将 URL 参数的默认值设置为此特殊值,MVC 将确保从路由值字典中删除该键,以便它不存在。

\n
\n\n

我认为你需要稍微调整一下你的路线。将 id = "" 更改为 id = UrlParameter.Optional

\n\n
routes.MapRoute(\n                "Default", // Route name\n                "{controller}/{action}/{id}", // URL with parameters\n                new { controller = "Home", action = "Index", id = UrlParameter.Optional });\n
Run Code Online (Sandbox Code Playgroud)\n\n

这就是我们用于默认路由的内容,您正在寻找的行为就是我们的应用程序的行为方式。

\n