2016-12-21 57 views
1

我正在创建一个带有可选参数的路由的ASP.NET Core WebAPI。在返回结果中,我嵌入到“上一页”和“下一页”页面的链接。我使用Url.Link()来生成这些链接,但创建的链接不会生成正确的URL。Url.Link()没有与查询字符串生成正确的链接

示例代码:

[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 }); 
    ... 

产生的将是这样的网址:

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

我要的是:

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

什么我在这里做错了吗?

回答

2

我认为你正在做的一切都在这里。它只是MVC能够将Url.Link中的[page]值与路由约束HttpGet(“{page:int?}”)相匹配,从而将其附加为URL路径的一部分,例如results/1 From docs - 与参数不匹配的环境值将被忽略,并且环境值也会在显式提供的值覆盖该值时忽略,即在URL中从左向右。显式提供但与任何值不匹配的值添加到查询字符串。 在你的情况,

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

会导致

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

因此,ether会自己添加查询字符串参数,移除约束或切换到URL的MVC推荐格式,例如,/api/results/xxx

+1

就是这样,我需要删除页面有一个路由约束。 [HttpGet(Name =“GetResultsRou​​te”)] public IActionResult GetResults([FromQuery] int page = 0)导致链接正确生成。 –