2016-08-20 8 views
0

Проблема, с которой я столкнулся, заключается в том, что я модифицирую свою модель в посту, вместо того, чтобы заполнить ее через форму (поля - это хэш пароля и соль для пароля) по очевидным причинам. Когда сообщение в действие, очевидно, хеш пароля и соль - вычисленные значения, не введенные пользователем. Проблема заключается в том, что, если я их сгенерирую и присваиваю значения моей модели с размещенным клиентом, состояние модели все равно говорит, что они требуются, даже если свойства имеют значения. См. Код ниже. Это мое действие в регистре.ModelState.IsValid является ложным при модификации модели перед проверкой действительности

[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); ; 
    } 

Вот скриншот значений.

А вот скриншот из значений в модели состояния Values in model state Наряду с соответствующими ключами Key in model state

ответ

0

Это нормально, и это то, как работает HTML хелперов. Сначала они используют значение запроса POST и после этого значение в модели. Это означает, что даже если вы измените значение модели в действии вашего контроллера, если в запросе POST есть одна и та же переменная, ваша модификация будет проигнорирована и будет использоваться значение POSTED.

ASP.Net MVC Html.HiddenFor with wrong value

+0

Спасибо! Этот связанный пример действительно помог. Вы знаете причину этой странной функциональности? Похоже, что с mvc предполагается, что ваша модель не имеет вычисленных полей. – ddeamaral

+0

Причина объясняется во второй части [этого ответа] (http://stackoverflow.com/questions/26654862/textboxfor-displaying-initial-value-not-the-value-updated-from-code/26664111#26664111) –