当我使用Html.ActionLink()时,创建的URL不是所需的格式:
Html.ActionLink(Model.ProductCode, "Update", new { id = Model.ProductId })
建立此网址
/Update?id=1
当我想要这个网址时:
/Update/1
哪些路由选项会创建第二个网址?这是我们首选的网址样式。
两个网址都有效并且显示了正确的页面 - 但我们只想使用/ id
在Global.asax中,MVC默认路由处理两个URL
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" }); // Parameter defaults
答案 0 :(得分:3)
我可以通过一条关于我的默认路线的路线来复制这个问题,这条路线仍然符合一般模式。例如:
routes.MapRoute(
"Default2", // Route name
"{controller}/{action}", // URL with parameters
new { controller = "Home", action = "Index"} // Parameter defaults
);
当我的默认路线上方有位置时,我的网址中会出现?id = 1。你能否确认这个ActionLink不匹配你期望它匹配的路线上方的任何路线?
编辑:以下内容不会影响网址
但是,在其他方案中使用UrlParameter.Optional仍然是有利的。除非暴民统治另有说法,否则就要走向繁荣。
新的UrlParameter.Optional值。如果为a设置默认值 此特殊值的URL参数,MVC确保删除该键 从路由值字典中,它不存在。
我认为你需要稍微调整你的路线。将id =“”更改为id = UrlParameter.Optional
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional });
这是我们用于默认路由的行为,您正在寻找的行为是我们的应用程序的行为方式。
答案 1 :(得分:0)
您使用的是哪个版本的MVC?如果您使用的是MVC3,则需要在调用Html.ActionLink()
时添加第四个参数,并传入null
。
答案 2 :(得分:0)
我偶然发现了这一点并决定回答。事实证明,Url.Action()和Html.ActionLink()都使用路由集合中的第一个路由来格式化生成的URL。因此,RegisterRoutes()中的第一个映射路由为:
routes.MapRoute(
name: "Default",
url: "{controller}/{id}/{action}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
而不是“{controller} / {action} / {id}”。路线名称(即“默认”)无关紧要,只有订单才重要
答案 3 :(得分:0)
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);