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

Rot*_*eke 34 validation jsf primefaces jsf-2 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>
Run Code Online (Sandbox Code Playgroud)

我是JSF的新手.

Bal*_*usC 61

我知道你想根据name输入字段进行过滤.在<p:commandButton>默认情况下,发送一个Ajax请求,并且具有process属性,其中可以指定要在提交处理的组件.在您的特定情况下,您应该处理name输入字段和当前按钮(以便调用其操作).

<p:commandButton process="@this name" ... />
Run Code Online (Sandbox Code Playgroud)

process属性可以采用空间分隔的组件的(相对)客户端ID集合,其中@this引用当前组件.它默认为<p:commandButton>to @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" ... />
Run Code Online (Sandbox Code Playgroud)

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

也可以看看:

  • 可以提供一个更详细的例子来说明`save`元素应该来自哪里?它是豆吗?和`clientId`一个参数?就像我之前说的那样,我对Java和JSF很新,而且我一直在研究很多.但我仍然不知道我是否在问一些太基本的东西.非常感谢你花时间回答. (3认同)
  • 不,这个例子是原样的。`#{save}` 绑定到视图。`clientId` 只是它的属性。另请参阅 http://docs.oracle.com/javaee/6/api/javax/faces/component/UIComponent.html#getClientId%28%29。没有必要将它绑定到 bean 属性,除非您想从 bean 内部操作组件。但是,如果您不需要,则不需要在 bean 中有未使用的属性。另见 http://stackoverflow.com/questions/8168302/jsf-component-binding-without-bean-property (2认同)

mne*_*rco 8

我用非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" />
Run Code Online (Sandbox Code Playgroud)

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


Cri*_*aga 6

除了BalusC的答案(非常有用和完整),我想补充一点,当你使用<h:commandButton />它时,它将验证(必需的,自定义验证)<h:form />命令按钮所在位置的所有字段,因此当你需要使用多个字段时在命令按钮中,您可以认为使用不同<h:form />的不同职责来避免命令按钮的提交操作中的意外行为是一种很好的做法.在BalusC的答案中很好地解释了:JSF页面中的多个h:表单

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