我在SO中已经看过这个问题几次了,但没有一个有任何可以接受的答案:
ASP.NET MVC @Url.Action includes current route data
ASP.NET MVC implicitly adds route values
基本上,我的Controller有一个名为Group的操作方法,它有一个重载,它不接收任何参数并显示元素列表,另一个重载接收id并显示该组的详细信息。
如果我这样做:
Url.Action("Group", "Groups");
从站点的主页(/),它返回一个url,如下所示:
"mysite.com/Groups/Group"
现在,如果站点的当前地址是/Groups/Group/1,并且我调用相同的方法,这就没问题了
Url.Action("Group", "Groups");
返回的url如下:
"mysite.com/Groups/Group/1"
它会在生成URL时自动添加当前页面的路由值。即使我以这种方式生成URL:
Url.Action("Group", "Groups", null);
因此,显式指定我不需要任何路由值,生成的URL是相同的。为了获得我想要的地址,我必须显式地将路由值设置为空字符串,如下所示:
Url.Action("Group", "Groups", new {id=""});
这将生成以下url:
"mysite.com/Groups/Group"
我的问题是,为什么会发生这种情况?如果我没有设置任何路由值,它就不应该将它们添加到生成的URL中。
发布于 2011-08-21 01:08:00
如果您没有显式设置当前的请求参数,Url.Action将重用这些参数。它是由出站url匹配算法设计的。在url生成过程中查找路由数据参数时,参数取自:
1)显式提供的值
2)当前请求的值
3)默认值
按照我上面指定的顺序。
路由的出站匹配算法很复杂,因此最好像在示例中那样显式设置请求的所有参数
发布于 2013-04-28 22:24:30
因此,当我阅读objectbox的答案时,我认为我必须修改代码中的几个链接。然后,我尝试添加一个默认路由,省略了默认参数,从而解决了问题:
routes.MapRoute(
"ArtistArtworkDefPage",
"Artist/{username}/Artwork",
new
{
controller = "Artist",
action = "Artwork",
page = 1
}
);
routes.MapRoute(
"ArtistArtwork",
"Artist/{username}/Artwork/{page}",
new
{
controller = "Artist",
action = "Artwork",
page = 1
},
new { page = @"\d+" }
);
发布于 2017-03-10 18:27:42
简单的例子:
public class ProductController : Controller
{
public ActionResult Edit(int id)
{
return View();
}
[Route("Product/Detail/{id:int}")]
public ActionResult Detail(int id)
{
return View();
}
}
编辑视图仅包含以下内容:
@{ Layout = null;}
@Url.Action("Detail", "Cmr")
所以当你运行你的站点,比如localhost:randomPort/Product/Edit/123
,你会得到下一个响应:/Product/Detail/123
为什么?因为Route
属性具有必需的参数id
。Id参数是从url读取的,尽管我们只写了Url.Action(methodName, controller)
--没有指定参数。此外,没有id的方法细节也是没有意义的。
为了使属性起作用,必须将下一行添加到RouteConfig.cs
public static void RegisterRoutes(RouteCollection routes)
{
...
routes.MapMvcAttributeRoutes();
...
}
https://stackoverflow.com/questions/7133223
复制相似问题