我在ASP页面中有一个按钮,可以单击该按钮将一些数据保存到SQL服务器。它按照预期工作,只是在页面重新加载(做其他事情时)时,它会再次触发该按钮的提交。结果是数据库中的记录重复。我意识到我可能会验证副本,但我担心的是,如果按钮仍然触发对每次刷新的点击,那么它就会无缘无故地消耗资源。
每次刷新时,它都说:“要显示此页面,Firefox必须发送信息,这些信息将重复先前执行的任何操作(例如搜索或订单确认)。”
我已经搜索了其余的代码隐藏、HTML和javascript文件,寻找对button11的任何引用,但没有。我搞不懂为什么它一直在触发。
按钮的HTML:
<asp:Button ID="button11" runat="server" OnClick="Button11_Click" />代码背后:
protected void Button11_Click(object sender, EventArgs e)
{
var update = hfptstate.Value;
string fname = fnamebox.Text;
string lname = lnamebox.Text;
string sex = sexbox.Text;
string combname = fname + " " + lname;
string init = null;
string str = combname;
str.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries).ToList().ForEach(i => init += i[0]);
init += "_";
Random rnd = new Random();
int id = rnd.Next(1, 10000);
string initid = init + id;
string phone = phonebox.Text;
string color = colorbox.Text;
string age = agebox.Text;
string datetime = DateTime.Now.ToString("MMM dd yyyy h:mmtt");
SqlConnection con = new SqlConnection("Data Source=localhost\\SQLEXPRESS;AttachDbFilename=C:\\Users\\Public\\public website\\slDataBase.mdf;Integrated Security=True");
SqlCommand cmd = new SqlCommand();
if (statuslabel.InnerText == "Adding New Record")
{
cmd = new SqlCommand("INSERT into precordTable VALUES ('" + fname + "','" + lname + "','" + combname + "', '" + initid + "' , '' , '" + sex + "', '" + phone + "', '" + color + "', '" + age + "', '" + datetime + "', '','')", con);
}
else if (statuslabel.InnerText == "Editing Existing Record")
{
cmd = new SqlCommand("update precordTable set fname='" + fname + "', lname='" + lname + "', name='" + combname + "' , sex='" + sex + "', phone='" + phone + "', color='" + color + "', age='" + age + "' where initid='" + update + "';", con);
}
con.Open();
cmd.ExecuteNonQuery();
con.Close();
statuslabel.InnerText = "Adding New Record";
fnamebox.Text = "";
lnamebox.Text = "";
sexbox.Text = "";
phonebox.Text = "";
colorbox.Text = "";
agebox.Text = "";
}编辑:我也知道鲍比茶几。这与这个具体的实现无关。
编辑2:我忘记提到,仅仅单击刷新按钮就足以添加重复的记录,而且它甚至没有给表单提交警告(“要显示此页面,Firefox必须发送将重复先前执行的任何操作(例如搜索或订单确认)的信息”。
发布于 2017-04-10 04:06:16
这是默认浏览器行为。发送给服务器的最后一个请求是按钮的POST请求。刷新浏览器将重新执行最后一个请求,该请求将调用单击按钮事件。
下面的链接帮助您解决问题:
https://www.codeproject.com/Tips/319955/How-to-prevent-Re-Post-action-caused-by-pressing-b
发布于 2017-04-10 03:32:46
自从我开发了一个ASP.NET WebForms (您的代码是webforms,对吗?)项目,而且我不完全确定关于您的情况的任何信息都不会对尝试理解可能出现的错误产生影响,但我似乎还记得一些关于页面生命周期的敏感信息,即设置为会话变量数据的数据不会重置为默认值,或者在页面生命周期的后期,当数据被持久化时,会被稍后的代码事件方法重置。您应该能够通过调试这些不同事件中的代码来检查这一点。如果不是这个问题,那么它可能是关于页面生命周期的其他一些吸引人的东西,而不是讨论您可能期望它发生的方式。
一个很好的参考来源是:https://msdn.microsoft.com/en-us/library/ms178472.aspx,我认为这个页面从WebForms早期就有了很大的改进。HTH
https://stackoverflow.com/questions/43314249
复制相似问题