【问题标题】:ASP.NET Avoid adding new data on page refreshASP.NET 避免在页面刷新时添加新数据
【发布时间】:2012-04-04 00:20:39
【问题描述】:

我有一个数据网格,其中填充了来自 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();
    }
}

【问题讨论】:

    标签: asp.net .net sql database datagrid


    【解决方案1】:

    为此,您需要使用旧版本检查 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;
        }
    

    谢谢

    【讨论】:

      【解决方案2】:

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

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

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

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

      希望对您有所帮助...

      【讨论】:

      • 如何在不检查数据库中所有记录的情况下检查存在?我在 sql 查询中尝试了 IF NOT EXISTS 行,但没有成功。另外,我将如何创建 BindGrid() 方法并将其绑定到我的数据网格?
      • @Mynter:我将如何创建 BindGrid() 方法? - 来自 Kaf 的回答,“从 Page_Init 方法中删除数据绑定代码并创建一个具有相同代码的新方法”,名为“BindGrid()”。
      • 如何创建: private void BindGrid(){ //Cut and paste all the code from Page_Init() method }你已经在上面的代码中绑定了网格。您可以使用IF NOT EXIST bit 发布您的查询吗?
      • 感谢您的回复,但我通过在不同页面上添加联系表单解决了这个问题,这也更有意义。
      猜你喜欢
      • 1970-01-01
      • 2020-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-17
      • 1970-01-01
      • 2023-03-03
      • 2023-03-13
      相关资源
      最近更新 更多