2012-11-08 78 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

歡迎您! –