2011-09-08 128 views
5

我有一個以空白/默認狀態開始的儀表板。我讓用戶能夠將已保存的狀態加載到儀表板中。當他們點擊「應用」按鈕,我運行下面的代碼:提示確認表單重新提交後重新提交。我做錯了什麼?

function CloseAndSave() { 
    var radUpload = $find(radUpload1ID); 
    var inputs = radUpload.getFileInputs(); 

    if (inputs[0].value.length == 0) { 
     alert('Please select a dashboard to upload.'); 
     return; 
    } 

    if(!radUpload.isExtensionValid(inputs[0].value)) { 
     alert('Please select an XML file.'); 
     radUpload.clearFileInputAt(0); 
     return; 
    } 

    oWindow = null; 
    __doPostBack(radButton1ID); 
} 

protected void RadButton1_Click(object sender, EventArgs e) 
{ 
    if (RadUpload1.UploadedFiles.Count > 0) 
    { 
     UploadedFile dashboardXMLFile = RadUpload1.UploadedFiles[0]; 

     SerializableDictionary<string, string> dataToLoad = new SerializableDictionary<string, string>(); 
     XmlSerializer xmlSerializer = new XmlSerializer(dataToLoad.GetType()); 

     using (StreamReader reader = new StreamReader(dashboardXMLFile.InputStream)) 
     { 
      dataToLoad = (SerializableDictionary<string, string>)xmlSerializer.Deserialize(reader); 
     } 

     foreach (var entry in dataToLoad) 
     { 
      string sessionKey = entry.Key; 

      if (!string.IsNullOrEmpty(entry.Value)) 
      { 
       Type type = StateManager.GetTypeFromStateName(sessionKey); 

       byte[] data = Convert.FromBase64String(entry.Value); 
       using (MemoryStream memoryStream = new MemoryStream(data)) 
       { 
        xmlSerializer = new XmlSerializer(type); 
        SessionRepository.Instance.SetSession(sessionKey, xmlSerializer.Deserialize(memoryStream)); 
       } 
      } 
     } 
    } 
} 

RadButton1擁有財產「的AutoPostBack」設置爲false。我已經將AutoPostBack設置爲false,因爲我想在運行click事件之前執行驗證。所以,現在,我執行客戶端驗證,然後讓按鈕單擊運行。

沒有更新面板包裝RadButton1。因此,整個頁面發佈在RadButton1_Click之後。這會導致頁面狀態「加載」解析的狀態。

此時,如果我刷新頁面,Chrome瀏覽器會顯示「請確認表單重新提交」。我已閱讀如何壓制這一點,但我寧願追查根本原因。

解決方案:

//This changes the response to a GET instead of a POST. Prevents the 'Form Resubmission' dialog. 
Page.Response.Redirect(Page.Request.Url.ToString(), true); 
+0

任何時候通過表單POST提交頁面,使用瀏覽器按鈕(F5或其他)將刷新頁面(應該)提示您。這是正常的行爲。您必須禁止它,因爲根本原因是普通的瀏覽器行爲,意圖防止意外重新提交表單,而這些表單實際上會執行某些操作,例如提交付款。 – Nikki9696

+0

我認爲如果這些數據悄悄地重新提交,就會發生不好的事情。我需要找到一種方法來清除POST數據。我正在閱讀關於PRG的內容。 –

回答

10

當您刷新瀏覽器,它會重新發送你做的最後一個請求。如果這是一個POST請求(就像你在回發的情況下那樣),那麼它會重新發布信息,但在做之前你會看到你描述的警告信息。

避免這個問題的最好辦法是實施模式Post/Redirect/Get

郵政/重定向/獲取(PRG)是Web開發人員提供了常見的設計模式,以幫助避免某些重複的表單提交,並允許用戶代理通過書籤和刷新按鈕更直觀地進行操作。

通常情況下,人們不會執行此操作(雖然我們應該),除非重新發布可能會導致某些數據不一致。

+0

嘿,所以我做了一些關於此的閱讀,我對如何實現它感到困惑。你知道任何ASP.NET AJAX的例子嗎?我做了一些谷歌搜索,但大部分的談話都是概念性的。我正在考慮進入PageRequestManager的OnResponseEnd事件並在檢測到適當的條件時重定向到頁面。這聽起來合理嗎? –

+0

我將此標記爲您提供的有價值信息的答案,但爲了獲取更多信息,我已將討論移至新帖子。謝謝! –

+0

@肖恩安德森:我有點困惑。我的想法可能不太好。你說RadButton1在不使用AJAX的情況下提交了整個頁面。因此,如果請求不涉及任何ajax交互,您不知道爲什麼要嘗試涉及PageRequestManager。 –

0

當您刷新瀏覽器時,它將重新發送您所做的最後一個請求。如果這是一個POST請求(就像你在回發的情況下那樣),那麼它會重新發布信息,但在做之前你會看到你描述的警告信息。