在特定按钮按下时禁用ICEFaces表单上的验证

时间:2011-11-26 18:40:25

标签: java validation jsf icefaces

我有一个IceFaces表格,上面有几个HtmlCommandButtons。我有一些附加验证器的输入字段。验证效果很好,但即使按下与提交按钮不同的按钮,也会运行并阻止该过程。逻辑,因为我的所有按钮基本相同。问题是:如何从验证方面区分按钮?

我无法提供XHTML片段,因为我的表单是从Java代码动态构建的。按钮以这种方式创建:

    HtmlCommandButton comp = new HtmlCommandButton();
    comp.setId("btn" + StringUtil.toId(label) + "_" + action);
    comp.setTitle(label);
    comp.setValue(label);
    comp.setStyleClass("commandexbutton commandexbutton-" + StringUtil.toId(label));
    comp.addActionListener(JSFBuilderHelper.createActionListener(getActionListenerStr()));
    comp.setPartialSubmit(true);

1 个答案:

答案 0 :(得分:1)

最简单的说,您可以将UICommand组件的immediate属性设置为true。然后,它会跳过UIInput组件的处理,将此属性设置为true

comp.setImmediate(true);

有关此属性用法的详细说明,请参阅this answer的下半部分。

如果这不是一个选项,那么你最好的选择是将取消按钮放在一个单独的表格中,以便它有效地结束如下:

<h:form>
    input fields 
    submit button
</h:form>
<h:form>
    cancel button
</h:form>

如果由于设计/布局限制也不是一个选项(读取:不能通过CSS / JS修复),那么你基本上需要检查每个验证器按下了哪个按钮。您可以通过请求参数映射中按钮的客户端名称(ID)来检查。例如,作为组件的属性:

required="#{not empty param['formId:submitButtonId']}"

required="#{empty param['formId:cancelButtonId']}"

或在验证器的validate()方法的开头:

if (externalContext.getRequestParameterMap().get("formId:submitButtonId") == null) {
    return; // Skip validation when normal submit button is not pressed.
}

if (externalContext.getRequestParameterMap().get("formId:cancelButtonId") != null) {
    return; // Skip validation when cancel button is pressed.
}