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>
我正在使用 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>