0

我正在维护一个似乎以某种方式重复记录的 ASP .Net 应用程序,例如使用页面添加用户。我无法重现,但我发现一些代码在提交时会做一些疯狂的事情:

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

和疯狂代码也做类似的事情

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

为了找出导致问题的这段代码,我一直在尝试触发这两个,__doPostBack但我无法做到。理论上,应该总是发生的是当它触发 (1st)__doPostBack时,它应该发送请求并在之后停止/忽略任何客户端代码。如果__doPostBack被解雇两次,会是什么原因?浏览器?速度????

4

2 回答 2

0

我能够创建一个测试代码。在 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 警报:

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

在服务器端添加延迟:

if(IsPostBack)
{
    incrementVal();
    Thread.Sleep(500);
}
于 2012-10-01T21:27:50.293 回答
0

__doPostBack()调用将提交表单,它不应该调用第二个。

我可能是错的,但我认为如果您在网页上点击“提交”并在页面重新加载后点击“F5”,您可以重现您的问题。根据浏览器的不同,它会询问“重新发送来自数据?”之类的问题。选择“是”并检查您的记录是否重复。

无论如何,我认为您需要在服务器端插入数据时添加对重复值的检查。

于 2012-10-01T17:35:54.240 回答