簡體   English   中英

是否可以觸發__doPostBack兩次?

[英]Is possible to fire __doPostBack twice?

我正在維護一個ASP .Net應用程序,該應用程序似乎以某種方式復制了一條記錄,例如使用頁面添加用戶。 我無法復制,但是在提交時發現了一些瘋狂的代碼:

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

和瘋狂的代碼也做類似的事情

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

為了找出導致此問題的代碼,我一直試圖同時觸發__doPostBack但是我無法執行。 從理論上講,應該總是發生在觸發第一個__doPostBack ,它應該發送請求並隨后停止/忽略任何客戶端代碼。 如果__doPostBack被觸發兩次,原因是什么? 瀏覽器? 速度? ???

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

我可能是錯的,但是我認為如果您在網頁上單擊“提交”,並且在頁面重新加載后單擊“ F5”,則可以重現您的問題。 根據瀏覽器的不同,它會詢問諸如“是否從數據中發送數據?”之類的信息。 選擇“是”,然后檢查您的記錄是否重復。

無論如何,我認為在服務器端插入數據時需要添加對重復值的檢查。

我能夠創建測試代碼。 在FF和chrome中似乎可以正常工作(提交1次),但IE9(和兼容版本)似乎可以達到1、2或3倍。 注意:submit()導致回發。 情況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;
}

在此處輸入圖片說明

案例2:反應慢

刪除JS Alert:

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

在服務器端增加延遲:

if(IsPostBack)
{
    incrementVal();
    Thread.Sleep(500);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM