首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ASP.NET MVC Url.Action将当前路由值添加到生成的url中

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

Stack Overflow用户
提问于 2011-08-21 00:52:27
回答 5查看 34.6K关注 0票数 54

我在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中。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-08-21 01:08:00

如果您没有显式设置当前的请求参数,Url.Action将重用这些参数。它是由出站url匹配算法设计的。在url生成过程中查找路由数据参数时,参数取自:

1)显式提供的值

2)当前请求的值

3)默认值

按照我上面指定的顺序。

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

票数 51
EN

Stack Overflow用户

发布于 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+" }
);
票数 2
EN

Stack Overflow用户

发布于 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();
  ...
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7133223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档