ModelState.IsValid 即使它不应该是? [英] ModelState.IsValid even when it should not be?

查看:32
本文介绍了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; }
}

调试证明

推荐答案

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

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

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

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...

这篇关于ModelState.IsValid 即使它不应该是?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆