[英]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.