我已经创建了表单,我想在创建新表时显示表上的先前现有项。我想在填写表格时显示匹配的项目。但是,当我试图在没有完成表单的情况下过滤列表时,会出现验证消息,并且表不会更新。
不知道是否可能,但是我想这样做:
<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验证?