2012-10-01 61 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); 
} 
相关问题