ModelState.IsValid即使它不应该是什么?

ModelState.IsValid即使它不应该是什么?

问题描述:

我有API,我需要验证我的用户模型。我选择,我创建创建/编辑行动,以避免大规模的分配和除法验证和除了实际模型不同类别的方法。

I have API where I need to validate my user model. I choose an approach where I create different classes for Create/Edit actions to avoid mass-assignment and divide validation and actual model apart.

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

I don't know why but ModelState.IsValid returns true even when it should not. Am I doing something wrong?

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; }
}

调试证明

Debug proof

ModelState.IsValid 内部检查 Values​​.All(的ModelState = GT ; modelState.Errors.Count == 0)前pression。

The ModelState.IsValid internally checks the Values.All(modelState => modelState.Errors.Count == 0) expression.

由于没有输入收集将是空的,所以 ModelState.IsValid 真正

Because there was no input the Values collection will be empty so ModelState.IsValid will be true.

所以,你需要用明确的处理这种情况:

So you need to explicitly handle this case with:

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

}

这是否是一个好的或坏的设计决策,如果你没有验证它真正的是一个不同的问题...

Whether this is a good or bad design decision that if you validate nothing it will true is a different question...