【问题标题】:ModelState.IsValid is false when modifying model before checking validity在检查有效性之前修改模型时,ModelState.IsValid 为 false
【发布时间】:2016-12-27 15:47:55
【问题描述】:

我遇到的问题是我在 post 操作中修改我的模型,而不是通过表单填写(字段是密码哈希和密码盐),原因很明显。发布到操作时,显然密码哈希和盐是计算值,不是用户输入的。问题是,如果我生成它们并将值分配给我发布的客户模型,模型状态仍然表示它们是必需的,即使属性具有值。请参阅下面的代码。这是我的注册操作。

[HttpGet]
    public ActionResult Register()
    {
        return View();
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Register(Customer customer)
    {

        var password = Request.Form.Get("password");
        var ConfirmPassword = Request.Form.Get("confirmpassword");

        if ((password != null && ConfirmPassword != null) && (!string.IsNullOrWhiteSpace(password)
            && !string.IsNullOrWhiteSpace(ConfirmPassword)) && password == ConfirmPassword)
        {
            //generate a password salt
            var passwordsalt = Models.Helpers.PasswordHasher.GetSalt();
            //convert it into a string that can be used again by calling the Convert.FromBase64String(string); function on what will be stored
            customer.PasswordSalt = Convert.ToBase64String(passwordsalt);
            //compute the password hash here and store it in the customer
            customer.PasswordHash = Models.Helpers.PasswordHasher.ComputeHash(password, "SHA256", passwordsalt);

        }
        else if (!Models.Helpers.ValidationLibrary.ValidatePasswordRequirements(password))
        {
            ModelState.AddModelError("", "Password must be 8 characters long, have at least one number or symbol");
        }
        else
        {
            ModelState.AddModelError("", "Password and confirm password do not match");
        }


            if (ModelState.IsValid)
        {
            //db.Customers.Add(customer);
            //db.SaveChanges();

            UserRegistration regularUser = new UserRegistration();

            regularUser.customer = customer;
            regularUser.role = new XREF_CustomerRole { Role_ID = 3, Customer_ID = customer.Customer_ID };

            Models.Helpers.Helper.createUser(regularUser);

            return Login(new UserLogin { Email = customer.Email, Password = customer.PasswordHash, RememberMe = false });
        }
        return View(customer); ;
    }

这是数值的截图。

这是模型状态 中的值的屏幕截图 连同它们对应的键

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-4 modelstate


    【解决方案1】:

    这很正常,这就是 HTML 助手的工作方式。他们首先使用 POST 请求的值,然后使用模型中的值。这意味着即使您在控制器操作中修改模型的值,如果 POST 请求中有相同的变量,您的修改也将被忽略,并且将使用 POST 的值。

    ASP.Net MVC Html.HiddenFor with wrong value

    【讨论】:

    • 谢谢!那个链接的例子真的很有帮助。你知道这个奇怪的功能的原因吗?似乎使用 mvc,它假定您的模型没有计算字段。
    • 原因在this answer第二部分解释
    猜你喜欢
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 2019-05-20
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 2021-11-25
    相关资源
    最近更新 更多