2017-10-20 3 views
0

사용 asp.net 코어 API 복잡한 객체를 작성하는 데 실패가 JQuery와 AJAX 여기</p> <p>를 사용 asp.net 코어 API리스트 복잡한 객체를 작성하는 데 실패 JQuery와 AJAX

여기
public class Bus 
{  
    public int BusId { get; set; }     
    public string RegistrationNo { get; set; }   
    public IEnumerable<BusSeat> BusSeats { get; set; } 
} 

public class BusSeat : CoreModel 
{   

    public int DecNumber { get; set; } 
    public int SeatId { get; set; }   
} 

인 모델이다 컨트롤러 여기

[HttpPost] 
public IActionResult Save([FromForm] Bus bus) 
{ 
    return Ok(bus); 
} 

자바 스크립트

var d = { 
      BusId: 1, 
      RegistrationNo: 'REG123', 
      BusSeats: [ 
       { 
        DecNumber: 1, 
        SeatId:2, 
       }, 
       { 
        DecNumber: 1, 
        SeatId: 4, 
       } 
      ] 
     } 

$.ajax({ 
      type: 'post', 
      url: 'http://localhost:46060/api/bus/save', 
      contentType: 'application/json; charset=utf-8',     
      dataType: 'json', 
      data: JSON.stringify({ bus: d }),     
      success: function (data) {     
      }, 
      error: function (data) { 
      } 
     }); 

요청은 성공했지만 데이터를 가져올 수 없습니다. 뭐라구?

답변

0

변경 [FromBody] 및 데이터에 대한 아약스 호출에서 액션 부분에서 단지

data: JSON.stringify(d) 

보다는

data: JSON.stringify({ bus: d }) 
+0

않았다, 작동하지 않음 –

+0

내 대답이 바뀌었고 로컬 프로젝트에서 확인했습니다. 모든 것이 올바르게 바인딩됩니다. 그 이유는 AspNetCore 모델 바인딩이 작동하는 방법입니다. 어쨌든, 그것은 고전적인 AspNet과 다릅니다. – Rob

0

당신은 아약스에 stringify, contentType 필요하지 않습니다 말한다 mvc 작업에 [FromForm]이 필요하지 않습니다.

복잡한 개체를 data 매개 변수에 직접 전달하기 만하면됩니다.

$.ajax({ 
    type: 'post', 
    url: 'http://localhost:46060/api/bus/save',     
    dataType: 'json', 
    data: d,     
    success: function (response) {     
    }, 
    error: function (response) { 
    } 
}); 

복잡한 json 개체가 정의한보기 모델과 일치하는 한 바인딩은 '마술처럼'작동해야합니다.

[HttpPost] 
public IActionResult Save(Bus bus) 
{ 
    return Ok(bus); 
} 

이것은 주제가 아니지만 웹 API를 작성한 이후로 당신이 어떻게 당신의 위음을 구성하는지 생각해야합니다. 당신은 여전히 ​​좋은 오래된 RPC 스타일을 귀하의 uri에 사용하고 싶지 않습니다.

컨트롤러 이름을 리소스 컬렉션으로 생각하고 HttpMethod을 동사로 사용하십시오.

따라서 리소스 컬렉션, 버스에 대해 생각하기 때문에 BusController 대신 BusesController을 생성 할 것입니다.

[Route("api/[controller]")] 
public class BusesController : Controller 
{ 
    // GET api/buses 
    [HttpGet] 
    public IActionResult() 
    { 
     // Return all buses 
     return OK(...); 
    } 

    // GET api/buses/1 
    [HttpGet] 
    public IActionResult(int id) 
    { 
     // Return individual bus 
     return OK(...); 
    } 

    // POST api/buses 
    [HttpPost] 
    public IActionResult Post(CreateBusViewModel model) 
    { 
     // Create a new bus and return newly created uri of the bus 
     return Created(...); 
    } 
} 

Richardson Maturity Model에 대한 자세한 내용을 볼 수 있습니다.

+0

David 님, 고맙습니다. –