Dopo l'aggiornamento a JQuery 1.5 e successive 1.5.1, la convalida del confronto non riesce. Sto usando JQuery.Validate 1.7. My ViewModel ha le seguenti annotazioni di dati:JQuery 1.5 interruzioni Confronta convalida (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; }
Con qualsiasi valore inserito, i campi della password non sono mai identici.
AGGIORNAMENTO - ASP.NET AntiForgeryToken si mette nei guai.
Dopo scherzare nella creazione di punti di interruzione Firebug, ho notato che nella funzione di validazione equalTo, a partire dal 1065 la linea nel jquery.validate.js, l'elemento di destinazione che si trova, non è il campo Password - ma il __RequestVerificationToken
che Scritture ASP.NET MVC quando si utilizza l'helper Html.AntiForgeryToken()
.
Ciò significa che non stiamo nemmeno confrontando gli elementi di input corretti. Per ovviare a questo problema, ho aggiunto un hack sporco al file 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();
}
Questo mod, assume valore di data-val-equalTo-altro dell'attributo, e si mescola con il proprio ID, per trovare l'elemento di input corretto. Non funzionerà in tutti i casi. Ma lavora per me, nel caso di cui sopra.
Funziona! Mi chiedo se questo bug è stato archiviato da qualche parte nell'universo di Microsoft. Dovrei segnalarlo tramite Microsoft Connect, in modo che venga risolto nella prossima versione. – MartinHN
È stato corretto nel codice. Grazie. http://connect.microsoft.com/VisualStudio/feedback/details/665793/jquery-unobtrusive-validate-equalto-fails-with-compare-attribute – jsgoupil
Questo è stato molto utile! Tuttavia, nel mio caso ho dovuto cambiarlo in element = $ (options.form) .find (": input [nome = '" + fullOtherName.replace (".", "\\.") + "']") [0]; annota le virgolette singole attorno al valore iniettato. E non dimenticare di sistemarlo nella versione minificata! :) –