如何避免在Postback上重复输入asp.net?

时间:2012-07-16 19:47:21

标签: asp.net refresh postback

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

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

问题: 我该如何避免这个问题?我查看了Satckoverflow和Google,他们建议重定向到另一个页面。我不想将用户重定向到另一个页面。如何使用相同的表单来避免此问题?请帮忙。

4 个答案:

答案 0 :(得分:4)

您可以使用viewstate或session来指示数据是否已插入(按下按钮)。

这样的事情:

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;
      }
   }
}

答案 1 :(得分:3)

最简单的方法是使用post/redirect/get pattern

基本上,带有post的页面构建的刷新操作需要重新发布数据。使用此模式,您将重新加载整个页面。

使用ASP.Net,你有一个简单的选择,使用UpdatePanel。这将使用AJAX仅刷新页面的一部分。由于页面本身仍然是GET请求的结果,因此您可以刷新页面。当你使用ASP.Net时,它很容易集成。

最后,您可以使用自制的AJAX刷新。 jQuery,KnockOut和其他服务(例如)的组合可以帮助您避免在ajax调用的好处中刷新整个页面。

答案 2 :(得分:1)

这样做非常简单有效

在页面加载()中给出IsPostBack的Intead,请在按钮内单击提供(发送或插入数据)

重置所有输入值

后再次调用同一页面
 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) { }

    }

刷新页面后,您将看不到任何服务器消息..

答案 3 :(得分:1)

有一些经验:

  1. 点击时禁用“提交”按钮(在客户端通过JavaScript)。
  2. 在服务器端保存操作时更改Session ['issaved'] = true,并将新操作更改为false。
  3. 使用视图状态来传递参数,例如RecordId(而不是QueryString),以清除刷新页面。我总是将带有Session的参数传递给新页面,然后是页面加载设置 ViewState ['aaa'] =会话['aaa']并清除会话。
  4. ......我希望有用......