【问题标题】:Validate only specific parts of the form instead of whole form仅验证表单的特定部分而不是整个表单
【发布时间】:2016-02-18 20:38:23
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: forms validation jsf primefaces


    【解决方案1】:

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

    另见:


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

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

    【讨论】:

    • 您的知识对我帮助很大。感谢你的宝贵时间。我将遵循最佳设计实践并根据您的答案进行更改。
    【解决方案2】:

    仅供参考,您还可以处理包含您要验证的控件的面板的 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" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多