2017-09-19 6 views
0

남자. 난 asp .net 코어 컨트롤러에서 json 전송에 관한 질문을하고 싶다. 단지가없는 경우,asp.net 코어에서 json을 수신하기 위해 각 컨트롤러에 대해 새 객체 클래스를 만들어야합니까?

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; 
    } 
} 

그러나 :

내가 request.body에서

{ 
FirstName: "Zhen", 
LastName: "Wang" 
} 

같은 JSON을 읽으려면 내가 아는, 내가 같은 개체에이 바인드해야 JSON에서 사람뿐만 아니라 같은 건물 :

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

나는 사람과 buildin를 받아 봐하는 PersonAndBuilding을 구축해야합니까 request.body의 g 데이터?

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 컨트롤러에 대해 새 클래스를 빌드해야한다는 의미이므로 이상하다고 생각합니다.

아무에게 나 아이디어를 줄 수 있습니까?

+0

단 하나의 'Person' 속성으로 부모 클래스를 생성 할 수 있어야합니다. 부모 클래스 이름은 중요하지 않아야합니다. 'Building' 클래스/속성을 모두 제외하십시오. –

+0

json을 어떻게 보내고 있습니까? 무슨 뜻으로? –

답변

0

아니, 당신은이 작업을 수행 할 수 있습니다

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

그것은 당신이 너무 그것을 통과하기 전에 JSON 직렬화 방법에 따라 달라집니다.

+2

[FromBody 특성을 하나만 가질 수 있습니다] (https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding#binding-formatted-data-from-the-request-body) –

+0

나는 이것을 시도했다. 그것은 작동하지 않습니다. 내가 올바른 방법으로 그 일을했는지 ​​확신 할 수 없다. 또한 매개 변수 Person이 하나만 있더라도 [frombody]가 없으면 작동하지 않습니다. –

+0

데이터를 정확히 전달하는 방법은 무엇입니까? –

0

POST 데이터는 a few ways 중 하나로 전송되지만, 본문/양식 또는 URL (또는 둘 다!)이 가장 일반적입니다. 요청 본문의 내용은 일반적으로 한 번만 읽을 수 있으므로 매개 변수 당 하나의 FromBody 속성 만 가질 수 있습니다.

WebAPI와 데이터를주고받을 때 DTO (데이터 전송 개체)를 사용하는 것이 일반적입니다. DTO는 불필요한 데이터베이스 쓰레기 나 노출시키지 않으려는 필드없이 필요한만큼의 데이터를 정확하게 처리해야합니다.

이 시나리오에서 네, 구체적으로 한 건물과 한 사람을 포함하는 클래스가 필요합니다. 단순함을 위해 동일한 클래스/파일에서 DTO를 정의하거나 DTO를 ./DTO/ 또는 ./Models/DTOs/에서 정의하는보다 우아하고 체계적인 솔루션을 정의 할 수 있습니다.

당신의 Route가 /api/Person/{personId}처럼 보이도록 Person 객체가 Id에 의해 식별되도록 REST 구조체를 수정하는 것이 약간의 대안입니다. 그렇다면 메소드 서명은 다음과 같을 수 있습니다.

[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. 
}