w3schools tag style span attribute asp.net-mvc-3 passwords data-annotations

asp.net-mvc-3 - tag - span title



Atributo Comparar(contraseƱa) (2)

Me gustaría crear un modelo de vista para un nuevo usuario usando el siguiente código. La clase "Usuario" contiene solo las dos propiedades (simplificadas por ahora) que persistiré en la base de datos; el modelo de vista agrega un campo "comparar contraseña", que solo se usa en la vista. Prefiero que el modelo de vista use la clase "Usuario" directamente, en lugar de repetir todos los campos definidos en "Usuario".

Mi pregunta es ¿cómo hago referencia adecuada a "User.Password" en el atributo [Compare] para el campo "ComparePassword"?

public class User { [Required] public string UserName { get; set; } [Required] [DisplayName("Password")] [DataType(DataType.Password)] public string Password { get; set; } } public class NewUserViewModel { public User User { get; set; } [Required] [DataType(DataType.Password)] [DisplayName("Re-enter Password")] [Compare("Password", ErrorMessage="Passwords must match")] public string ComparePassword { get; set; } }

El HTML que se genera para "Contraseña" y "Comparación de contraseña" está debajo.

<input class="text-box single-line password" data-val="true" data-val-required="The Password field is required." id="User_Password" name="User.Password" type="password" value="" /> <input class="text-box single-line password" data-val="true" data-val-equalto="Passwords must match" data-val-equalto-other="*.Password" data-val-required="The Re-enter Password field is required." id="ComparePassword" name="ComparePassword" type="password" value="" />

La clave es cómo el Javascript maneja el "valor de datos igual a otro ". Si utilizo " Contraseña " o " Contraseña de usuario ", no ocurre nada; no se realiza ninguna verificación. Si uso " User.Password ", la comprobación se realiza pero siempre falla.

No tengo ningún problema real para hacerlo directamente en jQuery, pero preferiría usar el atributo [Comparar] si fuera posible.


Solucioné este problema usando dos campos y comparando en el servidor (a través de JavaScript discreto):

[Required(ErrorMessage = @"The new password is required")] [StringLength(25, ErrorMessage = @"The new password must be at least {2} characters long", MinimumLength = 4)] [DataType(DataType.Password)] [Display(Name = @"New Password")] public string NewPassword { get; set; } [Required(ErrorMessage = @"The confirmation of password is required")] [StringLength(25, ErrorMessage = @"The confirmation of new password must be at least {2} characters long", MinimumLength = 4)] [DataType(DataType.Password)] [Display(Name = @"Confirm New Password")] public string ConfirmPassword { get; set; }

Código del lado del servidor:

[HttpPost] public ViewResult ChangeUserPassword(ChangePasswordModel model) { Logger.Debug(LogBuilder.MethodEntry("ChangeUserPassword")); if (model == null) { throw new ArgumentNullException("model"); } if (model.NewPassword != model.ConfirmPassword) { ModelState.AddModelError("", Messages.ConfirmPasswordError); return View(model); } if (ModelState.IsValid) { var changePasswordCompleted = false; try { var userName = CurrentPerson.UserDetails.UserName; var membershipUser = Membership.GetUser(userName); if (membershipUser != null) { changePasswordCompleted = membershipUser.ChangePassword(model.OldPassword, model.NewPassword); } } catch (Exception exception) { changePasswordCompleted = false; Logger.Error(LogBuilder.LogMethodError("ChangeUserPassword", exception)); } if (changePasswordCompleted) { return View("ChangePasswordCompleted"); } } ModelState.AddModelError("", Messages.ChangePasswordError); return View(model); }


Acabo de encontrar la respuesta a través de y Microsoft Connect:

Ver:

http://connect.microsoft.com/VisualStudio/feedback/details/665793/jquery-unobtrusive-validate-equalto-fails-with-compare-attribute y JQuery 1.5 breaks Compare Validate (JQuery Validate 1.8)

Para summerize, parece un error en el archivo jquery.validate.unobtrusive que vino con MVC3. La solución alternativa es cambiar la siguiente línea en el archivo jquery.validate.unobtrusive.

element = $(options.form).find(":input[name=" + fullOtherName + "]")[0];

a

element = $(options.form).find(":input[name=" + fullOtherName.replace(".", "//.") + "]")[0];

En Microsoft Connect, dice que MS lo ha corregido, pero no pude encontrar el enlace a la nueva versión. De todos modos, esto funciona para mí mientras tanto. Espero eso ayude