【问题标题】:How to avoid duplicate entry from asp.net on Postback?如何避免在回发时从 asp.net 重复输入?
【发布时间】:2012-07-15 17:22:41
【问题描述】:

我有一个从模板表中提取数据的下拉列表。我有一个添加按钮来插入新模板。添加按钮将弹出 jQuery 弹出窗口以插入新值。将有一个保存按钮来保存新数据。 On_Save_Click 我输入新数据并关闭弹出窗口。

问题如下: 当我刷新页面时,页面再次输入值。所以,我得到了重复的条目!

问题: 我怎样才能避免这个问题?我查看了 Satckoverflow 和 Google,他们都建议重定向到另一个页面。我不想将用户重定向到另一个页面。我怎样才能使用相同的表格来避免这个问题?请帮忙。

【问题讨论】:

    标签: asp.net refresh postback


    【解决方案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】:

    有一些经验:

    1. 点击时禁用提交按钮(通过 JavaScript 在客户端)。
    2. 在服务器端保存操作时更改 Session['issaved'] = true 并将新操作更改为 false。
    3. 使用视图状态传递参数,如 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 调用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-27
        • 1970-01-01
        • 1970-01-01
        • 2013-10-03
        • 1970-01-01
        • 2015-04-25
        • 2017-04-26
        • 2013-09-05
        相关资源
        最近更新 更多