我有一个包含很多组件的完整表单,包括 ap:tab
当我点击 p:commandButton id=c1提交整个表单内容时:
- 我需要验证整个表单所需的消息,但我确实需要忽略 p:tab 所需的消息字段。
- 如果我单击 p:tab 中的 p:commandButton id=c2,我只需要验证 p:tab 中的必需消息字段。
什么是最好的解决方案?提前致谢。
我有一个包含很多组件的完整表单,包括 ap:tab
当我点击 p:commandButton id=c1提交整个表单内容时:
什么是最好的解决方案?提前致谢。
您似乎正在使用“上帝形态”反模式。一切都放在一个单一的<h:form>
. 这是一个糟糕的设计/实践。最明智的方法是将字段和按钮放在单独的表单中,以便只有相关的字段和按钮在自己的表单中,这样表单提交就不会不必要地提交/处理/转换/验证其他表单中的不相关数据。
如果由于某些(奇怪的?)设计限制而无法做到这一点,那么至少还有另外两种方法:
如果您使用的是 ajax,那么您可以使用该process
属性。它默认@form
将处理整个表单。它接受您希望在提交期间处理的输入字段的(相对)客户端 ID 的空格分隔字符串。
<p:inputText id="field1" ... required="true" />
<p:inputText id="field2" ... required="true" />
...
<p:inputText id="field3" ... required="true" />
<p:inputText id="field4" ... required="true" />
...
<p:commandButton id="c1" ... process="field1 field2" />
...
<p:commandButton id="c2" ... process="field3 field4" />
如果您没有使用 ajax,或者希望使用非 ajax 回退,那么只需检查required
按下哪个按钮的属性。这很容易通过检查请求参数映射中是否存在按钮的客户端 ID。
<p:inputText id="field1" ... required="#{not empty param[c1.clientId]}" />
<p:inputText id="field2" ... required="#{not empty param[c1.clientId]}" />
...
<p:inputText id="field3" ... required="#{not empty param[c2.clientId]}" />
<p:inputText id="field4" ... required="#{not empty param[c2.clientId]}" />
...
<p:commandButton id="c1" binding="#{c1}" ... />
...
<p:commandButton id="c2" binding="#{c2}" ... />
(注意:不需要额外的 bean 属性c1
or c2
!代码是原样的)
另请参阅如何让验证取决于按下的按钮?
您可以使用更自记录的变量名称对其进行重构:
<c:set var="c1ButtonPressed" value="#{not empty param[c1.clientId]}" />
<c:set var="c2ButtonPressed" value="#{not empty param[c2.clientId]}" />
...
<p:inputText id="field1" ... required="#{c1ButtonPressed}" />
<p:inputText id="field2" ... required="#{c1ButtonPressed}" />
...
<p:inputText id="field3" ... required="#{c2ButtonPressed}" />
<p:inputText id="field4" ... required="#{c2ButtonPressed}" />
...
<p:commandButton id="c1" binding="#{c1}" ... />
...
<p:commandButton id="c2" binding="#{c2}" ... />
仅供参考,您还可以处理包含要验证的控件的面板的 id - 例如:
<p:outputPanel id="thisPanel">
<p:inputText id="field1" ... required="#{not empty param[c1.clientId]}" />
<p:inputText id="field2" ... required="#{not empty param[c1.clientId]}" />
<p:commandButton id="c2" ... process="thisPanel" />