36

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

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

<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

4 回答 4

66

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

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

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

但是,如果您打算在按下相关按钮时跳过所有required字段的验证,以便您最终可以处理不一定需要全部填写的多个字段,那么您需要设置a 条件而不是检查按钮是否被按下。例如,让它仅在按下保存按钮时进行评估: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)作为请求参数发送,您可以在请求参数映射中检查它的存在。

也可以看看:

于 2011-12-03T22:58:19.733 回答
9

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

于 2014-08-09T14:38:22.573 回答
7

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

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

于 2015-03-01T05:54:29.973 回答
2

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

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

编辑:

SO上的相关帖子,我认为这也可以解决您的问题

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

于 2011-12-03T20:25:38.420 回答