用户文本框输入按默认值重写

时间:2015-06-21 17:28:05

标签: asp.net sql-server

请考虑以下.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事件中)将TitleDetails字段设置为已在记录中找到的值(因此用户不必从零输入,他已经输入了要编辑的那些。)

然而,调试会显示当我将这些回发到数据库(UPDATE查询时,看起来有点像UPDATE Table SET Title = @Title, Details = @Details WHERE ID=@ID,我检查了@ID - 这是完全有效。@Title对应于TitleTB.Text@DetailsDetailsTB.Text,两者都添加了SqlCommand.AddWithValue()DetailsTB.TextTitleTB.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.TextDetailsTB.Text是相同的,并不是更新查询不起作用。由于某种原因,即使我在浏览器上清楚地更改它们,文本框值也不会改变。

知道会发生什么事吗?

编辑:

有一点需要注意的是,当我使用OnClientClick事件来警告值时(然后返回true,它仅用于测试) - 值与我输入的值相同(不是默认值)

2 个答案:

答案 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