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

时间:2017-09-19 00:11:45

标签: 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 PersonController : ApiController  
{
    [HttpPost]
    public Person Index([FromBody]Person person)
    {
        return person;
    }
}

但是,如果json中不仅有一个Person,而且还有一个像:

这样的建筑物
    {
      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控制器构建一个新类。

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

2 个答案:

答案 0 :(得分:0)

不,你可以这样做:

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

这取决于你在传递之前序列化json的方式。

答案 1 :(得分:0)

你发布的数据是在a few ways之一中传输的,尽管正文/表格或网址(或两者都是!)是最常见的。请求正文的内容通常只能读取一次,这就是为什么每个参数只能有一个FromBody属性的原因。

在向/从WebAPI发送数据或从WebAPI接收数据时,通常使用DTO(数据传输对象)。 DTO负责处理所需的数据,而不需要不必要的数据库垃圾,或者您不需要/想要暴露的字段。

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

稍微替代方法是修改您的REST结构,以便您的Person对象由Id标识,这样您的Route看起来像download.file('http://www.cpppc.org:8082/efmisweb/ppp/projManage/xsg_perview.do?tokenid=undefined&fileName=20170317105445289.pdf',destfile = "Download", mode="wb") 。然后你的方法签名看起来像......

/api/Person/{personId}