使用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似乎还没有解决,所以这就是我发现的:
问题出在remote
function中:
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失败时重新应用格式函数。