【问题标题】:Disable validation on an ICEFaces form on specific button presses在特定按钮按下时禁用 ICEFaces 表单上的验证
【发布时间】:2012-01-07 00:23:50
【问题描述】:

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

我无法提供 XHTML sn-p,因为我的表单是从 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);

【问题讨论】:

  • 取决于按钮的用途。有问题的按钮应该做什么?
  • 该按钮执行某种“取消”操作(关闭表单,从表单堆栈恢复前一个表单,在应用程序中广播消息,等等......)
  • 好的,直截了当,我发布了一个答案。

标签: java validation jsf icefaces


【解决方案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.
}

【讨论】:

  • 我想在表单上混合即时组件和非即时组件。如果我将 backButton 的立即设置为 true,那么它仍然会验证这些组件.. 这也可以解决吗..?
  • 是的,但不幸的是,这变得更加复杂。最简单的方法是将按钮放在单独的(不是嵌套的!)表单中。这对你来说可能吗?如果没有,那么您需要说明您想跳过哪种验证。只是required 验证?还是所有其他(自定义)验证器?
  • 嵌套形式听起来有点难。我在输入字段中添加了一个验证器,如下所示:textbox.addValidator(new RegExpValidator(validatorExpr));
  • 不,不是嵌套的,只是分开的。这样您就可以有效地以&lt;h:form&gt;normal inputs + submit button&lt;/h:form&gt;&lt;h:form&gt;cancel button&lt;/h:form&gt; 结束。
  • 您可以在验证器内的请求参数映射中检查按钮的客户端名称 (ID) 是否存在。但是您必须为每个验证器都这样做,required 也是如此。例如。 required="#{not empty param['formid:submitbuttonid']}".
猜你喜欢
  • 1970-01-01
  • 2023-01-27
  • 2019-07-12
  • 1970-01-01
  • 1970-01-01
  • 2011-02-02
  • 2022-11-16
  • 1970-01-01
  • 2017-11-07
相关资源
最近更新 更多