ASP.NET避免在页面刷新时添加新数据

时间:2012-03-19 13:52:31

标签: asp.net .net sql database datagrid

我有一个数据网格,我已经填充了sql数据库中的数据。我还添加了一个功能,可以将新联系人添加到数据库,该功能运行良好。我遇到的问题是,在添加联系人并点击F5(刷新网页)后,它会向数据库添加另一个相同的联系人。

我在回发后清除了文本字段,但不知何故,字符串留在内存中,每次刷新网页时都会添加另一个联系人。

我也有点击按钮后数据网格没有立即更新的问题,这就是为什么我必须首先更新页面。我相信这两个问题可能是相关的。

这是我的代码背后,我不认为aspx页面是必要的,但我可以在需要时给它。

public partial class Default : System.Web.UI.Page
{
    SqlConnection connection = new SqlConnection("server = Sqlconnection; uid = username; pwd = password; database = database;");

    protected void Page_Init(object sender, EventArgs e)
    {
        //------------------------------------------------DataGrid--------------------------------------------------
        SqlDataAdapter SqlCommandDG = new SqlDataAdapter("SELECT FirstName, LastName, Email, PhoneNumber, CompanyName FROM ContactPerson CP, Company C WHERE CP.[CompanyID] = C.[Company_ID]", connection);

        DataSet ds = new DataSet();
        SqlCommandDG.Fill(ds);

        DataView source = new DataView(ds.Tables[0]);
        DataGrid1.DataSource = source;
        DataGrid1.DataBind();

        //----------------------------------------------Dropdown list------------------------------------------------
        SqlCommand SqlCommandDD = new SqlCommand("SELECT * FROM Company");
        SqlCommandDD.Connection = connection;
        connection.Open();

        DropDownList1.DataSource = SqlCommandDD.ExecuteReader();
        DropDownList1.DataValueField = "Company_ID";
        DropDownList1.DataTextField = "CompanyName";
        DropDownList1.DataBind();

        connection.Close();
    }

    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        connection.Open();

        string fName = fNameTextBox.Text;
        string lName = lNameTextBox.Text;
        string email = EmailTextBox.Text;
        string phoneNr = phoneNrTextBox.Text;
        string company = DropDownList1.SelectedValue;

        string sqlquery = ("INSERT INTO ContactPerson (FirstName, LastName, Email, PhoneNumber, CompanyID) VALUES ('" + fNameTextBox.Text + "','" + lNameTextBox.Text + "','" + EmailTextBox.Text + "','" + phoneNrTextBox.Text + "','" + DropDownList1.SelectedValue + "')");
        SqlCommand command = new SqlCommand(sqlquery, connection);

        command.Parameters.AddWithValue("FirstName", fName);
        command.Parameters.AddWithValue("LastName", lName);
        command.Parameters.AddWithValue("Email", email);
        command.Parameters.AddWithValue("PhoneNumber", phoneNr);
        command.Parameters.AddWithValue("CompanyID", company);
        command.ExecuteNonQuery();

        fNameTextBox.Text = string.Empty;
        lNameTextBox.Text = string.Empty;
        EmailTextBox.Text = string.Empty;
        phoneNrTextBox.Text = string.Empty;

        connection.Close();
    }
}

2 个答案:

答案 0 :(得分:3)

如果按F5,它将重复您的最后一个请求,即在这种情况下向db添加记录。在插入记录之前,您必须检查数据库是否存在记录,以避免这种情况。

其次,如果需要使用上次输入的值更新数据网格,则需要在输入记录后重新绑定数据网格。从Page_Init方法中删除数据绑定代码,并使用相同的代码创建一个新方法,如 BindGrid(),并执行以下操作

protected void Page_Load(object sender, EventArgs e)
{
   if(!Page.IsPostBack){
     BindGrid();
   }
}

另外,添加BindGrid();作为Button1_Click()方法的最后一行(即;输入记录后)

希望有帮助...

答案 1 :(得分:2)

为此您需要检查ViewState与较旧的.. 有一个例子我想出并解决了这个问题。现在,回发后(页面刷新时)不会插入新数据。

protected void Page_Load(object sender, EventArgs e)
{

   if(!Page.IsPostBack && !IsRefresh){
     BindGrid();
   }
}
 private bool _isRefresh;

    public bool IsRefresh
    {
        get { return _isRefresh; }
    }

    protected override void LoadViewState(object savedState)
    {
        object[] allStates = (object[])savedState;
        base.LoadViewState(allStates[0]);
        _refreshState = Convert.ToBoolean(allStates[1]);
        _isRefresh = _refreshState == Convert.ToBoolean(Session["__ISREFRESH"]);
    }

    protected override object SaveViewState()
    {
        Session["__ISREFRESH"] = _refreshState;
        object[] allStates = new object[2];
        allStates[0] = base.SaveViewState();
        allStates[1] = !_refreshState;
        return allStates;
    }

由于