我有一个角客户端,并希望执行get请求到我的web api后端,从底层的Dapper Db Wrapper获得项目列表。Dapper允许我以匿名对象的形式传递参数,它看起来像这样:
connection.GetList<T>(new {myParam1:"a", myParam2: true});
我想要实现的是,在我的角前端创建这个参数对象,并在post请求中将其传递给服务器,然后将其传递给GetList函数。这里的问题是,web api不反序列化它作为一个(匿名)对象,而是和IEnumerable的JTokens?
我的web api签名是:
public async Task<IHttpActionResult> MyFunction([FromBody]dynamic whereCond)
我也尝试将对象作为字符串封装在外部对象中,就像这样(angular客户端):
this.migController.MigrationGetMigrationReports({whereCond: JSON.stringify({NotMigrated: true, MissingTargetFiles: 0})})
,然后在服务器上手动将其反序列化为JObject:
string obj = whereCond.whereCond;
dynamic pObj = JObject.Parse(obj);
但是这导致了完全相同的结果:pObj是一个IEnumerable,因此我从GetList调用中得到一个错误消息:
在此上下文中不允许使用可枚举的形参序列(数组、列表等)
有人能帮忙吗?
我的问题的答案很简单:
dynamic pObj = JObject.Parse(obj).ToObject<ExpandoObject>();
我必须将它转换为ExpandoObject而不仅仅是动态的
@Tsahi:这不是设计问题。我的目的是为服务器提供参数(过滤器),这是客户端减少要传输的数据集的常见任务。但是,我们可以讨论如何提供这些参数的标准方法。在我的特殊情况下,最实用的方法是匿名对象。