我正在尝试为复杂类型的搜索构建Web API。我想在结果中支持分页。搜索的“状态”很复杂,因此不适合持久存储在查询字符串中。但我希望将分页选项包含在查询字符串中。
我已经实现了两个方法,如下所示,并且web api代码似乎以了解我正在尝试做什么,但查询字符串参数永远不会被分配。有任何提示或建议将不胜感激:
public Task<HttpResponseMessage<SearchResults>> Post(SearchRequest request) //Method 1
{
return Post(request, null, null);
}
public async Task<HttpResponseMessage<SearchResults>> Post(SearchRequest request, string page, string pageSize) //Method 2
{
//All of the complex code, including...
if (PageNo < TotalPages)
{
searchResults.AddLink(new Link { Uri = Url.Route("DefaultApi", new {
controller = "AdvancedSearch",
page = (PageNo + 1).ToString(),
pageSize = PageSize.ToString() }),
Relation = "nextPost" });
}
//Final wrap up, etc
}
在将SearchRequest
发布到/api/AdvancedSearch
时,会调用方法1,然后调用方法2进行搜索,然后打包结果。正如您所希望看到的那样,包含在此结果中(如果有更多结果页面可用)是要发布到下一页的URL。生成的URL基于此/api/AdvancedSearch?page=2&pageSize=20
,正如我所希望的那样。
在我的调用代码中,我然后对第二个URL执行POST
。仅调用方法2(如预期的那样)。但是,page
和pageSize
都是null
。
我做错了什么?或者你还需要看到什么才能回答这个问题?
答案 0 :(得分:0)
您需要使用 [FromUri]
:
public async Task<HttpResponseMessage<SearchResults>> Post(SearchRequest request,
[FromUri]string page,
[FromUri]string pageSize)
正如我在评论中所说,HttpResponseMessage<T>
被删除,因为HttpResponseMessage
的内容属性将执行所有需要的操作。
我检查过,我在帖子中传递了querystring params,没问题。