ASP.NET Core 模型验证的一个小小坑

今天在我们的一个项目中遇到一个 asp.net core 模型验证(model validation)的小问题。当模型属性的类型是 bool ,而提交上来的该属性值是 null ,asp.net core 在模型绑定时会使用该属性的默认值(这很好),但是除此之外 asp.net core 做了一个额外的小动作, 会触发模型验证失败(ModelState.IsValid 为 false),下面用示例代码看一下。

示例 Controller 代码

public class SignInModel
{
    public bool IsRemember { get; set; }
}

public class AccountController : Controller
{
    public IActionResult SignIn([FromForm]SignInModel model)
    {
        Console.WriteLine(ModelState.IsValid);

        if(!ModelState.IsValid)
        {
            var errors = ModelState.Select(s => new
            {
                s.Key,
                Value = string.Join("\n", s.Value.Errors.Select(e => e.ErrorMessage))
            });
            Console.WriteLine(JsonConvert.SerializeObject(errors));
        }

        Console.WriteLine("model.IsRemember:" + model.IsRemember);
        return Ok();
    }
}

用 curl 发请求的命令

$ curl -s -i -X POST -d 'isremember=' -H "Content-Type: application/x-www-form-urlencoded" localhost:5000/account/signin

dotnet run 控制台显示的信息

False
[{"Key":"IsRemember","Value":"The value '' is invalid."}]
model.IsRemember:False

这个小动作让人始料不及,因为我们没有对 IsRemember 属性添加验证规则,却触发了模型验证失败,造成用户的整个提交请求失败。如果你使用 asp.net core 模型验证,需要小心这个小小坑。

注:遇到这个问题的项目用的是 asp.net core 3.0 preview 6

posted @ 2019-07-22 12:13 dudu 阅读(...) 评论(...) 编辑 收藏