2013-04-18 1 views
1

According to the docs 동안 IgnoreDataMember 특성이 json 개체 속성을 건너 뜁니다. IgnoreDataMember 특성은 직렬화 중에 만 고려해야합니다.** DE ** 직렬화

그러나 내가보고있는 바로는, MVC 모델 바인딩은 * json의 직렬화 중에도 사용하고 있습니다.

은 다음 클래스를 고려

public class Tax 
{ 
    public Tax() { } 

    public int ID { get; set; } 

    [Required] 
    [Range(1, int.MaxValue)] 
    [IgnoreDataMember] 
    public int PropertyId { get; set; } 
} 

POST는/액션 메서드에 다음 JSON 문자열을 넣으면 :

{"Position":0,"Description":"State sales tax","Rate":5,"RateIsPercent":true,"PropertyId":1912} 

나는 다음과 같은 유효성 검사 오류 얻을 :

{ 
    "Message": "The request is invalid.", 
    "ModelState": { 
    "newTax.PropertyId": [ 
     "The field PropertyId must be between 1 and 2147483647." 
    ] 
    } 
} 

[Range(1, int.MaxValue)][Required] 속성은 모두 유효하지 않습니다.

[IgnoreDataMember] 특성을 제거하면 모든 것이 정상적으로 작동합니다.

역 직렬화 중에 MVC 바인딩이 속성을 무시하지 않도록하는 데 사용할 수있는 다른 속성이 있습니까?

json 문자열을 게시 할 때만 발생합니다. 이름/값 문자열을 게시하면 everthing이 올바르게 작동합니다.

답변

2

답변은 Json.net의 동작과 관련이 있습니다. 그게 모델 바인딩이 사용하는 것인데, serialization과 deserialization 모두에 대해 IgnoreDataMember을 체크하면 (왜냐하면 나는 직렬화에만 사용하기를 원하기 때문에) 쓸모 없게 만든다.

JsonIgnore 속성은 정확히 같은 방식으로 작동합니다.

감안할 때, 나는 모든 속성을 무시하고 json.net의 조건부 직렬화 메소드를 사용하여 전환했다.

그래서 기본적으로 위의 부동산 ID 필드에이를 추가

직렬화가 올 수 있습니다
public bool ShouldSerializePropertyId() { return false; } 

하지만 블록 직렬화를 외출.

관련 문제