我是否必须为每个控制器创建一个新对象 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.
}
伙计们。我只想问一个关于 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.
}