如何让验证依赖于按下的按钮



我已经创建了表单,我想在创建新表时显示表上的先前现有项。我想在填写表格时显示匹配的项目。但是,当我试图在没有完成表单的情况下过滤列表时,会出现验证消息,并且表不会更新。

不知道是否可能,但是我想这样做:

<h:form id="form">
    <h:outputText value="Name: "/>
    <p:inputText value="#{itemsBean.name}" id="name" required="true"/>
    <br/>
    <h:outputText value="Description: "/>
    <p:inputText value="#{itemsBean.description}" id="description" required="true"/>
    <p:commandButton value="Save" update="form" actionListener="#{itemsBean.save}"/> //validate and save
    <p:commandButton value="Filter" update="form" actionListener="#{itemsBean.updateItemsList}"/> //don't validate, and update the table.
    <p:dataTable id="list" value="#{itemsBean.itemsList}" var="item">     
        <p:column>
            <h:outputText value="#{item.name}"/>
        </p:column>
        <p:column>
            <h:outputText value="#{item.description}"/>
        </p:column>
    </p:dataTable>
</h:form>

我是JSF新手。

我理解您希望基于name输入字段进行过滤。默认情况下,<p:commandButton>发送一个ajax请求,并且有一个process属性,您可以在其中指定要在提交期间处理哪些组件。在您的特殊情况下,您应该只处理 name输入字段和当前按钮(以便调用其操作)。

<p:commandButton process="@this name" ... />

process属性可以采用一个空格分隔的组件(相对)客户端id集合,其中@this表示当前组件。默认情况下,<p:commandButton>@form(覆盖当前表单的所有输入字段和按下的按钮),这就是为什么它们都在初始尝试中被验证的原因。在上面的示例中,所有其他输入字段都不会被处理(因此也不会被验证)。

如果你打算跳过required所有字段的验证,无论何时按钮被按下,这样你就可以最终处理多个字段,而不一定需要所有填写,然后你需要使required="true"成为一个条件,检查按钮是否被按下。例如,让它只在按下保存按钮时才计算true:

<p:inputText ... required="#{not empty param[save.clientId]}" />
...
<p:inputText ... required="#{not empty param[save.clientId]}" />
...
<p:commandButton binding="#{save}" value="Save" ... />

这样,当按下不同的按钮时,它不会被验证为required="true"。上面示例中的技巧是,按下按钮的名称(本质上是客户端ID)作为请求参数发送,并且您可以在请求参数映射中检查它的存在。

参见:

  • 了解PrimeFaces process/update和JSF f:ajax execute/render属性

我已经测试了这与非ajax提交:

<p:inputText ... required="#{not empty param.includeInSave1}" />
...
<p:inputText ... required="true" />
...
<p:commandButton value="Save1" ajax="false">
  <f:param name="includeInSave1" value="true" />
</p:commandButton>
<p:commandButton value="Save2" ajax="false" />

第一个输入只需要在Save1按钮提交时验证

此外BalusC答案(非常有用的和完整的)我想补充说,当你使用<h:commandButton />将验证(需要、自定义验证)中的所有字段<h:form />命令按钮的位置,因此,当您需要使用一个以上的命令按钮你可以考虑,这是一个很好的实践使用不同<h:form />不同的责任,以避免意外的行为提交命令按钮的操作。在BalusC的回答中有很好的解释:JSF页面中的多个h:表单

如果您的表单有验证,您不更新<h:form />或您不显示消息,您可能会感到头痛,认为<h:commandButton />没有触发您的操作,但可能是一个验证问题,尚未显示

像这样更改过滤器命令按钮以忽略验证:

<p:commandButton value="Filter" update="list" actionListener="#{itemsBean.updateItemsList}" process="@this"/>
编辑:

关于SO的相关帖子,我想这也会解决你的问题

JSF 2.0:如何跳过JSR-303 bean验证?

最新更新