当至少填充其中一个字段时,根据需要验证一组字段

时间:2013-01-22 12:42:51

标签: validation jsf jsf-2 primefaces omnifaces

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

数据面板:

enter image description here

地址面板:

enter image description here

我只需填写数据面板即可注册。没有必要填写“地址”面板。但是,如果填充了“地址”面板的至少一个字段,则应该需要同一面板中的所有其他字段。

enter image description here

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:5)

如果其他输入提交了非空值,则需要签入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具有<o:validateAllOrNone>验证程序,用于确切目的。另请参阅live demo。基于你的quesiton标签,你使用的是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}" />

答案 1 :(得分:1)

首先,你应该添加一个方法来支持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侦听器,处理该组件,并更新地址面板。