如何避免在回发时从 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 重复输入?的主要内容,如果未能解决你的问题,请参考以下文章

asp .net背景图像在回发时闪烁

如何在回发 ASP.Net Core 后保持选项卡处于活动状态

列表框在回发时重复(重复)

在回发时,如何向验证摘要添加错误消息?

jQuery填充的Gridview在回发时丢失数据

防止在回发时重新加载 iframe