如何在 JSF 中有条件地要求表单字段?
How to make a form field conditionally required in JSF?
假设我有一个包含三个字段和两个提交按钮的 h:form
。提交按钮是 显示报告 和 生成数据 。为了简单起见,我宁愿只有一种形式而不是多种形式。当显示报告时,需要三个字段的值作为报告显示的标准。所以我将它们标记为 required="true"
但这会禁用 生成数据 的执行,它不需要这三个字段。
有没有一种方法可以使 JSF 表单字段有条件地成为必填字段,而无需太多自定义编码,例如 requiredIf=#{condition}
?
如果生成数据 操作不需要对表单数据进行任何转换或验证,则将此按钮的属性 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
属性的值。仅当用户按下 Display Report 按钮时,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>
假设我有一个包含三个字段和两个提交按钮的 h:form
。提交按钮是 显示报告 和 生成数据 。为了简单起见,我宁愿只有一种形式而不是多种形式。当显示报告时,需要三个字段的值作为报告显示的标准。所以我将它们标记为 required="true"
但这会禁用 生成数据 的执行,它不需要这三个字段。
有没有一种方法可以使 JSF 表单字段有条件地成为必填字段,而无需太多自定义编码,例如 requiredIf=#{condition}
?
如果生成数据 操作不需要对表单数据进行任何转换或验证,则将此按钮的属性 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
属性的值。仅当用户按下 Display Report 按钮时,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>