Después de actualizar a JQuery 1.5 y posterior 1.5.1, mi validación de comparación falla. Estoy usando JQuery.Validate 1.7. Mi modelo de vista tiene las siguientes anotaciones de datos:JQuery 1.5 breaks Compare Validate (JQuery Validate 1.8)
/// <summary>
/// Gets or sets the full name.
/// </summary>
/// <value>The full name.</value>
[Required]
[Display(Name = "fullname", ResourceType = typeof(Milkshake.Commerce.Model.Resources.Text))]
public string FullName { get; set; }
/// <summary>
/// Gets or sets the email.
/// </summary>
/// <value>The email.</value>
[DataType(DataType.EmailAddress)]
[Display(Name = "email", ResourceType = typeof(Milkshake.Commerce.Model.Resources.Text))]
[Required(ErrorMessageResourceName = "EmailRequired", ErrorMessageResourceType = typeof(Milkshake.Commerce.Model.Resources.ValidationMessages))]
[RegularExpression(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", ErrorMessageResourceType = typeof(Milkshake.Commerce.Model.Resources.ValidationMessages), ErrorMessageResourceName = "EmailInvalid")]
public string Email { get; set; }
/// <summary>
/// Gets or sets the password.
/// </summary>
/// <value>The password.</value>
[DataType(DataType.Password)]
[Display(Name = "password", ResourceType = typeof(Milkshake.Commerce.Model.Resources.Text))]
[Required(ErrorMessageResourceName = "PasswordRequired", ErrorMessageResourceType = typeof(Milkshake.Commerce.Model.Resources.ValidationMessages))]
[ValidatePasswordLengthAttribute(ErrorMessageResourceName = "PasswordLength", ErrorMessageResourceType = typeof(Milkshake.Commerce.Model.Resources.ValidationMessages))]
public string Password { get; set; }
/// <summary>
/// Gets or sets the confirm password.
/// </summary>
/// <value>The confirm password.</value>
[DataType(DataType.Password)]
[Display(Name = "confirmPassword", ResourceType = typeof(Milkshake.Commerce.Model.Resources.Text))]
[Required(ErrorMessageResourceName = "PasswordRequired", ErrorMessageResourceType = typeof(Milkshake.Commerce.Model.Resources.ValidationMessages))]
[Compare("Password", ErrorMessageResourceName = "PasswordsMustMatch", ErrorMessageResourceType = typeof(Milkshake.Commerce.Model.Resources.ValidationMessages))]
public string ConfirmPassword { get; set; }
Cualquiera que sea el valor entro, los campos de contraseña no son idénticos.
ACTUALIZACIÓN - ASP.NET AntiForgeryToken se mete en problemas.
Después de perder el tiempo en el establecimiento de puntos de interrupción FireBug, me di cuenta de que en la función de validación equalTo, a partir de la línea de 1065 en jquery.validate.js, el elemento objetivo que se encuentra, no es el campo Contraseña - pero el que __RequestVerificationToken
ASP.NET MVC escribe cuando utiliza el ayudante Html.AntiForgeryToken()
.
Eso significa que ni siquiera estamos comparando los elementos de entrada correctos. Para solucionar este problema, he añadido un truco sucio para el archivo jquery.validate.js:
// http://docs.jquery.com/Plugins/Validation/Methods/equalTo
equalTo: function (value, element, param) {
// bind to the blur event of the target in order to revalidate whenever the target field is updated
// TODO find a way to bind the event just once, avoiding the unbind-rebind overhead
var target = $(param).unbind(".validate-equalTo").bind("blur.validate-equalTo", function() {
$(element).valid();
});
if ($(target).is("input[type=hidden]") && $(target).attr("name") == "__RequestVerificationToken") {
var otherElementId = $(element).attr("id");
var underScoreIndex = otherElementId.indexOf("_");
otherElementId = otherElementId.substring(0, underScoreIndex + 1);
otherElementId += $(element).attr("data-val-equalto-other").substring(2);
target = $("#" + otherElementId);
}
return value == target.val();
}
Este truco, toma el valor de los datos-val-equalto-otro atributo, y lo mezcla con su propio ID, para encontrar el elemento de entrada correcto No funcionará en todos los casos. Pero funciona para mí, en el caso anterior.
¡Funciona! Me pregunto si este error se ha archivado en algún lugar del universo de Microsoft. Debería informarlo a través de Microsoft Connect, para que esto se solucione en la próxima versión. – MartinHN
Se ha corregido en el código. Gracias. http://connect.microsoft.com/VisualStudio/feedback/details/665793/jquery-unobtrusive-validate-equalto-fails-with-compare-attribute – jsgoupil
¡Esto fue muy útil! Sin embargo, en mi caso tuve que cambiarlo a element = $ (options.form) .find (": input [name = '" + fullOtherName.replace (".", "\\.") + "']") [0]; observe las comillas simples alrededor del valor inyectado. ¡Y no olvides arreglarlo en la versión reducida! :) –