【发布时间】:2015-07-16 22:27:36
【问题描述】:
我们正在使用 JQuery Validate 插件来进行简单的字段验证。使用默认的客户端验证时,一切都按预期工作。
但是,其中一些字段需要服务器端验证。以 HTML 格式在服务器上手动创建错误标签时会出现此问题。这样做时,错误标签会按预期显示,但行为是错误的。
本质上,一旦显示错误标签,它就不会在字段的 KeyUp 事件中被删除。只有当你按下提交按钮时它才会被删除,并且第一次按下提交按钮只会隐藏错误标签并将输入字段设置为有效。您必须再次按下提交按钮才能实际提交表单。似乎 JQuery validate 知道错误标签及其连接的输入字段,否则按下提交按钮时它不会被隐藏。
我尝试过的事情:
- 在错误标签上设置
generated="true"(无变化) -
删除服务器端标签生成并返回错误代码,然后使用 Validator 对象在客户端创建标签,但行为是相同的(必须先按提交按钮才能删除标签,然后再按提交表格的时间):
var 验证器 = $( "#form ).validate(); 验证器.showErrors({ “密码”:“无效密码” });
这是一个带有服务器返回错误标签的示例表单(使用 Thymeleaf):
<div class="form-group">
<label for="password" class="ex-label" th:text="# {common.password}">Password</label>
<input id="password" name="password" type="password" class="form-control ex-input-modal required" />
<label th:if="${passFail}" for="password" class="error"> Wrong password </label>
</div>
【问题讨论】:
-
我不确定您的期望。 jQuery Validate 是一个 client-side 脚本,因此您不能期望它对服务器生成的消息有任何作用。该插件会自动生成并切换其自己的错误消息标签。这个想法是,安装插件后,用户将永远不会看到服务器端验证。服务器端验证只会在 JavaScript 被禁用或绕过时保护您。
-
由于在 jQuery Validate 得到满足之前您无法将表单提交到服务器,所以您怎么会首先看到任何服务器生成的验证消息?
-
它确实以某种方式识别服务器生成的标签,因为它会在 OnBlur 或表单提交事件中清除它们。同样,如果我以编程方式在字段上调用 Validate(),标签将被删除。
-
就无法看到服务器验证消息而言,在满足客户端验证并提交表单后,服务器端标签会在页面加载时的 html 中返回(例如: 邮箱地址字段格式正确,允许提交表单,但是在服务器上判断邮箱地址已经存在,服务器返回错误标签)
-
无论如何,客户端插件无法自动处理您的服务器端验证消息......这不是它的预期目的。请参阅
remote方法。