3

我有一个包含很多组件的完整表单,包括 ap:tab

当我点击 p:commandButton id=c1提交整个表单内容时:

  • 我需要验证整个表单所需的消息,但我确实需要忽略 p:tab 所需的消息字段。
  • 如果我单击 p:tab 中的 p:commandButton id=c2,我只需要验证 p:tab 中的必需消息字段。

什么是最好的解决方案?提前致谢。

4

2 回答 2

8

您似乎正在使用“上帝形态”反模式。一切都放在一个单一的<h:form>. 这是一个糟糕的设计/实践。最明智的方法是将字段和按钮放在单独的表单中,以便只有相关的字段和按钮在自己的表单中,这样表单提交就不会不必要地提交/处理/转换/验证其他表单中的不相关数据。

也可以看看:


如果由于某些(奇怪的?)设计限制而无法做到这一点,那么至少还有另外两种方法:

  1. 如果您使用的是 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" />
    

    另请参阅:了解 PrimeFaces 进程/更新和 JSF f:ajax 执行/渲染属性

  2. 如果您没有使用 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 属性c1or 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}" ... />
    
于 2013-07-03T15:21:25.860 回答
-1

仅供参考,您还可以处理包含要验证的控件的面板的 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" />
于 2019-06-06T04:56:51.220 回答