繁体   English   中英

如何在定义良好的模型中反序列化动态属性?

[英]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方法并允许模型绑定,您需要做两件事:

  • 将内容类型设置为“ application / json”
  • 并通过调用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM