2017-02-24 2 views
6

시나리오 :데이터 전달

컨트롤러에 서브 오브젝트들의리스트를 포함하는 객체를 전달해야한다.

문제 :

나는 개체의 값을 얻을 수있어

아니라 객체 내부의 하위 객체 목록의 값.

코드 :

index.cshtml

function sendData() { 
    var student = { 
     Id: 1, 
     Name: "xxx", 
     Marks: [{ 
      Subject: "Maths", 
      Mark:80 
     }, 
     { 
      Subject: "Science", 
      Mark: 75 
     }] 
    } 
    $.ajax({ 
     url: '@Url.Action("Receive", "Home")', 
     data: student, 
     success: function (data) { 
      alert("done"); 
     }, 
     error: function (error) { 
      alert('error For details refer console log'); 
      console.log(error); 
     } 
    }); 
} 

HomeController.cs

public ActionResult Receive(Student student) 
    { 
     ViewBag.Message = "Your contact page."; 
     return View(); 
    } 

Student.cs

,
public class Student 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public List<Marks> Marks { get; set; } 
} 
public class Marks 
{ 
    public string Subject { get; set; } 
    public decimal Mark { get; set; } 
} 

스크린 샷 :

크롬 디버거는 모든 데이터가 설정된 보여줍니다.

enter image description here

하지만 컨트롤러에 내가 어떤 도움

enter image description here

마크

의 값을받지 못했습니다하는 감상 할 수있다. 고맙습니다.

답변

5

데이터를 문자열로 변환하고 contentTypetype 아약스 옵션을 설정해야합니다 (POST가되어야 함). 그렇지 않으면 점 표기법과 함께 완전한 속성 이름을 사용하여 데이터를 생성해야합니다. 자사의 기존 Ajax 코드 수정없이 작동하는 경우에 예를 { Id: 1, .... , 'Marks[0].Subject': 'Maths', 'Marks[0].Mark': 80, ... }) 당신이 방법은 뷰를 반환하지만, 당신이 볼 수있는 아무것도 안하고

var student = { 
    .... 
}; 

$.ajax({ 
    url: '@Url.Action("Receive", "Home")', 
    data: JSON.stringify({ student: student }, // stringify 
    type: 'POST', // add 
    contentType: "application/json; charset=utf-8", //add 
    success: function (data) { 
     alert("done"); 
    }, 
    .... 
}); 

참고. 당신의 의도가 볼 수있는 DOM을 업데이트하는 경우, 다음 방법은 return PartialView(...);와 아약스 성공 콜백,

success: function (data) { 
    $(someElement).html(data); 
}, 
+0

감사 @Stephen을해야합니다. 완벽하게 작동합니다. 그냥 호기심, 왜 GET 방식으로 작동하지 않았습니까? –

+1

GET 호출에는 본문이 없기 때문에 쿼리 문자열 (또는 경로 값)에서 값을 가져오고 'DefaultModelBinder'는 보내는 데이터와 일치하지 않으므로 (이해하기 위해 생성 한 URL을보십시오). –

+1

하지만 첫 번째 단락의 주석에 따라 데이터 형식이 지정된 경우 (즉 이름이 C# 코드에서 속성 값에 액세스하는 데 사용하는 것과 동일한 형식으로되어있는 경우) 작동합니다. –