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

时间:2012-01-04 02:37:23

标签: asp.net-mvc url asp.net-mvc-routing

当我使用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

4 个答案:

答案 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)

请参阅This question/answer

您使用的是哪个版本的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 }
            );