primefaces 命令按钮 ajax 提交作为非 ajax 提交

primefaces commandbutton ajax submit works as a non-ajax submit

我正在使用 primefaces 3.5,我想更新使用 p:commandButton 和 ajax 的对象的 de 值,但是当我单击 p:commandButton 时,表单完全提交为非ajax提交。我尝试使用 immediate=true, ajax="true" (但我读到此选项是默认选项) partial-submit="true" 但没有,按钮刷新所有页面而不是仅仅asignarUA 组件。

注意:这是一个 liferay (6.2 CE) portlet。

这是部分代码:

<html xmlns="http://www.w3.org/1999/xhtml"  
xmlns:h="http://java.sun.com/jsf/html"  
xmlns:f="http://java.sun.com/jsf/core"  
xmlns:p="http://primefaces.org/ui">
<h:head></h:head>
<h:body>
<h:form>
    <p:commandButton onclick="asignarUADlg.show()" update=":asignarUA" title="Asignar" value="Asignar">
    <f:setPropertyActionListener value="#{solicitud }" target="#{mailboxView.solicitud}"/>
    </p:commandButton>                                                
</h:form>


<p:dialog id="asignarUA" widgetVar="asignarUADlg" modal="true" header="Asignar Unidades Administrativas" width="530" showEffect="fade" hideEffect="fade">
    <h:form enctype="multipart/form-data">
        <h:outputLabel for="dependencia" value="Dependencia: " />
        <h:outputText value="#{mailboxView.solicitud.nombreDependencia}" rendered="#{not empty mailboxView.solicitud}" />
        <p:separator />

        <p:commandButton value="Enviar" ajax="false" actionListener="#{mailboxView.asignar}" update=":messages2"/>
        <p:commandButton value="Cancelar" onclick="asignarUADlg.hide()" type="button"/>
    </h:form>
</p:dialog>
</h:body>
</html>

您的第一个 p:commandButton 正在显示对话框,然后又立即将其隐藏。这也会导致页面闪烁,我认为您将这种闪烁误认为是 non-ajax 提交。当您单击 p:commandButton 时,将调用 dialog.show() 并显示对话框。然后 update=":dialogId" 代码运行*并向服务器发送 ajax 请求到 re-render 对话框。由于服务器不知道 dialog.show() 已在客户端上调用,因此服务器认为对话框应仍处于其默认状态:隐藏。因此返回的部分响应将对话框重置为初始状态并再次隐藏对话框。

解决方案是更新对话框的内容而不是整个对话框。对于您的特定示例,您应该将 id 添加到第二个 h:form 并通过 Asignar 按钮更新:

<h:form>
    <p:commandButton onclick="asignarUADlg.show()" update=":dialogContent"
    title="Asignar" value="Asignar">

<!-- ... -->

<p:dialog id="asignarUA" widgetVar="asignarUADlg" modal="true"
    header="Asignar Unidades Administrativas" width="530" showEffect="fade" hideEffect="fade">
    <h:form id="dialogContent" enctype="multipart/form-data">

<!-- ... -->

*update 属性导致 p:commandButton 呈现代码以在其 onclick 属性中发送 ajax 请求。所以 ajax 代码实际上是在 dialog.show().

之后调用的

我必须将我的 PrimeFaces 版本升级到 5.3 并且它可以工作。我唯一需要更改的是进程属性:

<p:commandButton process="@this :dialogContent" update=":dialogContent" onclick="PF('asignarUADlg').show()" title="Asignar" value="Asignar">
    <f:setPropertyActionListener value="#{solicitud }" target="#{mailboxView.solicitud}"/>
</p:commandButton>