2015-06-21 75 views
2

改寫考慮以下.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 [email protected],在那裏我檢查@ID - 這是完全有效@Title對應TitleTB.Text@DetailsDetailsTB.Text ,兩者都加上了SqlCommand.AddWithValue())由於某種原因,DetailsTB.TextTitleTB.Text與我在Page_Load中指定的相同,儘管我在瀏覽器中刪除了整個文本框內容並用不同的字符串重新填充。我的代碼背後的下面是選擇

部分:

//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 [email protected]"; 
     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,這只是一個測試) - 該值是相同的,以我所輸入的(不給默認值)。

+0

你有沒有在你的'Page_Load'事件處理'PostBack'? –

+0

您可以從數據庫表中檢查哪個值正在更新?默認的一個還是您正在輸入的? –

+0

@ChandanRoy我沒有處理'回發'。數據庫表更新爲默認值(與未更新的相同),但會更新。 – Zack

回答

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

+0

非常感謝!非常感激。 – Zack

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"]; 
} 

注意控制值存儲在視圖狀態,因此沒有必要在連續後背上更新它們。

+0

你的回答是目前最有建設性和最有幫助的,我只是因爲他早些時候評論過而評價過其他問題。 – Zack

+0

沒問題,我沒有在問題的下面看過評論,但事實上,似乎正確的評論早於我的迴應。 –