DataSourceRequest未针对WebAPI Get方法进行反序列化

时间:2018-01-24 20:39:09

标签: 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)}`);
}

按预期方式调用API方法。 API方法是:

    [Route("SelectClaims")]
    [HttpGet]
    public IHttpActionResult SelectClaims([FromUri][DataSourceRequest]DataSourceRequest ClaimsRequest)
        {
        if(ClaimsRequest == null)
            ClaimsRequest=new DataSourceRequest { Page=1, PageSize=20 };
        var result = _db.Claims.ToDataSourceResult(ClaimsRequest, c => { c.SortHistory(); return c; });
        return Ok(result);
        }

麻烦的是,ClaimsRequest只能正确地反序列化Page和PageSize。过滤器和排序不会通过:

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

如果我通过Swagger创建了一个网址,例如:&#39; http://localhost:50223/api/v1/Claims/SelectClaims?ClaimsRequest.page=1&ClaimsRequest.pageSize=11&ClaimsRequest.sorts=firstName-desc&#39;我确实在API方法中看到了一个排序数组,但是&#34;会员&#34; field为null。

尝试通过Swagger添加过滤器,例如&#39; http://localhost:50223/api/v1/Claims/SelectClaims?ClaimsRequest.page=1&ClaimsRequest.pageSize=11&ClaimsRequest.filters=id~eq~2&#39;导致&#34;无法创建接口的实例。&#34;错误。

状态是来自Angndo的Kendo Grid的角度分量中的DataSourceRequestState

我在一个简单的测试程序中对此进行了模拟,一切正常。我的测试程序的唯一区别是API控制器的目标是.Net Core和真正的系统目标.Net 4.6.1。

出于某种原因,我是否必须在.Net 4.6.1中手动反序列化,或者是否还有其他内容?

2 个答案:

答案 0 :(得分:0)

它应该是POST而不是GET。像这样:

return this.http.post<GridDataResult>(`${this.apiUrl}/SelectClaims`, toDataSourceRequestString(state)});

我需要它是一个GET(URL)所以我创建了一个新对象

public class GridParamaterBinder
{
    public int Page { get; set; }
    public int PageSize { get; set; }
    public string Filter { get; set; }
    public string Sort { get; set; }

    public DataSourceRequest ToDataSourceRequest(IConfigurationProvider mapper, Func<string, string> OverDefaultParamaterMapping)
    {
        DataSourceRequest result = new DataSourceRequest();

        result.Page = Page;
        result.PageSize = PageSize;
        result.Sorts = GridDescriptorSerializer.Deserialize<SortDescriptor>(Sort);
        result.Filters = FilterDescriptorFactory.Create(Filter);

        return result;
    }
}

并使用它而不是Telerik的努力。

API中的

我将其绑定如此

public virtual DataSourceResult Get([FromUri]GridParamaterBinder request)

然后像

一样使用它
DataSourceResult results = query.ToDataSourceResult(request.ToDataSourceRequest(),  r => (r)));

答案 1 :(得分:0)

感谢@KevDevMan解决方案。我发现了这个example, 然后我像这样更改了我的API控制器,它的工作就像一个魅力:

[HttpGet, Route("for-kendo-grid")]
public DataSourceResult GetProducts([System.Web.Http.ModelBinding.ModelBinder(typeof(WebApiDataSourceRequestModelBinder))] DataSourceRequest request)

说明here