2012-10-01 100 views
0

我在維護一個似乎以某種方式重複記錄的ASP.Net應用程序,例如使用頁面添加用戶。我無法重現,但我發現一些代碼,做一些瘋狂的喜歡上提交:是否有可能觸發__doPostBack兩次?

if(crazy-code()){ 
    __doPostBack() // 2nd 
} 

和瘋狂代碼也做類似

function crazy-code() 
{ 
    ... 
    __doPostBack() // 1st 
    ... 
    return true; 
} 

要找出這一段代碼導致這個問題,我一直在試圖發射兩個__doPostBack,但我無法做到這一點。 從理論上講,總是會發生什麼,當它觸發(1st)__doPostBack時,它應該發送請求,然後停止/忽略任何客戶端代碼。 如果__doPostBack被解僱兩次,會有什麼原因?瀏覽器?速度? ???

回答

0

__doPostBack()調用將提交表單,它不應該調用第二個。

我可能是錯的,但我認爲如果您在網頁上點擊「提交」,並在頁面重新加載命中「F5」後,您可以重現您的問題。根據瀏覽器的不同,它會詢問「重新發送數據?」。選擇「是」並檢查您的記錄是否重複。

在任何情況下,我認爲你需要在服務器端插入數據時添加對重複值的檢查。

+0

我重現通過重新加載頁面/幀,但事實並非如此。添加用戶頁面是一個iframe,因此,例如在Firefox中,在確認提醒期間,我們必須右鍵單擊幀>此幀>重新加載幀,然後FF確認。這不是創建這個重複記錄的原因。 – Jaider

0

我能夠創建測試代碼。在FF和鉻似乎工作正常(1提交),但IE9(和兼容性版本)似乎打了1,2或3次。 注意:submit()會導致回發。 CASE 1.延遲在Javascript 頁:

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title>testing</title> 
    <script type="text/javascript"> 
     function submitForm() { 
      document.forms[0].submit(); 
      alert("delay"); 
      document.forms[0].submit(); 
     } 
    </script> 
</head> 
<body> 
    <form id="form1" name="form1" runat="server"> 
    <div> 
     <asp:TextBox ID="TextBox1" runat="server" Width="220px"></asp:TextBox> 
     <button onclick="submitForm(this)">CLICK</button> 
     <br /> 
     <asp:Label ID="Label1" runat="server"></asp:Label> 
    </div> 
    </form> 
</body> 
</html> 

後面的代碼:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if(IsPostBack) 
    { 
     incrementVal(); 
    } 
} 

private void incrementVal() 
{ 
    var val = (int)(Session["val_" + TextBox1.Text] ?? 0); 
    val++; 
    Label1.Text += TextBox1.Text + ": " + val.ToString("00") + " - " + DateTime.Now.ToLongTimeString() + "<br/>"; 
    Session["val_" + TextBox1.Text] = val; 
} 

enter image description here

案例2:慢速響應

刪除JS警報:

function submitForm() { 
    document.forms[0].submit(); 
    document.forms[0].submit(); 
} 

增加延遲在服務器端:

if(IsPostBack) 
{ 
    incrementVal(); 
    Thread.Sleep(500); 
} 
相關問題