【问题标题】:Url.Link() not generating proper link with querystringUrl.Link() 没有使用查询字符串生成正确的链接
【发布时间】:2017-05-06 07:49:02
【问题描述】:

我正在创建一个 ASP.NET Core WebAPI,它有一个带有可选参数的路由。在返回结果中,我嵌入了指向“上一个”和“下一个”页面的链接。我正在使用 Url.Link() 生成这些链接,但创建的链接没有生成正确的 URL。

示例代码:

  [HttpGet("{page:int?}", Name = "GetResultsRoute")]
  public IActionResult GetResults([FromQuery]int page = 0)
  {
     ...
     var prevUrl = Url.Link("GetResultsRoute", new { page = page - 1 });
     var nextUrl = Url.Link("GetResultsRoute", new { page = page + 1 });
     ...

生成的 URL 将类似于:

http://localhost:65061/api/results/1

我想要的是:

http://localhost:65061/api/results?page=1

我在这里做错了什么?

【问题讨论】:

    标签: asp.net-web-api asp.net-core asp.net-web-api-routing


    【解决方案1】:

    我认为您正在这里做所有事情。它只是 MVC 能够将 Url.Link 中的 [page] 值与路由约束 HttpGet("{page:int?}" 匹配,从而将其附加为 URL 路径的一部分,例如 results/1 来自docs - 与参数不匹配的环境值将被忽略,并且当显式提供的值覆盖它时,也会忽略环境值,在 URL 中从左到右。 将明确提供但不匹配任何内容的值添加到查询字符串中。 在你的情况下,

    var prevUrl = Url.Link("GetResultsRoute", new { pageX = page - 1 });
    

    会导致

    http://localhost:65061/api/results?pageX=1

    所以ether自己附加查询字符串参数,删除约束,或切换到URL的MVC推荐格式,例如/api/results/xxx

    【讨论】:

    • 就是这样,我需要删除有路由约束的页面。 [HttpGet(Name = "GetResultsRou​​te")] public IActionResult GetResults([FromQuery]int page = 0) 导致链接正确生成。
    猜你喜欢
    • 1970-01-01
    • 2014-08-06
    • 2013-01-20
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 2013-08-06
    相关资源
    最近更新 更多