我有一个包含很多组件的完整表单,包括一个 p:tab
当我点击 p:commandButton id=c1 提交整个表单内容时:
- 我需要验证整个表单所需的消息,但我确实需要忽略 p:tab 所需的消息字段。
- 如果我在 p:tab 中单击 p:commandButton id=c2,我只需要验证 p:tab 中所需的消息字段。
最好的解决方案是什么?提前致谢。
最佳答案
您似乎在使用“上帝形态”反模式。所有东西都放在一个<h:form>
中.这是一个糟糕的设计/实践。最明智的方法是将字段和按钮放在单独的表单中,这样只有相关的字段和按钮在其自己的表单中,这样表单提交就不会不必要地提交/处理/转换/验证其他表单中的无关数据。
另见:
如果由于某些(奇怪的?)设计限制而无法做到这一点,那么至少还有 2 种其他方法:
如果您使用的是 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" />
另请参阅:Understanding PrimeFaces process/update and JSF f:ajax execute/render attributes
如果您不使用 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}" ... />
(注意:
c1
或c2
不需要额外的 bean 属性!代码是原样)另见 How to let validation depend on the pressed button?
您可以使用更自记录的变量名稍微重构它:
<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}" ... />
关于forms - 仅验证表单的特定部分而不是整个表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17450326/