Skip to main content
 首页 » 编程设计

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

2024年02月13日29cloudgamer

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

public class SimpleObject 
{ 
    [Required] 
    public string Command { get; set; } 
    [Required] 
    public int TimeOut { get; set; } 
    [Required] 
    public string Type { get; set; } 
} 

简单的 Controller :

    [HttpPost] 
    public ActionResult Edit(SimpleObject request) 
    { 
        var errors = ModelState.Values.Where(x => x.Errors.Count > 1); 
        return new EmptyResult(); 
    } 

我正在使用 fiddler 发送这个 Json

{"type":"Foo"} 

乐趣现在开始, Controller 的 ModelState.Keys 显示如下:

Count = 2 
    [0]: "Type" 
    [1]: "Command" 

TimeOut 的 ModelState 验证 key 在哪里?如果我尝试发送 Type 和 Command 并省略 TimeOut,它甚至会将 ModelState 设置为有效。 尝试使用 mvc 3 和 mvc 4

请您参考如下方法:

这里的问题是验证在序列化之后起作用。 json反序列化为对象,TimeOut为0。但是required属性只检查null,所以TimeOut没问题。

您可以将 TimeOut 设置为可空:

public int? Timeout { get; set; } 

或使用 RangeAttribute:

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