我正在ASP.NET Core(3.0)中构建RESTful API。每个控制器都有一种用于搜索域对象的方法,该方法接受 List
[HttpGet]
[ProducesResponseType(200)]
public actionResult<IEnumerable<Service.Models.Asset>> Get(
[FromQuery(Name = "criteria")] List<keyvaluepair<string,string>> criteria,[FromQuery] int? page = 0,[FromQuery] int? size = null)
{
var dtoList = _assetService.SearchPaged(criteria,page,size);
return Ok(dtoList);
}
我将条件作为JSON序列化字符串传递,请求URI为:
http://api/asset?criteria=[{"key":"uprn","value":"h1"},{"key":"uprn","value":"h2"}]&page=0&size=100
我无法让控制器接受标准参数的值,标准列表始终为零长度。我尝试用URL编码文本,没有区别。
如果将参数更改为字符串,则可以使用JsonConvert成功地反序列化参数(相同的URI)。
[HttpGet]
[ProducesResponseType(200)]
public actionResult<IEnumerable<Service.Models.Asset>> Get(
[FromQuery(Name = "criteria")] string criteriaString,[FromQuery] int? size = null)
{
var criteria = Newtonsoft.Json.JsonConvert.DeserializeObject<IEnumerable<keyvaluepair<string,string>>>(criteriaString);
var dtoList = _assetService.SearchPaged(criteria,size);
return Ok(dtoList);
}
我不想将模型绑定与强类型参数对象一起使用,因为我有一个通用参数转换器,该转换器从条件列表中构建一个表达式以应用于我的EF DbSet。这适用于许多不同的控制器。
这是可能的,还是我应该放弃并坚持使用我的字符串参数并自己管理反序列化?