zoukankan      html  css  js  c++  java
  • 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("
    ", 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

  • 相关阅读:
    hdu 1030 Delta-wave
    POJ 1061 青蛙的约会(拓展欧几里得)
    How Many Zeroes? LightOJ
    HDU
    A
    mysql中函数cast使用
    Django基础08篇 filter&tag
    Django基础07篇 ORM操作
    Django基础06篇 分页
    Django 基础05篇 上下文管理和前端代码复用
  • 原文地址:https://www.cnblogs.com/dudu/p/11225082.html
Copyright © 2011-2022 走看看