我已经为管理员创建了一个发送消息的表单,当我点击发送按钮时,一切都很好,数据被发送并保存到数据库中,我打印成功消息。但是,如果我刷新页面 - 按 F5 - 消息将再次发送到服务器和数据库!我该如何解决这个问题?
我只想在点击发送按钮时向服务器发送消息,而不是在刷新页面上。
我的代码是
<asp:Button ID="btnsenddata" runat="server" OnClientClick="return validate()" OnClick="btnsenddata_Click" Text="SendData" />
protected void btnsenddata_Click(object sender, EventArgs e)
{
//this place i connect to DB
}
答案 0 :(得分:0)
我会在按钮上放置一个OnClick
处理程序。因此,在您的.asp文件中<asp:Button id="btnMyButton" runat="server" OnClick="btnMyButton_Click"
然后在aspx.cs端添加方法'btnMyButton_Click'并将代码放在那里
btnMyButton_Click(object sender, EventArgs e)
{
//your code to update database goes here
}
答案 1 :(得分:0)
您可能需要在数据库中提出一些方法,以确保在一段时间内不会发送重复的消息。你不能轻易解决F5问题,因为所有这一切都告诉浏览器重复上次完成的内容。这意味着将相同的数据发送给用户。这就是诀窍,您输入的任何检查都必须将数据存储在服务器中,因为客户端只会重放上一个操作。
你可以保存一个会话变量,让你知道用户最后发送这个表单的时间(确保在检查会话变量时检查Session [&#34; sentform&#34;]!= null)
此外,您可以在数据库中创建一个简单的日志来说明用户点击了什么(如果您已登录用户),上次发送的时间以及可以识别哪个页面,消息请求者被触发的内容。然后,您可以询问数据库该用户是否在过去几分钟内发送了页面/进程X的消息并返回true或false。
答案 2 :(得分:0)
这是一个共同的问题。行为是设计的:信息 按下的按钮实际上被重新发送到服务器(以及所有 页面刷新时的其他控件信息。 我在网上冲浪时发现的一种很好的解决方法是(这种方式在服务器端)使用HashTable:
//Class member
HashTable ht = new HashTable();
btnMyButton_Click(object sender, EventArgs e)
{
ht =(Hashtable)Application["UserOKHashtable"]
if ((ht.ContainsKey(Session["UserSessionKey"]))
{
// double - clicked or user pressed refresh
return;
}
else
{
(ht.Add(Session["UserSessionKey"],UserName);
// your code here
// and finally
((Hashtable)Application["UserOKHashtable"])
.Remove(Session["UserSessionKey"]);
}
}
请记住最后从哈希表中删除用户的会话密钥 程序,否则用户只能点击 在整个会议期间按钮一次。
如果您搜索&#34;阻止双重帖子&#34;,您会找到更多信息和可能的解决方法。
希望它能帮助:)