我试图从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中手动反序列化,或者是否还有其他内容?
答案 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)