C# ASP.NET Web API将JSON转换为对象实例会跳过int值的数据注释

C# ASP.NET Web API将JSON转换为对象实例会跳过int值的数据注释,c#,asp.net,json,modelstate,C#,Asp.net,Json,Modelstate,Json绑定到对象时出现问题。int值未通过适当的属性进行验证。 我想验证超时值。 简化类: public class SimpleObject { [Required] public string Command { get; set; } [Required] public int TimeOut { get; set; } [Required] public string Type { get; set; } } 简单控制器: [H

Json绑定到对象时出现问题。int值未通过适当的属性进行验证。 我想验证超时值。 简化类:

public class SimpleObject
{
    [Required]
    public string Command { get; set; }
    [Required]
    public int TimeOut { get; set; }
    [Required]
    public string Type { get; set; }
}
简单控制器:

    [HttpPost]
    public ActionResult Edit(SimpleObject request)
    {
        var errors = ModelState.Values.Where(x => x.Errors.Count > 1);
        return new EmptyResult();
    }
我使用fiddler发送这个Json

{"type":"Foo"}
乐趣现在以ModelState开始。控制器上的键显示以下内容:

Count = 2
    [0]: "Type"
    [1]: "Command"
超时的ModelState验证密钥在哪里?如果我尝试发送Type和Command并忽略超时,它甚至会将ModelState设置为有效。
尝试使用mvc 3和mvc 4时

超时不是空类型,默认情况下等于0。

超时不是空类型,默认情况下等于0。

这里的问题是验证在序列化后工作。json被反序列化到对象,超时为0。但是required属性只检查null,所以TimeOut是可以的

您可以将超时设置为空:

public int? Timeout { get; set; }
或者使用Range属性:

[Range(1, 10000)]
public int Timeout { get; set; }

这里的问题是验证在序列化之后工作。json被反序列化到对象,超时为0。但是required属性只检查null,所以TimeOut是可以的

您可以将超时设置为空:

public int? Timeout { get; set; }
或者使用Range属性:

[Range(1, 10000)]
public int Timeout { get; set; }

创建对象SimpleObject时,超时设置为零(默认int值)。在验证过程中,您可以检查是否设置了超时。将类型更改为“int?”或添加范围验证程序。创建对象SimpleObject时,超时设置为零(默认int值)。在验证过程中,您可以检查是否设置了超时。将类型更改为“int?”或添加范围验证器。