如何避免在回发时从 asp.net 重复输入?
Posted
技术标签:
【中文标题】如何避免在回发时从 asp.net 重复输入?【英文标题】:How to avoid duplicate entry from asp.net on Postback? 【发布时间】:2012-07-15 17:22:41 【问题描述】:我有一个从模板表中提取数据的下拉列表。我有一个添加按钮来插入新模板。添加按钮将弹出 jQuery 弹出窗口以插入新值。将有一个保存按钮来保存新数据。 On_Save_Click 我输入新数据并关闭弹出窗口。
问题如下: 当我刷新页面时,页面再次输入值。所以,我得到了重复的条目!
问题: 我怎样才能避免这个问题?我查看了 Satckoverflow 和 Google,他们都建议重定向到另一个页面。我不想将用户重定向到另一个页面。我怎样才能使用相同的表格来避免这个问题?请帮忙。
【问题讨论】:
【参考方案1】:这样做非常简单有效
在页面load()中不提供IsPostBack,请在按钮内提供点击(发送或插入数据)
重置所有输入值后再次调用同一页面
protected void Btn_Reg_Click1(object sender, EventArgs e)
try
if (IsPostBack)
Registration_Save();
Send_Mail();
txtEmail.Text = "";
txtname.Text = "";
Response.Redirect("~/index.aspx");
catch (Exception)
刷新页面后您将看不到任何服务器消息..
【讨论】:
无需清除控件的值,因为您重定向了用户(从而重新加载了初始状态的页面)【参考方案2】:有一些经验:
-
点击时禁用提交按钮(通过 javascript 在客户端)。
在服务器端保存操作时更改 Session['issaved'] = true 并将新操作更改为 false。
使用视图状态传递参数,如 RecordId(而不是 QueryString)以在刷新页面上清除。我总是将参数与会话传递给新页面,然后在页面加载设置
ViewState['aaa']=Session['aaa'] 并清除 Sessions。
...希望有用...
【讨论】:
【参考方案3】:您可以使用视图状态或会话来指示数据是否已插入(按下按钮)。
类似这样的:
private void OnbuttonAdd_click()
if(ViewState["DataInserted"] != "1")
...
// Add new entry...
...
if(data inserted successfully)
ViewState["DataInserted"] = "1";
编辑:
public bool DataInserted
get
if (HttpContext.Current.Session["DataInserted"] == null)
HttpContext.Current.Session["DataInserted"] = false;
bool? dataInserted = HttpContext.Current.Session["DataInserted"] as bool?;
return dataInserted.Value;
set
HttpContext.Current.Session["DataInserted"] = value;
...
private void OnbuttonAdd_click()
if(!DataInserted)
...
// Add new entry...
...
if(data inserted successfully)
DataInserted = true;
【讨论】:
嗨 Vano,我尝试了您的解决方案,但是当我刷新ViewState["DataInserted"]
等于 null
并且它再次通过该功能时,请告知。
这是否意味着我会为每次插入创建Session
?如果我想在其他插入中检查此会话怎么办?
不是每次插入。每个访问者的会话都是唯一的。如果你想拥有全局变量(我的意思是所有访问者的一个值),那么 Cache 是一种选择。
假设我在OnbuttonAdd_click()
这个方法中做了一个插入,现在是DataInserted = true
,好吧,如果我去其他页面做其他插入我应该怎么做?如果我检查了这个DataInserted
这将是真的并且插入永远不会这样做,否则我必须进行另一个会话,对吗??打扰了
在这种情况下我会使用 ViewState,因为 ViewState 作为隐藏字段保存在页面中。如果您刷新页面,当然 viewstate 值会丢失,这没关系,因为当您刷新页面时,您实际上是向服务器发送初始 GET 请求。【参考方案4】:
最简单的方法是使用post/redirect/get pattern。
基本上,使用 post 构建页面的刷新操作需要重新发布数据。使用此模式,您将重新加载整个页面。
使用 ASP.Net,您有一个简单的替代方法,使用 UpdatePanel
。这将使用 AJAX 仅刷新页面的一部分。由于页面本身仍然是 GET 请求的结果,因此您可以刷新页面。当您使用 ASP.Net 时,它很容易集成。
最后,您可以使用自制的 AJAX 刷新。结合使用 jQuery、KnockOut 和 rest 服务(例如),可以帮助您避免刷新整个页面,从而受益于 ajax 调用。
【讨论】:
以上是关于如何避免在回发时从 asp.net 重复输入?的主要内容,如果未能解决你的问题,请参考以下文章