AjaxFormComponentUpdatingBehavior和表单提交的不同验证器集

时间:2014-05-31 07:33:50

标签: ajax validation wicket

在Wicket中,我编写了一个AjaxFeedbackComponent组件,它接受常规表单组件(例如TextField)和反馈字段,并在用户键入时提供即时反馈验证。我将它用于用户注册,例如,验证最小密码长度,或重复的用户名等(类似于Twitter注册页面)。因为,我已使用表单组件注册AjaxFormComponentUpdatingBehavior并使用ajax请求更新反馈字段:

formComponent.add(new AjaxFormComponentUpdatingBehavior("onkeyup") {

    @Override
    protected void onUpdate(AjaxRequestTarget target) {
        target.add(AjaxFeedbackComponent.this.feedback);
        AjaxFeedbackComponent.this.onUpdate(target);
    }

    @Override
    protected void onError(AjaxRequestTarget target, RuntimeException e) {
        super.onError(target, e);
        target.add(AjaxFeedbackComponent.this.feedback);
    }
});

这正如预期的那样效果很好。但是,出于可用性原因,我不希望某些验证程序在Ajax表单处理中运行,但我只想在提交最终表单时运行它们。我知道IFormValidator,它们在AjaxFormComponentUpdatingBehavior事件处理过程中没有被调用,但它似乎是一种代码气味,可以将验证器添加到实际上只是涉及单个字段的验证器的表单中,并且应该是封装在相应的组件中,比如UsernameRegistrationField

例如,如果我设置formComponent.setRequired(true),并且用户使用TAB键浏览表单,则在用户甚至开始输入用户名之前会触发onkeyup事件 - 并立即验证者的显示.Required错误消息。这对用户来说有点尴尬。因此,我希望能够根据表单处理标记字段,但跳过ajax处理中所需的验证。由于其他一些原因,我还想将其他验证器延迟(一些“代价高昂”)到最终的表格处理。

所以我的问题是:如何在AjaxFormComponentUpdatingBehavior处理中禁用表单组件上的验证器,但是不要完全禁用单个表单组件验证?或者我是否真的必须将所有单个字段的验证作为IFormValidator进行?或者这是否适合setDefaultFormProcessing()

1 个答案:

答案 0 :(得分:2)

如果您使用非Ajax表单提交,您的验证器只能通过检查ART的存在来执行“轻量级”检查:

boolean light = RequestCycle.get().find(AjaxRequestHandler.class) != null;

否则,您的AjaxFormComponentUpdatingBehavior可以在requestCycle的metaData中存储一个标志,该标志允许您的验证器(或验证器包装器)检查“轻量级”验证。