如何在验证后重置表单中的输入字段,当使用新值更新表单时失败



我正在使用 JSF 2 和 PrimeFaces 4.0。

我有一个包含一些输入和验证的表格。从对话框中选择实体时,某些字段可能会自动填充。当我在提交整个表单(并验证)之前选择实体时,这工作正常。但是当我在验证后选择一个实体时,组件的更新不起作用。

JSF 页面:

<h:form id="form">
    <p:inputText id="id" value="#{bean.user.id}" required="true" 
        onclick="PF('usersDialog').show()" />
    <p:inputText id="name" value="#{bean.user.name}" required="true"
        onclick="PF('usersDialog').show()" />
    <p:commandButton value="submit" action="#{bean.submit}" update=":form" />
</h:form>
<p:dialog widgetVar="usersDialog">
    <h:form>
        <p:dataTable value="#{bean.users}" var="user">
            <p:column>
                <p:commandButton value="choose" onclick="PF('usersDialog').hide()"
                    process="@this" action="#{bean.select(user)}" update=":form" />
            </p:column>
            <p:column>
                <h:outputText value="#{user.name}" />
            </p:column>
        </p:dataTable>
    </h:form>
</p:dialog>

我知道这取决于 JSF 生命周期,但我无法修复它。那么,从对话框中选择新实体时,验证失败后如何更新表单呢?

提前谢谢。

正是出于这个目的,引入了<p:resetInput>组件(基于 OmniFaces ResetInputAjaxActionListener)。

将其嵌套在命令按钮内,target设置为与命令按钮的属性相同的客户端 ID update

<p:commandButton ... update=":form">
    <p:resetInput target=":form" />
</p:commandButton>

另请参阅:

  • 发生验证错误后,如何使用PrimeFaces AJAX填充文本字段?
  • 在不执行验证的情况下重置输入字段

尝试以下方法:

<h:form id="form">
    <p:panel style="width: 80%;">
        <p:fieldset legend="Some User" id="costAuthUser">
            <p:panelGrid columns="3">
                <h:outputLabel for="costUserId">User-ID</h:outputLabel>
                <p:inputText id="costUserId" onclick="PF('costAuthDialog').show()"
                    value="#{createCert.costAuthUser.userId }" required="true"
                    requiredMessage="Bitte geben Sie die UserID ein." />
                <p:message for="costUserId" />
                <h:outputLabel for="costLastName">Name</h:outputLabel>
                <p:inputText id="costLastName"
                    onclick="PF('costAuthDialog').show()"
                    value="#{createCert.costAuthUser.lastName }" />
                <!-- <p:watermark value="" for="costLastName"/> -->
                <p:message for="costLastName" />
            </p:panelGrid>
        </p:fieldset>
        <p:separator />
        <p:commandButton value="submit" action="#{createCert.prepareEmail }" update=":form"/>
    </p:panel>
<h:form>

<p:dialog widgetVar="costAuthDialog" resizable="false" header="Some User">
    <h:form id="dialogForm">
        <p:dataTable value="#{createCert.costAuthList}" var="user">
            <p:column>
             <p:commandButton value="choose" process="@this"
                oncomplete="PF('costAuthDialog').hide()" action="#{createCert.selectCostAuth(user) }" update=":form"/>
            </p:column>
            <p:column headerText="Name">
                <h:outputText value="#{user.lastName}" />
            </p:column>
            <!-- Some more -->
        </p:dataTable>
    </h:form>
</p:dialog>

我认为重新渲染对话框层次结构存在一些问题,这样对话框就不会更新。

你应该使用oncomplete="PF('costAuthDialog').hide()"而不是onclick

最新更新