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工作正常。
答案 0 :(得分:2)
答案与Json.net的行为有关。这就是模型绑定所使用的,它正在检查IgnoreDataMember
的序列化和反序列化,这对我来说没用(因为我只想用它来进行序列化)。
JsonIgnore
属性的工作方式完全相同。
鉴于此,我从属性中删除了所有忽略属性,并切换到使用json.net的条件序列化方法。
所以基本上为上面的PropertyId字段添加它:
public bool ShouldSerializePropertyId() { return false; }
这允许反序列化进入但阻止序列化出去。