使用jQuery(远程)validation时,为什么错误消息中显示了错误的字段值?

我正在以与Remember The Milk演示非常相似的方式使用jQueryvalidation插件。

$("#registrationForm").validate({ rules: { email: { required: true, email: true, remote: '' }, }, messages: { email: { required: "Please enter an email address", email: "Please enter a valid email address", remote: jQuery.format("{0} is already in use") } }); 

第一次提交无效的电子邮件(例如bob@mail.com)时,错误消息是预期的。 但是,如果我输入另一封无效的电子邮件(例如sue@mail.com),validation插件仍会显示“bob@mail.com已被使用”。

我已经跟踪了到达Url.Action调用中指定的控制器的参数,它们肯定是正确的(即“sue@mail.com”作为电子邮件地址发送时,即在该字段中输入的内容)。

有没有其他人使用jQueryvalidation插件遇到这个或类似的问题?

Remember the Milk演示中的用户名字段以相同的方式失败(输入用户名’Peter’和’George’时),因此您可能在插件中发现了一个错误。

两年后,这个bug似乎还没有解决,所以这就是我发现的:

问题出在remotefunction中:

 remote: function(value, element, param) { if ( this.optional(element) ) return "dependency-mismatch"; var previous = this.previousValue(element); if (!this.settings.messages[element.name] ) this.settings.messages[element.name] = {}; previous.originalMessage = this.settings.messages[element.name].remote; this.settings.messages[element.name].remote = previous.message; // snip more code... } 

麻烦的是,在此函数的第二次及以后的评估中, messages[element.name].remote包含特定的(文本)错误消息,并且在此之后覆盖previous.originalMessage时, 实际的原始消息将永远丢失。

通过在该行之前添加一个检查,我能够解决这个问题:

 if (!previous.originalMessage) previous.originalMessage = this.settings.messages[element.name].remote; 

我不确定这是否真的是正确的解决方案,但它确实有效 – validation失败现在在每次validation失败时重新应用格式函数。