我是否必须为每个控制器创建一个新对象 Class 才能在 asp .net 核心中接收 json?

Do I have to create a new object Class for each controller to receive json in asp .net core?

伙计们。我只想问一个关于 json transfer in asp .net core controller 的问题。

我知道我是否想像

那样阅读 json
{
FirstName: "Zhen",
LastName: "Wang"
}

来自 request.body,我需要将它绑定到一个对象,例如:

public class Person  
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class PersonController : ApiController  
{
    [HttpPost]
    public Person Index([FromBody]Person person)
    {
        return person;
    }
}

但是,如果json中不仅有一个人,还有一个建筑,如:

    {
      Person: {
        FirstName: "Zhen",
        LastName: "Wang"
      },
      Building:{
        Address:"Willis Street"
      }
    }

我是否必须构建一个 PersonAndBuilding 来接收来自 request.body 的人物和建筑数据?

public class PersonAndBuilding  
{
    public Person Person { get; set; }
    public Building Building { get; set; }
}

public class PersonController : ApiController  
{
    [HttpPost]
    public Person Index([FromBody]PersonAndBuilding personAndBuilding )
    {
        return personAndBuilding.Person;
    }
}

我认为这很奇怪,因为这意味着我必须为程序中的每个 POST 控制器构建一个新的 Class。

有人可以给我一些想法吗?

不,你可以这样做:

public class PersonController : ApiController  
{
    [HttpPost]
    public Person Index(Person Person,  Building Building)
    {
        return Person;
    }
}

这也取决于您在传递之前如何序列化 json。

您 POST 的数据在 a few ways 之一中传输,尽管 Body/Form 或 URL(或两者!)是最常见的。 Request body 的内容通常只能读取一次,这就是为什么每个参数只能有一个 FromBody 属性。

在发送或接收数据时使用 DTO(数据传输对象)很常见 to/from 您的 WebAPI。 DTO 负责根据需要精确处理尽可能多的数据,而不会产生不必要的数据库垃圾或您未 need/want 公开的字段。

在这种情况下,是的,您将需要一个 class,它专门包含一个建筑物和一个人。为简单起见,您可以在同一个 class / 文件中定义 DTO,或者为了更优雅和更有条理的解决方案,在 ./DTOs/ 或 ./Models/DTOs/ 中定义 DTO。

一个小的替代方法是修改您的 REST 结构,以便您的 Person 对象由 Id 标识,这样您的路线看起来像 /api/Person/{personId}。那么您的方法签名可能类似于...

[HttpPost("{personId}")]
public IActionResult Index([FromBody] Building building, [FromRoute] int personId) {
    var person = ctx.Persons.Single(p => p.Id == personId);
    //you have a building and person.
}