有用户登录的网站。我导航到用户信息页面,通过根据用户名从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。我以前做过类似的代码并且它已经有效了。但现在它无法更新。我哪里错了。
答案 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();
}