[英]How to deserialize a dynamic property in a well defined model?
我有一个Web api方法定义如下:
[HttpPost]
public void Post(Input model)
{
...
}
使用这样的输入模型:
public class Input
{
public string Id { get; set; }
public object Extra { get; set; }
}
我想做的就是传递一个有效的JSON对象作为额外的参数,例如下面的jQuery示例:
$.post(
'http://localhost/api/myController',
{
id: 'someId',
extra: {
tags: ['a', 'b'],
anotherValue: 'hello',
oneMore: {
foo: 'bar'
}
}
});
ID正确进入了我的model.Id属性。 但是, 额外的属性作为{object}出现,由于我不知道其中的内容,因此无法以任何方式反序列化它。
我尝试使其动态化和/或将其强制转换为dynamic / ExpandoObject / Dictionary,但未成功。 我知道,如果我只收到原始的HttpRequestMessage并自己处理,就可以使它工作。 但是,我宁愿不这样做,而要依靠.NET进行的所有验证。
可能吗?
谢谢
编辑1:在测试了更多替代方案之后,我发现extra属性没有任何实际值,它只是被初始化为new object() 。 看起来默认的模型绑定程序实现不处理动态JSON(至少不是这样),而只是调用它无法处理的model属性的默认构造函数。
将属性定义为object
应该可以,或者如果要明确显示, JObject
Extra
属性的类型设置为JObject
。
但是问题出在$.post
请求上。 为了将复杂的数据发布到web.api方法并允许模型绑定,您需要做两件事:
JSON.stringify
将数据作为JSON发送 但是使用$.post
不能指定内容类型,因此需要使用$.ajax
:
因此,以下调用应将数据发布到您的操作中:
$.ajax({
url: 'http://localhost/api/myController',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify(
{
id: 'someId',
extra: {
tags: ['a', 'b'],
anotherValue: 'hello',
oneMore: {
foo: 'bar'
}
}
})
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.