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

标签 forms validation jsf primefaces

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

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

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

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

最佳答案

您似乎在使用“上帝形态”反模式。所有东西都放在一个<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}" ... />
    

关于forms - 仅验证表单的特定部分而不是整个表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17450326/

相关文章:

eclipse - f :param doesn't work with h:commandButton

php - 如何使用 HTML 表单在 PHP 中创建提交按钮?

mysql - 使用重力形式 gform_after_submission 将提交的数据推送到 mySQL

java - java中的扩展形式

javascript - 如何在表单验证中建立一个具有三个输入的组?

validation - Golang验证程序:structExcept

forms - Dart 未获得输入值

asp.net-mvc - ASP.NET MVC RC2 - 为什么我不能使用正常的验证选项?例如必填字段验证器

jsf - primefaces 自动完成焦点显示建议

java - requestScope 中的以下属性在哪里? "requestScope.shouldRender"