【发布时间】:2015-07-25 12:10:49
【问题描述】:
[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 的发布请求中指定所有值。在上面的 Value 模型中,当 Num 属性被省略时:
{"Id": "abc", "Name":"John"}
它向模型状态添加一个错误,表明它不存在。但是,当省略 Id 属性时:
{"Num" : 3, "Name" : "John"}
没想到,没有添加模型状态错误,模型被认为是有效的。
当我使用 JsonConvert.Deserialize 手动反序列化模型时,它在两种情况下都会引发序列化异常,表明该属性丢失。为什么当值类型(int)不正确时,它似乎添加了模型状态错误,但在请求正文中缺少引用类型(字符串)时却没有?如何将这些包含在模型状态错误中?
注意:在 Id 属性上放置 [Required] 属性是不够的。我想允许发布一个 null 或空字符串值,只要它包含在请求中。
【问题讨论】:
标签: c# asp.net asp.net-web-api json.net