假设我有一个h:form
,其中包含三个字段和两个提交按钮。提交按钮例如是显示报告和生成数据。为简单起见,我宁愿只有一个而不是多个表格。当显示报告时,需要三个字段中的值作为报告显示的条件。所以我将它们标记为required="true"
但是禁用了生成数据的执行,这不需要这三个字段。
有没有办法在没有太多自定义编码的情况下有条件地制作JSF表单字段,比如requiredIf=#{condition}
?
答案 0 :(得分:4)
如果生成数据操作不需要对表单数据进行任何转换或验证,请为此按钮将属性immediate
设置为true
:
<h:commandButton action="#{someBean.generateData}" value="Generate Data" immediate="true"/>
这样就可以在进行任何转换或验证之前调用操作generateData
,并且根本不验证表单数据。
如果生成数据需要表单中的数据,那么您可以在此处使用BalusC描述的技巧:JSF 2.0 validation in actionListener or action method
简而言之,正如@ 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>