我正在创建一个 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
我在这里做错了什么?
我认为你所做的一切都在这里。只是 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
因此,请自行附加查询字符串参数,删除约束,或切换到 MVC 推荐的 URL 格式,例如/api/结果/xxx