[DataContract(Namespace="")]
public class Value
{
[DataMember(IsRequired=true)]
public string Id { get; set; }
[DataMember(IsRequired=true)]
public int Num { get; set; }
[DataMember]
public string Name { get; set; }
}
public Value Post(Value value)
{
if(!ModelState.IsValid)
{
//Bad request
}
return value;
}
我试图强制在web api的post请求中指定所有值。在上面的Value模型中,省略Num属性时:
{"Id": "abc", "Name":"John"}
它向模型状态添加一个错误,表明它不存在。但是,当省略Id属性时:
{"Num" : 3, "Name" : "John"}
意外地,没有添加模型状态错误,并且模型被认为是有效的。
当我使用JsonConvert.Deserialize
手动反序列化模型时,它会在两种情况下抛出序列化异常,表明该属性已丢失。为什么在值类型(int)未正确存在时添加模型状态错误,而在请求主体中缺少引用类型(字符串)时却没有?如何在模型状态错误中包含这些错误?
注意:在Id属性上放置[Required]
属性是不够的。我希望允许发布null或空字符串值,只要它包含在请求中。
答案 0 :(得分:0)
试试这个?
[DataMember]
[Newtonsoft.Json.JsonProperty(Required = Newtonsoft.Json.Required.AllowNull)]
public string Id { get; set; }