【问题标题】:Validate a group of fields as required when at least one of them is filled至少填写一个字段时,根据需要验证一组字段
【发布时间】:2013-01-05 16:47:16
【问题描述】:

在一个基本的注册屏幕(用按钮注册记录屏幕)有两个面板:

数据面板:

地址面板:

我只需完成“数据”面板即可注册。不必填写地址面板。但是,如果地址面板的至少一个字段被填写,那么同一面板中的所有其他字段都应该是必需的。

我怎样才能做到这一点?

【问题讨论】:

  • -1,因为没有说出你迄今为止尝试过的内容并且没有显示任何代码。

标签: validation jsf jsf-2 primefaces omnifaces


【解决方案1】:

如果其他输入已提交非空值,您需要检查required 属性。由于这可能会产生相当多的样板,因此这里是一个只有 3 个输入组件的启动示例。

<h:form id="form">
    <h:inputText id="input1" value="#{bean.input1}" required="#{empty param['form:input2'] and empty param['form:input3']}" />
    <h:inputText id="input2" value="#{bean.input2}" required="#{empty param['form:input1'] and empty param['form:input3']}" />
    <h:inputText id="input3" value="#{bean.input3}" required="#{empty param['form:input1'] and empty param['form:input2']}" />
</h:form>

另一种方法是将组件绑定到视图并使用UIInput#getValue()检查前一个组件的值,并使用UIInput#getSubmittedValue()检查它们是否有下一个组件(即按照组件在组件中出现的顺序处理组件树)。这样您就不需要硬编码客户端 ID。您只需要确保绑定名称不会与现有托管 bean 名称冲突。

<h:inputText binding="#{input1}" value="#{bean.input1}" required="#{empty input2.submittedValue and empty input3.submittedValue}" />
<h:inputText binding="#{input2}" value="#{bean.input2}" required="#{empty input1.value and empty input3.submittedValue}" />
<h:inputText binding="#{input3}" value="#{bean.input3}" required="#{empty input1.value and empty input2.value}" />

您会明白,当您拥有越来越多的组件时,这会产生丑陋的样板。 JSF 实用程序库OmniFaces 有一个&lt;o:validateAllOrNone&gt; 验证器用于确切用途。另请参阅live demo。根据您的问题标签,您正在使用 OmniFaces,因此您应该已经设置好了:

<o:validateAllOrNone components="input1 input2 input3" />
<h:inputText id="input1" value="#{bean.input1}" />
<h:inputText id="input2" value="#{bean.input2}" />
<h:inputText id="input3" value="#{bean.input3}" />

【讨论】:

    【解决方案2】:

    首先,您应该向支持 bean 添加一个方法,如下所示:

    public boolean isAddressPanelRequired() {
        // Check if at least one field is entered
        // and return true if it is and false othervise
    }
    

    地址面板上的每个输入元素都应该有required="#{backingBean.addressPanelRequired}"

    然后在地址面板上的每个输入组件上添加 onblur ajax 侦听器,处理该组件,并更新地址面板。

    【讨论】:

      猜你喜欢
      • 2011-07-21
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-05
      • 2023-03-10
      • 2016-06-29
      相关资源
      最近更新 更多