2012-11-08 51 views
1

只想知道为什么我会在我的应用程序中遇到此行为。防止在JSF对话框上双重提交AJAX CRUD

我用于用户界面的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操作。

帮助?

UPDATE

我打开我的对话框与此代码

<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> 

其实我是跟着从这个网站的网页... Full WebApplication JSF EJB JPA JAAS

+0

如果你只使用ajax,那实在是不可能的。预先通过同步POST请求打开页面?也许你正在通过commandlinks而不是正常(输出)链接进行导航? – BalusC

+0

但显然这是我的情况。我已更新我的帖子以获取更多信息 –

+0

还检查萤火虫,发现我的commandbutton正在发射同步请求而不是ajax样式。我试着设置属性ajax =“true”,但这并没有解决问题。任何提示,请问为什么按钮的行为是这样的? –

回答

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(); 
    } 
} 
+0

哈哈哈......确切! Javascript错误真的是原因,因为我在回调中错过了一个逗号....非常感谢! –

+0

欢迎您! –