有没有一种方法可以使用[FromBody]属性进行嵌套模型绑定?

时间:2019-05-09 14:41:06

标签: c# asp.net model-binding frombodyattribute

我正在尝试以JSON对象为主体进行POST请求。 JSON对象包含嵌套类型,这些类型是我正在使用的库中的预定义模型,但是当我使用[FromBody]属性时,仅绑定了根模型,而嵌套模型为null。

我尝试过不使用[FromBody]属性,但它也仅绑定根级别模型。

POST对象示例: Foo将是一个带有Bar对象的模型。 Bar将是具有属性名称和firstLetter的模型。

lengthFooBArX

Controller路由如下:

{
  "foo": [
    {
      "bar": {
        "name": "bar",
        "firstLetter": "b"
      }
    },
    {
      "bar": {
        "name": "bar1",
        "firstLetter": "b"
      }
    }
  ]
}

Request类如下:

[HttpPost("example-route")]
public async Task<ActionResult<string>> Static([FromBody]Request request){
 //Some Action
}

当我打电话给它时,Bar将被分配,但是它的Name和FirstLetter属性仍然为空。

编辑:我将在示例中添加列表,但是我可能已经简化了。实际的请求看起来更像:

//Request class
public class Request{
  [JsonConstructor]
  public Request(Bar b){
    this.Bar = b;
  }  

  public List<Bar> Bar = { get; set; }
}

//Bar class
public class Bar {

  public Bar(string name, string firstLetter){
     this.Name = name;
     this.FirstLetter = firstLetter;
  }

  public string Name { get; set; }
  public string FirstLetter { get; set; }

}

prop1,prop2,prop3,type和contactInfo都是我正在使用的库中定义的模型。我正在尝试获取ContactInfo对象,到目前为止,当我逐步执行操作时,它可以为ContactInfo分配两个对象,但是它们的属性(系统和值)均为null。我检查了拼写和大小写,但那里没有问题。

1 个答案:

答案 0 :(得分:3)

您的Request类必须与JSON中的内容完全匹配,并注意嵌套:

public class Request
{
  public List<BarContainer> foo {get; set;}
  // Your constructor should initialize this list.
}

public class BarContainer
{
  public Bar bar {get; set;}
}

public class Bar
{
  [JsonProperty("name")]
  public string Name { get; set;}
  [JsonProperty("firstLetter")]
  public string FirstLetter { get; set;}
}

注意:反序列化区分大小写,因此您需要使用JSON中的确切名称,barfoonamefirstLetter或使用属性或配置以支持属性名称的不同大小写: