猿问

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

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

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

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

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


拉丁的传说
浏览 465回答 3
3回答

九州编程

我知道你想根据name输入字段进行过滤。在<p:commandButton>默认情况下,发送一个Ajax请求,并且具有process属性,其中可以指定要在提交处理的组件。在您的特定情况下,您应该只处理name输入字段和当前按钮(以便调用其操作)。<p:commandButton&nbsp;process="@this&nbsp;name"&nbsp;...&nbsp;/>该process属性可以采用空间分隔的组件的(相对)客户端ID集合,其中@this引用当前组件。它默认为<p:commandButton>to&nbsp;@form(覆盖当前表单的所有输入字段和按下的按钮),这就是为什么它们都在您的初始尝试中得到验证的原因。在上面的示例中,不会处理所有其他输入字段(因此也不会进行验证)。但是,如果您打算在按下相关按钮时跳过所有字段的required验证,那么您最终可以处理多个不一定需要全部填写的字段,那么您需要创建一个条件而不是检查按钮是否被按下。例如,只有在按下保存按钮时才进行评估:required="true"true<p:inputText&nbsp;...&nbsp;required="#{not&nbsp;empty&nbsp;param[save.clientId]}"&nbsp;/>...<p:inputText&nbsp;...&nbsp;required="#{not&nbsp;empty&nbsp;param[save.clientId]}"&nbsp;/>...<p:commandButton&nbsp;binding="#{save}"&nbsp;value="Save"&nbsp;...&nbsp;/>这样,required="true"当按下不同的按钮时,它将不会被验证。上面示例中的技巧是按下的按钮的名称(本质上是客户端ID)已作为请求参数发送,您可以在请求参数映射中检查其存在。也可以看看:了解PrimeFaces进程/更新和JSF f:ajax执行/呈现属性

呼唤远方

除了BalusC的答案(非常有用和完整),我想补充一点,当你使用<h:commandButton />它时,它将验证(必需的,自定义验证)<h:form />命令按钮所在位置的所有字段,因此当你需要使用多个字段时在命令按钮中,您可以认为使用不同<h:form />的不同职责来避免命令按钮的提交操作中的意外行为是一种很好的做法。在BalusC的答案中很好地解释了:JSF页面中的多个h:表单如果您的表单有验证而且您没有更新<h:form />或者您没有显示消息,那么您可能会头疼,认为<h:commandButton />未触发您的操作,但可能是未显示的验证问题。

白猪掌柜的

我用非ajax提交测试了这个:<p:inputText&nbsp;...&nbsp;required="#{not&nbsp;empty&nbsp;param.includeInSave1}"&nbsp;/>...<p:inputText&nbsp;...&nbsp;required="true"&nbsp;/>...<p:commandButton&nbsp;value="Save1"&nbsp;ajax="false"> &nbsp;&nbsp;<f:param&nbsp;name="includeInSave1"&nbsp;value="true"&nbsp;/></p:commandButton><p:commandButton&nbsp;value="Save2"&nbsp;ajax="false"&nbsp;/>只有在Save1按钮提交时才需要验证第一个输入。
随时随地看视频慕课网APP
我要回答