Asp.net web api DataSourceRequest未对WebAPI Get方法进行反序列化

Asp.net web api DataSourceRequest未对WebAPI Get方法进行反序列化,asp.net-web-api,kendo-grid,angular5,Asp.net Web Api,Kendo Grid,Angular5,我尝试从Angular 5调用WebAPI方法,如下所示: selectClaims(state: DataSourceRequestState):Observable<DataResult> { return this.http.get<GridDataResult>(`${this.apiUrl}/SelectClaims?${toDataSourceRequestString(state)}`); } return this.http.post<Gr

我尝试从Angular 5调用WebAPI方法,如下所示:

selectClaims(state: DataSourceRequestState):Observable<DataResult>
{
    return this.http.get<GridDataResult>(`${this.apiUrl}/SelectClaims?${toDataSourceRequestString(state)}`);
}
return this.http.post<GridDataResult>(`${this.apiUrl}/SelectClaims`, toDataSourceRequestString(state)});
问题在于ClaimsRequest只能正确地反序列化页面和页面大小。过滤器和排序无法通过:

Fiddler告诉我Angular的URL是:
GET/api/v1/Claims/SelectClaims?filter=id~eq~2&page=1&sort=firstName asc&pageSize=20 HTTP/1.1
,但在控制器中,filter和sort都为空

如果我通过类似“”的招摇过市方式创建URL,我确实会在API方法中看到排序数组,但“Member”字段为null

任何通过类似“”的虚张声势添加筛选器的尝试都会导致“无法创建接口实例”错误

该状态是来自角度剑道网格的角度分量中的
DataSourceRequestState

我在一个简单的测试程序中模拟了这一点,一切都很好。我的测试程序中唯一的区别是API控制器的目标是.Net内核,而实际系统的目标是.Net 4.6.1


由于某种原因,我是否必须在.Net 4.6.1中手动反序列化,或者这里发生了其他事情?

它应该是一篇文章,而不是一个GET。大概是这样的:

selectClaims(state: DataSourceRequestState):Observable<DataResult>
{
    return this.http.get<GridDataResult>(`${this.apiUrl}/SelectClaims?${toDataSourceRequestString(state)}`);
}
return this.http.post<GridDataResult>(`${this.apiUrl}/SelectClaims`, toDataSourceRequestString(state)});
然后像这样使用它

DataSourceResult results = query.ToDataSourceResult(request.ToDataSourceRequest(),  r => (r)));

感谢@KevDevMan为您提供的解决方案。我发现了这个, 然后我像这样改变了我的API控制器,它工作起来很有魅力:

[HttpGet,Route(“用于剑道网格”)]
公共DataSourceResult GetProducts([System.Web.Http.ModelBinding.ModelBinder(typeof(webapidasourceRequestModelBinder))]DataSourceRequest请求)

解释

你解决过这个问题吗?我也有同样的问题已经有一段时间了,但我认为答案是该方法不应该有[HttpGet],因为Telerik正在对请求使用Post方法(即使很难,它看起来应该是一个Get)。请让我知道这是否适用于您。嗨,John,是的,它适用于您。我在运行MVC版本后发现了同样的问题,并看到在类型中添加“aspMVCAPI”将调用从GET切换到POST。糟糕的文档。我最终创建了一个新对象,该对象的参数与带有[FromUri]的DataSourceRequest相同,并且非常有用(需要它在GET上运行)。我必须再次映射过滤器和排序,但无论如何我都必须触摸它们,因为我的VM属性与实体不匹配,因此搜索将失败。谢谢你回来!
DataSourceResult results = query.ToDataSourceResult(request.ToDataSourceRequest(),  r => (r)));