c# - ModelState.IsValid 即使它不应该?

标签 c# asp.net-web-api

我有 API,我需要在其中验证我的用户模型。我选择了一种为创建/编辑操作创建不同类的方法,以避免批量分配并将验证和实际模型分开。

我不知道为什么 ModelState.IsValid 会返回 true,即使它不应该返回 true。我做错了什么吗?

Controller

public HttpResponseMessage Post(UserCreate user)
{
    if (ModelState.IsValid) // It's valid even when user = null
    {
        var newUser = new User
        {
            Username = user.Username,
            Password = user.Password,
            Name = user.Name
        };
        _db.Users.Add(newUser);
        _db.SaveChanges();
        return Request.CreateResponse(HttpStatusCode.Created, new { newUser.Id, newUser.Username, newUser.Name });
    }
    return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}

型号

public class UserCreate
{
    [Required]
    public string Username { get; set; }
    [Required]
    public string Password { get; set; }
    [Required]
    public string Name { get; set; }
}

调试证明

proof

最佳答案

ModelState.IsValid 在内部检查 Values.All(modelState => modelState.Errors.Count == 0) 表达式。

因为没有输入,Values 集合将为空,所以 ModelState.IsValid 将为 true

因此您需要明确处理这种情况:

if (user != null && ModelState.IsValid)
{

}

如果你什么都不验证它就会是真的,这是一个好的还是坏的设计决定是一个不同的问题......

关于c# - ModelState.IsValid 即使它不应该?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17923622/

相关文章:

c# - 在 C# 中过滤 SQL 后值为零

c# - 如何正确地使 String.PadRight() 适应字符串

c# - HttpClient header 与 HttpRequestMessage header

asp.net - 如何使 ASP.NET 停止将 null 解释为字符串

c# - 在序列化中将长数字转换为字符串

c# - 如何按键对字典进行排序

c# - 在 .net Framework 2.0 中使用 Linq?

xml - 自定义 XML 输出?

c# - MVC 网站和 web-api 身份验证/授权失败操作(框架 4.6.1)

c# - 如何将单个 key 文件链接到解决方案中的每个项目?