1

只是想知道为什么我会在我的应用程序中遇到这种行为。

我在 UI 中使用了 primefaces,几乎我所有的页面都遵循这种模式。我在所有 CRUD 操作中大量使用 AJAX,并使用对话框将其展示给用户。

<ui:composition template="myTemplate.xhtml">
    <ui:define name="content">
        <ui:include
            src="/pages/CreateDialog.xhtml" />
        <ui:include
            src="/pages/UpdateDialog.xhtml" />
        <ui:include
            src="/pages/DeleteDialog.xhtml" />
    </ui:define>
</ui:composition>

我唯一担心的是,在我的对话框中执行 CRUD 之后,用户不小心点击了 F5 或在浏览器上刷新,总是提到 FF/Chrome 和其他浏览器

To display this page, Firefox must send repeat action...

显然这会导致双重提交。以前我在旧应用程序的这种情况下使用 Post-Redirect-Get,但由于这是 AJAX JSF 更新,所以我不能这样做。

有什么解决方法,这是正常的吗?我认为在浏览器刷新期间不应再次触发 AJAX 操作。

帮助?

更新

我正在用这段代码打开我的对话框

<p:commandButton value="Add" 
        onclick="createWidget.show();"
        update=":CreateForm"
        action="#{MyBean.add}" 
        />

我的创建对话框使用这个

<p:dialog  header="Create">
    <h:form id="CreateForm" prependId="false">
        <p:commandButton value="Add" icon="ui-icon-plus"
            actionListener="#{MyBean.add}"
            update=":messageGrowl" 
            oncomplete="closeDialogIfSucess(xhr, status, args, createWidget 'createDialogId')"/>
    </h:form>
</p:dialog>

我实际上正在关注这个站点的页面......完整的 WebApplication JSF EJB JPA JAAS

4

1 回答 1

2

已经经历过几次回调方法中的 JavaScript 错误最终会导致这种行为。我能够重现您在更正回调签名后消失的问题:

oncomplete="closeDialogIfSucess(xhr, status, args, createWidget, 'createDialogId')"

根据您的 JavaScript 函数签名:

function closeDialogIfSucess(xhr, status, args, createWidget, dialogid)

(如果您的 JavaScript 调用只有 3 个参数,请更正oncomplete调用)

无关:我猜你正在使用这个函数来关闭一个特定的对话框。另一种方法是将widgetVar属性分配给您的对话框:

<p:dialog id="testDialog"  header="Create" widgetVar="createWidget">
    <h:form id="CreateForm" prependId="false">
        ...
    </h:form>
</p:dialog>

widgetVar对象将在回调函数中表示您的对话框,因此您可以通过调用hide()对话框的函数来关闭它:

function closeDialogIfSucess(xhr, status, args, createWidget) {
    if(args.validationFailed || !args.loggedIn) {  
        jQuery('#testDialog').effect("shake", { times:3 }, 100);  
    } else {  
        createWidget.hide();  
    }  
}
于 2012-11-08T06:20:19.713 回答