请考虑以下.aspx
页面:
Title:
<asp:TextBox runat="server" ID="TitleTB"></asp:TextBox>
Details:
<asp:TextBox runat="server" ID="DetailsTB"></asp:TextBox>
<asp:Button runat="server" ID="Btn" Text="Submit" OnClick="Btn_click"/>
请注意,我将代码最小化为合法,因此缺少许多行(例如,不相关的行,<br/>
)。
在C#文件中,我通常会将详细信息发布到数据库(插入它们),但是如果我的查询字符串(to_edit
本身)中有某个字段,我需要更新已经存在的字段,记录。
显然,这项任务总体上很简单。问题是,当包含该字段时,我最初(在Page_Load
事件中)将Title
和Details
字段设置为已在记录中找到的值(因此用户不必从零输入,他已经输入了要编辑的那些。)
然而,调试会显示当我将这些回发到数据库(UPDATE
查询时,看起来有点像UPDATE Table SET Title = @Title, Details = @Details WHERE ID=@ID
,我检查了@ID
- 这是完全有效。@Title
对应于TitleTB.Text
和@Details
对DetailsTB.Text
,两者都添加了SqlCommand.AddWithValue()
)DetailsTB.Text
和TitleTB.Text
是,由于某种原因,我在Page_Load
中分配了它们,尽管我在浏览器中删除了整个文本框内容并用不同的字符串重新填充。
以下是我的Code Behind的选择部分:
//A part of my Page_Load()
//reader is an SqlDataReader, the connection is valid, the values here are valid, and the output is as planned.
TitleTB.Text = (string)reader["Title"];
DetailsTB.Text = (string)reader["Details"];
到目前为止,一切似乎都很好。
//Relevant parts of Btn_click()
cmd.Connection = conn; //valid connection
cmd.CommandText = "UPDATE QuestionsTable SET Title = @Title, Details = @Details WHERE ID=@ID";
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@Title", TitleTB.Text);
cmd.Parameters.AddWithValue("@Details", DetailsTB.Text);
cmd.Parameters.AddWithValue("@ID", Request.QueryString["to_edit"]);
conn.Open();
int affected = cmd.ExecuteNonQuery(); //affected is now 1, as expected.
conn.Close();
//There's a redirection over here.
但是在上面显示的代码中,TitleTB.Text
和DetailsTB.Text
是相同的,并不是更新查询不起作用。由于某种原因,即使我在浏览器上清楚地更改它们,文本框值也不会改变。
知道会发生什么事吗?
编辑:
有一点需要注意的是,当我使用OnClientClick
事件来警告值时(然后返回true,它仅用于测试) - 值与我输入的值相同(不是默认值)
答案 0 :(得分:1)
此类行为的一个可能原因是您忘记检查Page_Load
是否由回复引起,并且您在get和post中都覆盖了文本中的两个值。
试着添加一个明显的条件:
//A part of my Page_Load()
//reader is an SqlDataReader, the connection is valid, the values here
if ( !this.IsPostback )
{
TitleTB.Text = (string)reader["Title"];
DetailsTB.Text = (string)reader["Details"];
}
请注意,控件值存储在viewstate中,因此无需在连续回发期间更新它们。
答案 1 :(得分:0)
将Page_Load事件代码包裹在If(!IsPostBack){ }
中。该按钮的回发属性使用默认值刷新页面。
代码应如下 -
If(!IsPostBack) {
//A part of my Page_Load()
//reader is an SqlDataReader, the connection is valid, the values here are valid, and the output is as planned.
TitleTB.Text = (string)reader["Title"];
DetailsTB.Text = (string)reader["Details"];
}
好的阅读可能会有所帮助 - http://www.codeproject.com/Articles/811684/Understanding-The-Complete-Story-of-Postback-in-AS