我有一个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);
答案 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.
}