我正在维护ASP .Net应用程序,它似乎在某种程度上复制了记录,例如使用页面添加用户。我无法重现,但我发现一些代码可以做一些疯狂的事情,比如提交:
if(crazy-code()){
__doPostBack() // 2nd
}
和疯狂代码也做类似
的事情function crazy-code()
{
...
__doPostBack() // 1st
...
return true;
}
要找出这段代码导致问题,我一直试图解雇__doPostBack
,但我无法做到。
理论上,应该总是发生的事情是它触发(1st)__doPostBack
时,它应该发送请求并在之后停止/忽略任何客户端代码。
如果__doPostBack
被解雇两次,原因是什么?浏览器?速度? ???
答案 0 :(得分:0)
__ doPostBack()调用将提交表单,不应该调用第二个表单。
我可能错了,但如果您在网页上点击“提交”并且页面重新加载后点击“F5”,我认为您可以重现您的问题。根据浏览器的不同,它会询问“重新发送数据?”等内容。选择“是”并检查您的记录是否已重复。
在任何情况下,我认为您需要在服务器端插入数据时添加对重复值的检查。
答案 1 :(得分:0)
我能够创建一个测试代码。在FF和chrome似乎工作正常(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;
}
案例2:缓慢回应
删除JS警报:
function submitForm() {
document.forms[0].submit();
document.forms[0].submit();
}
在服务器端添加延迟:
if(IsPostBack)
{
incrementVal();
Thread.Sleep(500);
}