我有需要验证用户模型的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)
{
}
这是一个好还是坏的设计决定,即如果您不进行任何验证,那么它是否成立将是一个不同的问题...