C# 我是否必须为每个控制器创建一个新的对象类才能在asp.NETCore中接收json?

C# 我是否必须为每个控制器创建一个新的对象类才能在asp.NETCore中接收json?,c#,asp.net,json,asp.net-core,asp.net-core-webapi,C#,Asp.net,Json,Asp.net Core,Asp.net Core Webapi,伙计们。我只想问一个关于asp.net核心控制器中json传输的问题 我知道如果我想像这样读json { FirstName: "Zhen", LastName: "Wang" } 在request.body中,我需要将其绑定到如下对象: public class Person { public string FirstName { get; set; } public string LastName { get; set; } } public class Person

伙计们。我只想问一个关于asp.net核心控制器中json传输的问题

我知道如果我想像这样读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接收person和building数据

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控制器构建一个新类


谁能告诉我一些想法吗?

不,你可以这样做:

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

这取决于在传递json之前如何序列化它

您发布的数据将以其中一种方式传输,但正文/表单或URL(或两者)是最常见的。请求正文的内容通常只能读取一次,这就是为什么每个参数只能有一个FromBody属性

在向WebAPI发送数据或从WebAPI接收数据时,通常使用DTO(数据传输对象)。DTO负责精确地处理所需的数据,而不会产生不必要的数据库垃圾或不需要/不希望公开的字段

在这个场景中,是的,您将需要一个专门包含一栋建筑和一个人的类。为了简单起见,您可以在同一类/文件中定义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.
}

不完全确定,但您应该能够使用单个
Person
属性创建父类;父类名称应该无关紧要;并一起排除
构建
类/属性。如何发送json?用什么方法?我试过了。它不起作用。我不确定我做这件事的方式是否正确。此外,如果没有[frombody],即使只有一个参数Person,它也无法工作。您到底是如何传递数据的?