1

我有一个定义如下的 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} 的形式出现,因为我不知道里面有什么,所以我无法以任何方式反序列化它。

我尝试将其设为动态和/或将其转换为动态/ExpandoObject/Dictionary 但没有成功。我知道如果我只收到一个原始的 HttpRequestMessage 并自己处理它,我可能可以让它工作。但是,我宁愿不这样做,而是依赖 .NET 的所有验证。

是否可以?

谢谢

编辑1:在测试了更多替代方案后,我发现额外的属性没有任何实际价值,它只是被初始化为一个新的 object()。看起来默认模型绑定器实现不处理动态 JSON(至少不是这样),只是调用它无法处理的模型属性的默认构造函数。

4

1 回答 1

0

将您的属性定义为object应该工作,或者如果您想明确,您可以为您的Extra属性指定 type JObject

但是问题在于$.post请求。为了将复杂数据发布到 web.api 方法并允许模型绑定,您需要做两件事:

  • 将内容类型设置为“应用程序/json”
  • 并将数据作为 JSON 发送并调用JSON.stringify

但是$.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'
            }
        }
    })
});
于 2013-02-03T21:10:25.813 回答