如何让验证取决于按下的按钮?

时间:2011-12-03 20:17:37

标签: validation jsf jsf-2 primefaces commandbutton

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

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

<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的新手。

4 个答案:

答案 0 :(得分:61)

我了解您要根据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)已作为请求参数发送,您可以在请求参数映射中检查它的存在。

另见:

答案 1 :(得分:6)

我用非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按钮提交时才需要验证第一个输入。

答案 2 :(得分:6)

除了BalusC答案(非常有用和完整)之外,我想补充一点,当你使用<h:commandButton />时,它会验证(必需的,自定义验证)<h:form />命令所在的所有字段按钮位于,因此当您需要使用多个命令按钮时,您可以认为最好使用不同的<h:form />来执行不同的职责,以避免在命令按钮的提交操作中出现意外行为。 在BalusC的回答中很好地解释了这一点:Multiple h:form in a JSF Page

如果您的表单有验证且您没有更新<h:form />或者您没有显示消息,那么您可能会感到头疼,因为<h:commandButton />没有触发您的操作,但可能是验证问题尚未显示。

答案 3 :(得分:2)

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

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

编辑:

关于SO的相关帖子,我认为这也将解决您的问题

JSF 2.0: How to skip JSR-303 bean validation?