如何在JSF中有条件地要求表单字段?

amp*_*ent 1 validation jsf

假设我有一个h:form包含三个字段和两个提交按钮的。例如,提交按钮是Display ReportGenerate Data。为简单起见,我宁愿只有一种而不是多种形式。当Display Report 时,需要三个字段中的值作为报告呈现的标准。所以我将它们标记为required="true"but 禁用了Generate Data的执行,它不需要这三个字段。

有没有办法让 JSF 表单字段有条件地要求而无需太多自定义编码,例如requiredIf=#{condition}

Daw*_*tel 5

如果“生成数据”操作不需要对表单数据进行任何转换或验证,则将此按钮的属性immediate设置true为:

<h:commandButton action="#{someBean.generateData}" value="Generate Data" immediate="true"/>
Run Code Online (Sandbox Code Playgroud)

这种方式generateData在任何转换或验证发生之前调用操作,并且根本不验证表单数据。

如果生成数据需要来自表单的数据,那么您可以在此处使用 BalusC 描述的技巧:actionListener 或 action 方法中的 JSF 2.0 验证

简而言之,正如@Jean-François 建议的那样,您可以使用 EL 表达式作为required属性值。EL 表达式应true仅在用户按下“显示报告”按钮时计算为。这可以使用以下表达式来完成:#{not empty param['<fullIdOfTheDisplayReportButton>']}. 该表达式检查按钮的 id 是否属于参数,这意味着给定的按钮用于提交表单。

完整示例:

<h:form id="formId">
    <p>
        Required only for Display Report: <h:inputText id="reqForDR" required="#{not empty param['formId:displayReportButton']}" />
    </p>
    <p>
        Required for Display Report and Generate Data: <h:inputText id="reqForDRGD" required="true"/>
    </p>
    <h:commandButton id="displayReportButton" action="#{someBean.displayReport}" value="Display Report"/>
    <h:commandButton id="generateDataButton" action="#{someBean.generateData}" value="Generate Data"/>
</h:form>
Run Code Online (Sandbox Code Playgroud)