突出显示/错误不适用于 "remote" 验证
highlighting / error not working for "remote" validation
我正在使用 jquery-validate with Bootstrap 4 and chargify, which required a bit of customization at initialization time. The visual customizations and submitHandler don't seem to be issues. However, I am also using the "remote" option (documentation),这似乎是我的问题所在。我当前的初始化是这样的:
// note: app.form is a cached jQuery object wrapping the form in question
app.form.validate({
submitHandler: function (form) {
if (form.valid()) {
chargify.token(
form,
function success(token) {
document.querySelector('#chargifyToken').value = token;
form.submit();
},
function error(err) {
console.log('token ERROR - err: ', err);
}
);
}
},
highlight: function (element) {
$(element).addClass('is-invalid');
},
unhighlight: function (element) {
$(element).removeClass('is-invalid');
},
errorClass: 'invalid-feedback',
errorElement: 'div',
rules: {
"subDomain": {
required: true,
minlength: 2,
remote: '../servlet/CheckSubDomainServlet'
}
}
});
为了完整起见,提供了整个初始化,但我不相信其中任何一个是相关的。
问题
当我检查我的子域时,如果我在空白字段上模糊,它会正确突出显示该字段并在适当的 div 中显示 "field required" 错误。如果我输入一个字符并进行模糊处理,我会得到 "minlength" 规则的正确行为。所以我可以相对确定 HTML 本身和 highlight/error 行为是正确的。
但是当最终调用 "remote" URL 时,行为并不像预期的那样。无论通过与否,该字段都会以 ".is-invalid"
突出显示,这也会隐藏反馈 div。无论其隐藏状态如何,".invalid-feedback"
div 也不会填充消息。
returned JSON 有两种格式之一。第一个示例失败,第二个示例通过:
{
"subDomain":"SubDomain can't be only numeric"
}
或
{
"subDomain":true
}
现在,documentation 对于远程选项来说不是很好,但我认为这是 return 应该采用的形状。他们自己的链接示例似乎显示了此签名。
以防万一我还不清楚:缺少的是当远程服务return通过时,该字段应该未突出显示。当它 return 失败时,该字段应突出显示,并且服务传递的自定义消息应显示在错误字段中。
更新
我认为实际上是响应 JSON 把事情搞砸了。如果我直接查看验证源代码,它想查看是否 response == true || response || response == "true"
为真值部分。这很奇怪,因为它还记录了这一点:"The serverside response must be a JSON string that must be "true" 表示有效元素,可以是 "false"、undefined 或 null 表示无效元素。
当然,JSON 字符串这样的东西没有匹配的键,文档也没有说明键应该是什么。我通过查看示例页面中的 return 消息进行推断。所以现在我不确定响应应该是什么,或者他们的示例页面实际上是如何成功运行的。如果我的回复是 "true" 格式的 html/text 或根本没有 JSON 的 "Some message",我觉得它会 "work"。
更新 2:解决方案
万一有人偶然发现了这个问题,答案就在 Sparky 的评论中,并且符合我在第一次更新中的怀疑:服务器端 return 的响应格式不正确。
响应应在 application/text 中,整个响应正文应包含:
"true"
或
"Some custom error message"
完成后,一切正常。事实证明文档也很好,但我被术语 "JSON-formatted string" 抛出了它实际上只是意味着 "wrapped properly in double-quotes and with only valid characters." 我认为这意味着需要一个完整的 JSON 对象。
为了更容易找到,这里是答案,源自 Sparky 在原始问题中的评论:
响应应在 application/text 中,整个响应正文应包含:
"true"
或
"Some custom error message"
双引号是必需的,它不应该是任何类型的完整 JSON 对象。完成后,一切正常。事实证明文档也很好,但我被术语 "JSON-formatted string" 抛出了它实际上只是意味着 "wrapped properly in double-quotes and with only valid characters." 我认为这意味着需要一个完整的 JSON 对象。
我们的 Java 代码最终会进行内部验证,并且已经可以访问 HttpServletResponse class。然后它只是根据 HttpServletResponse.getWriter() 创建一个 PrintWriter 并写入它:
PrintWriter out = null;
// ... later ...
// "response" was passed in as type HttpServletResponse
out = response.getWriter();
// out is just a buffer for what gets dumped into response body
out.println(resultingString);
out.flush();
out.close();
我正在使用 jquery-validate with Bootstrap 4 and chargify, which required a bit of customization at initialization time. The visual customizations and submitHandler don't seem to be issues. However, I am also using the "remote" option (documentation),这似乎是我的问题所在。我当前的初始化是这样的:
// note: app.form is a cached jQuery object wrapping the form in question
app.form.validate({
submitHandler: function (form) {
if (form.valid()) {
chargify.token(
form,
function success(token) {
document.querySelector('#chargifyToken').value = token;
form.submit();
},
function error(err) {
console.log('token ERROR - err: ', err);
}
);
}
},
highlight: function (element) {
$(element).addClass('is-invalid');
},
unhighlight: function (element) {
$(element).removeClass('is-invalid');
},
errorClass: 'invalid-feedback',
errorElement: 'div',
rules: {
"subDomain": {
required: true,
minlength: 2,
remote: '../servlet/CheckSubDomainServlet'
}
}
});
为了完整起见,提供了整个初始化,但我不相信其中任何一个是相关的。
问题
当我检查我的子域时,如果我在空白字段上模糊,它会正确突出显示该字段并在适当的 div 中显示 "field required" 错误。如果我输入一个字符并进行模糊处理,我会得到 "minlength" 规则的正确行为。所以我可以相对确定 HTML 本身和 highlight/error 行为是正确的。
但是当最终调用 "remote" URL 时,行为并不像预期的那样。无论通过与否,该字段都会以 ".is-invalid"
突出显示,这也会隐藏反馈 div。无论其隐藏状态如何,".invalid-feedback"
div 也不会填充消息。
returned JSON 有两种格式之一。第一个示例失败,第二个示例通过:
{
"subDomain":"SubDomain can't be only numeric"
}
或
{
"subDomain":true
}
现在,documentation 对于远程选项来说不是很好,但我认为这是 return 应该采用的形状。他们自己的链接示例似乎显示了此签名。
以防万一我还不清楚:缺少的是当远程服务return通过时,该字段应该未突出显示。当它 return 失败时,该字段应突出显示,并且服务传递的自定义消息应显示在错误字段中。
更新
我认为实际上是响应 JSON 把事情搞砸了。如果我直接查看验证源代码,它想查看是否 response == true || response || response == "true"
为真值部分。这很奇怪,因为它还记录了这一点:"The serverside response must be a JSON string that must be "true" 表示有效元素,可以是 "false"、undefined 或 null 表示无效元素。
当然,JSON 字符串这样的东西没有匹配的键,文档也没有说明键应该是什么。我通过查看示例页面中的 return 消息进行推断。所以现在我不确定响应应该是什么,或者他们的示例页面实际上是如何成功运行的。如果我的回复是 "true" 格式的 html/text 或根本没有 JSON 的 "Some message",我觉得它会 "work"。
更新 2:解决方案
万一有人偶然发现了这个问题,答案就在 Sparky 的评论中,并且符合我在第一次更新中的怀疑:服务器端 return 的响应格式不正确。
响应应在 application/text 中,整个响应正文应包含:
"true"
或
"Some custom error message"
完成后,一切正常。事实证明文档也很好,但我被术语 "JSON-formatted string" 抛出了它实际上只是意味着 "wrapped properly in double-quotes and with only valid characters." 我认为这意味着需要一个完整的 JSON 对象。
为了更容易找到,这里是答案,源自 Sparky 在原始问题中的评论:
响应应在 application/text 中,整个响应正文应包含:
"true"
或
"Some custom error message"
双引号是必需的,它不应该是任何类型的完整 JSON 对象。完成后,一切正常。事实证明文档也很好,但我被术语 "JSON-formatted string" 抛出了它实际上只是意味着 "wrapped properly in double-quotes and with only valid characters." 我认为这意味着需要一个完整的 JSON 对象。
我们的 Java 代码最终会进行内部验证,并且已经可以访问 HttpServletResponse class。然后它只是根据 HttpServletResponse.getWriter() 创建一个 PrintWriter 并写入它:
PrintWriter out = null;
// ... later ...
// "response" was passed in as type HttpServletResponse
out = response.getWriter();
// out is just a buffer for what gets dumped into response body
out.println(resultingString);
out.flush();
out.close();