仅验证表单的特定部分而不是整个表单

时间:2013-07-03 14:11:17

标签: forms validation jsf primefaces

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

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

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

最佳解决方案是什么?提前谢谢。

2 个答案:

答案 0 :(得分:7)

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

另见:


如果由于某些(奇怪的?)设计限制而无法实现,那么至少还有其他两种方式:

  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" />
    

    另请参阅:Understanding PrimeFaces process/update and JSF f:ajax execute/render attributes

  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}" ... />
    

    (注意:c1c2不需要额外的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}" ... />
    

答案 1 :(得分:-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" />