更新无法在网页中使用

时间:2014-05-14 20:19:51

标签: c# asp.net

有用户登录的网站。我导航到用户信息页面,通过根据用户名从db检索信息来显示信息。用户名是唯一的。我在文本框中显示所有信息,如下所示:

SqlCommand cmd = new SqlCommand(query,con);
SqlDataReader sdr = cmd.ExecuteReader();
sdr.Read();
txtFirstName.Text = sdr[0].ToString();
txtLastName.Text = sdr[1].ToString();
txtAge.Text = sdr[3].ToString();
txtUserName.Text = sdr[4].ToString();

然后允许用户修改相同文本框中的更改并允许他们更新。

string query = "UPDATE users SET FirstName=@firstName,LastName=@lastName,Age=@age,UserName=@userName WHERE UserName='"+userName+"'";

con.Open();
SqlCommand cmd = new SqlCommand(query, con);
cmd.Parameters.AddWithValue("@firstName", txtFirstName.Text);
cmd.Parameters.AddWithValue("@lastName", txtLastName.Text);
cmd.Parameters.AddWithValue("@age", txtAge.Text);
cmd.Parameters.AddWithValue("@userName", txtUserName.Text);
cmd.ExecuteNonQuery();

但是用户更改的值未发送到db。我以前做过类似的代码并且它已经有效了。但现在它无法更新。我哪里错了。

1 个答案:

答案 0 :(得分:2)

在评论中,您说这发生在Page_Load

期间
SqlCommand cmd = new SqlCommand(query,con);
SqlDataReader sdr = cmd.ExecuteReader();
sdr.Read();
txtFirstName.Text = sdr[0].ToString();
txtLastName.Text = sdr[1].ToString();
txtAge.Text = sdr[3].ToString();
txtUserName.Text = sdr[4].ToString();

每次页面对象实例化时,每次请求都会调用ASP.NET Page Lifecycle Page_Load。因此,即使您单击按钮而不是最初请求该页面,该按钮也会导致对服务器上该页面的请求,因此Page_Load在点击处理程序之前运行该请求上的按钮。

所以发生了什么:

  • 您请求页面
  • Page_Load将当前值插入控件
  • 您更改页面上的值
  • 您点击按钮
  • Page_Load将当前值插入控件
  • 使用控件中的值更新数据库

查看倒数第二行?调试时在Page_Load中包含断点。在保存之前,您已覆盖值。

您可以通过将检查中的初始化代码包装到IsPostBack

来解决此问题
if (!IsPostBack)
{
    SqlCommand cmd = new SqlCommand(query,con);
    SqlDataReader sdr = cmd.ExecuteReader();
    sdr.Read();
    txtFirstName.Text = sdr[0].ToString();
    txtLastName.Text = sdr[1].ToString();
    txtAge.Text = sdr[3].ToString();
    txtUserName.Text = sdr[4].ToString();
}