2011-11-02 8 views
0

json에서 3 단계 중첩 모델 바인딩이 작동하지 않는 이유는 무엇입니까?ASP.NET MVC 3 Json 모델 바인딩 3 수준 개체

레벨 2 테스트, 예를 들어 LevelTwo에 문자열 속성 추가가 작동하지만 3 레벨이 나지 않습니다. 디자인에 의한 것입니까, 버그입니까, 아니면 뭔가 빠졌습니까?

클라이언트 측의 jQuery 게시물 :

$.ajax({ 
     url: "MyController/MyAction", 
     dataType: "json", 
     type: "POST", 
     cache: false, 
     data: { 
      Level1: { 
       Level2: { 
        StringValue: "Test" 
       } 
      } 
     } 
    }); 

서버 측 모델 :

public class MyForm 
{ 
    public LevelOne Level1 { get; set; } 
} 

public class LevelOne 
{ 
    public LevelTwo Level2 { get; set; } 
} 

public class LevelTwo 
{ 
    public string StringValue { get; set; } 
} 

답변

1

왜 JSON 작업 바인딩 나던 3 수준의 중첩 모델

당신은 어떤을 발송하지 않습니다 서버에 대한 JSON.

$.ajax({ 
    url: "MyController/MyAction", 
    contentType: 'application/json; charset=utf-8', 
    dataType: "json", 
    type: "POST", 
    cache: false, 
    data: JSON.stringify({ 
     Level1: { 
      Level2: { 
       StringValue: "Test" 
      } 
     } 
    }) 
}); 

JSON.stringify 방법은 JSON 문자열로 문자 자바 스크립트를 직렬화 것입니다 : 당신이 JSON 요청을 보내려면 여기 방법입니다. 그것은 현대적인 브라우저에 기본적으로 내장되어 있습니다. 기존 브라우저를 지원해야하는 경우 페이지에 json2.js 스크립트를 포함 할 수 있습니다.

+0

Doh! 감사! 나는 dataType : "json"이 모두 필요하다고 가정했다. 아시다시피, 가정은 모두의 어머니입니다 ... – MatteS

+0

@MatteS,'dataType : 'json''은 요청이 아닌 응답 내용 유형을 나타냅니다. 또한 서버가 application/json에 적절한 Content-Type 응답 헤더를 보내는 경우에도 jQuery가 자동으로 추론하므로 필요하지 않습니다. Ajax 요청에서이 매개 변수를 생략 할 수 있습니다. –

+0

예. 이것은 내가 돌아가서 dataType 옵션이 코드베이스에서 시작하도록 추가 된 이유를 상기시켜 주며 "Accept : application/json, text/javascript, */*;"헤더를 추가하는 것이 중요 할 것입니다. 요청에, 그리고 우리의 오류 처리 논리가 좋아하는 것이있다. – MatteS