2011-03-07 17 views
5

Estoy tratando de validar a un usuario cambiar su contraseña. La clase PasswordChange que toma esta acción tiene 4 propiedades. uno de los cuales es la contraseña de base de datos que se compara con una propiedad "Contraseña actual" que garantiza que el usuario solo puede cambiar su contraseña si conoce su contraseña actual (procedimiento normal en sitios web)Re-evaluar la propiedad de ModelState.IsValid

Problema que tengo es que la contraseña de la base de datos es solo conjunto (como se muestra) dentro de la ActionResult pero el ModelState parece ser llamado antes de que esto por lo que devuelve false en "IsValid" ya que considera que la contraseña de base de datos como "NULO", incluso después de la contraseña de la base de datos se establece

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult ChangePassword(PasswordChange model) 
    { 
     var User = GetPlayer().User; 
     model.databasePassword = User.Password; 

     if (ModelState.IsValid) 
     { 
      //update the users password 
      User.Updated = SystemDate.Current(); 
      User.Password = model.newPassword.ToLower(); 

      return Redirect("/Player"); 
     } 
     else 
     { 
      return View(model); 
     } 
    } 

Cómo ¿Puedo reevaluarlo o hacer que lo evalúe cuando lo desee?

Respuesta

1

crear una clase de vista del modelo PasswordChangeInput y pase lo que necesita de la vista, a continuación, puede tener la validación separada de su modelo de entidad. Luego puede usar algo como automapper para mapear el modelo de vista de entrada al modelo de entidad una vez que esté satisfecho de que los datos de entrada sean válidos.

Para agregar: Se podría tratar de aclarar los errores ModelState, establecer el databasepassword, y volver a validar. Probablemente sea más fácil averiguar qué está causando que el archivador de modelo predeterminado agregue un error para databasePassword y lo cambie para que no lo haga.

+0

que es más o menos lo que PasswordChange es. Es más o menos un modelo de vista que tiene 4 propiedades. 3 desde la página que se configuró desde la base de datos en la página de publicación ... ¡esto no resuelve el problema de obtener el modelo de estado para validar después! – Steve

+0

Bien, pregunta tonta, pero ¿por qué databasePassword necesita ser una propiedad modelo si CurrentPassword es? –

+0

Realmente no es un modelo de la vista si agrega cosas después de que se ha pasado de la vista. Es por eso que pregunto por qué es necesaria la contraseña de base de datos en PasswordChange. –

2

Compruebe el error y desactivarla si su asignación fija él. Cheque simplificado:

model.databasePassword = User.Password; 
if (ModelState["databasePassword"].Errors.Count == 1) 
{ 
    ModelState["databasePassword"].Errors.Clear(); 
} 
+3

es esta mejor práctica? – FutuToad

Cuestiones relacionadas