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

我不知道为什么,但是即使不是,ModelState.IsValid也会返回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; }
}

调试证明

最佳答案

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

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

因此,您需要使用以下方法显式处理这种情况:

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

}

这是一个好还是坏的设计决定,即如果您不进行任何验证,那么它是否成立将是一个不同的问题...

10-08 02:29