IgnoreDataMember属性在** DE **序列化期间跳过json对象属性

时间:2013-04-18 16:09:58

标签: asp.net-mvc json validation attributes asp.net-web-api

According to the docs,IgnoreDataMember属性仅在序列化期间被考虑。

然而,从我所看到的,MVC模型绑定也在json的* de *序列化期间使用它。

考虑以下课程:

public class Tax
{
    public Tax() { }

    public int ID { get; set; }

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

如果将以下json字符串POST / PUT转换为操作方法:

{"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工作正常。

1 个答案:

答案 0 :(得分:2)

答案与Json.net的行为有关。这就是模型绑定所使用的,它正在检查IgnoreDataMember的序列化和反序列化,这对我来说没用(因为我只想用它来进行序列化)。

JsonIgnore属性的工作方式完全相同。

鉴于此,我从属性中删除了所有忽略属性,并切换到使用json.net的条件序列化方法。

所以基本上为上面的PropertyId字段添加它:

public bool ShouldSerializePropertyId() { return false; }

这允许反序列化进入但阻止序列化出去。