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

Alf*_*lle 4 validation jsf primefaces jsf-2 omnifaces

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

数据面板:

在此处输入图片说明

地址面板:

在此处输入图片说明

我只能通过完成“数据”面板进行注册。不必填写“地址”面板。但是,如果填写了“地址”面板的至少一个字段,则应要求同一面板中的所有其他字段。

在此处输入图片说明

我该如何实现?

Bal*_*usC 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>
Run Code Online (Sandbox Code Playgroud)

一种替代方法是将组件绑定到视图,并用于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}" />
Run Code Online (Sandbox Code Playgroud)

您将了解,当您拥有越来越多的组件时,这会产生难看的样板。JSF实用程序库OmniFaces具有<o:validateAllOrNone>用于特定用途的验证器。另请参见现场演示。根据您的问题标签,您正在使用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}" />
Run Code Online (Sandbox Code Playgroud)