突出显示/错误不适用于“远程”验证

时间:2018-10-29 20:10:40

标签: javascript jquery-validate

我在Bootstrap 4和chargify中使用,在初始化时需要一些自定义。可视化自定义项和SubmitHandler似乎不是问题。但是,我也使用了“远程”选项(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'
        }
    }
});

为了完整性起见,提供了整个初始化过程,但我不认为其中的任何一个都是相关的。

问题

当我检查自己的subDomain时,如果我在空白字段上模糊显示,它将正确突出显示该字段并在适当的div中显示“需要字段”错误。如果输入一个字符并模糊,我将获得“最小长度”规则的正确行为。因此,我可以相对确定HTML本身和突出显示/错误行为是正确的。

但是,当最终调用“远程” URL时,该行为不符合预期。无论通过与否,该字段均以".is-invalid"突出显示,这也隐藏了div反馈。不管其隐藏状态如何,".invalid-feedback" div也不填充消息。

返回的JSON有两种格式之一。第一个例子是失败,第二个例子是通过:

{
  "subDomain":"SubDomain can't be only numeric"
}

{
  "subDomain":true
}

现在,documentation对于远程选项来说并不理想,但是我认为这就是返回值的形状。他们自己的链接示例似乎显示了这种签名。

以防万一,我仍然不清楚:所缺少的是,当远程服务返回一个通行证时,该字段应取消突出显示。当它返回失败时,应突出显示该字段,并在错误字段中显示服务传递的自定义消息。


更新

我相信实际上是响应JSON使事情变得混乱。如果我直接查看验证源代码,它想查看真相部分是否为response == true || response || response == "true"。这很奇怪,因为它也记录了以下内容:“服务器端响应必须是JSON字符串,对于有效元素,该字符串必须为“ true”;对于无效元素,可以为“ false”,未定义或为null“。

当然,不存在没有匹配密钥的JSON字符串之类的东西,并且文档中没有说明密钥应该是什么。我通过查看示例页面中的返回消息来推断。所以现在我不确定响应应该是什么,或者他们的示例页面实际上如何成功运行。如果我的响应是完全不带有JSON的“ true”或“ Some message”格式的html / text,我觉得它会“起作用”。

更新2:解决方案

万一有人偶然发现此问题,答案就在Sparky的评论中,并且与我在第一次更新中的怀疑相符:服务器端返回格式错误的响应。

响应应位于应用程序/文本中,并且整个响应正文应包含以下任一内容:

"true"

"Some custom error message"

完成后,一切正常。事实证明,该文档也很好,但是我被术语“ JSON格式的字符串”所吸引,这实际上只是意味着“用双引号正确包装并且仅包含有效字符”。我认为这意味着需要一个完整的JSON对象。

1 个答案:

答案 0 :(得分:1)

为便于查找,以下是从原始问题中Sparky的评论得出的答案:

响应应位于应用程序/文本中,并且整个响应正文应包含以下任一内容:

"true"

"Some custom error message"

双引号是必需的,并且不应是任何完整的JSON对象。完成此操作后,一切正常。事实证明,该文档也很好,但是我被术语“ JSON格式的字符串”所吸引,这实际上只是意味着“用双引号正确包装并且仅包含有效字符”。我认为这意味着需要一个完整的JSON对象。

我们的Java代码最终会进行内部验证,并且已经可以访问HttpServletResponse类。然后,它仅基于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();