2016-12-21 115 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)導致鏈接正確生成。 –