ASP.NET MVC Url.Action将当前路由值添加到生成的URL

wil*_*lvv 53 url model-view-controller asp.net-mvc routing

我在这里已经多次看到过这个问题,但是没有一个问题可以接受:

ASP.NET MVC @ Url.Action包括当前路由数据
ASP.NET MVC隐式添加路由值

基本上我有一个名为Group的动作方法的Controller,它有一个不接收参数的重载并显示一个元素列表,另一个接收一个id并显示该组的详细信息.

如果我做这样的事情:

Url.Action("Group", "Groups");
Run Code Online (Sandbox Code Playgroud)

从网站的主页面(/)它返回一个这样的网址:

"mysite.com/Groups/Group"
Run Code Online (Sandbox Code Playgroud)

没关系现在,如果站点的当前地址是/ Groups/Group/1并且我调用相同的方法

Url.Action("Group", "Groups");
Run Code Online (Sandbox Code Playgroud)

返回的网址是这样的:

"mysite.com/Groups/Group/1"
Run Code Online (Sandbox Code Playgroud)

它会在生成URL时自动为当前页面添加路由值.即使我这样生成URL:

Url.Action("Group", "Groups", null);
Run Code Online (Sandbox Code Playgroud)

因此,明确指定我不想要任何路由值,生成的URL是相同的.要获取我想要的地址,我必须将路由值显式设置为空字符串,如下所示:

Url.Action("Group", "Groups", new {id=""});
Run Code Online (Sandbox Code Playgroud)

这将生成以下URL:

"mysite.com/Groups/Group"
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么会发生这种情况?如果我没有设置任何路由值,则不应将它们添加到生成的URL中.

obj*_*box 50

如果您没有明确设置它们,Url.Action将重用当前请求参数.它是出站网址匹配算法的设计.在生成url的过程中查找路径数据参数时,参数取自:

1)明确提供的值

2)来自当前请求的值

3)默认值

按照我上面指定的顺序.

路由的出站匹配算法很复杂,因此最好为请求显式设置所有参数,就像在示例中所做的那样

  • 对我来说,这会导致比解决更多的问题.我希望有一种简单的方法来禁用它. (21认同)
  • 罗伯特你能解释一下这种默认行为有帮助的场景吗?Url.Action 正在从页面中获取默认参数,在我的情况下,这些参数与生成的 URL 无关。 (2认同)