2010-03-04 65 views
1

可能是一個非常基本的初學者問題。恢復文本框(或任何其他控件)的舊值

想象一下以下情況:

我有一個ASP.NET頁面的文本框和一個按鈕。在我輸入的文本框中,假設名稱爲「Laurel」,然後單擊該按鈕。該文本框作爲控制參數與數據源相關聯,此數據源從文本框中提取內容「Laurel」以構建查詢,選擇客戶Laurel的所有訂單並將它們發送回瀏覽器,並在列表中顯示它們(例如gridview)。該列表很長,並且有兩頁(該列表具有尋呼機控制)。該列表位於文本框所在的同一頁面上。所以我現在在我的瀏覽器中看到一個帶有文本框(仍包含文本「Laurel」)的頁面和一個帶有尋呼機的列表。

我現在可以做兩個動作:

  • 在文本框中輸入名稱「哈」,並點擊按鈕:週期以上再次運行,並顯示顧客哈迪的訂單。這很好,我想要的。
  • 點擊尋呼機控制按鈕,顯示勞雷爾訂單的第二頁。這是有效的,因爲我仍然在文本框中有「Laurel」。因此,在由尋呼機控制觸發的回發中,數據源可以從文本框中再次提取「Laurel」作爲查詢參數,運行查詢並將第二頁訂單發送到我的瀏覽器。這也沒關係。

其實有可能是第三個動作:

  • 我在文本框中輸入名稱「哈」,然後改變了主意,決定我希望看到勞雷爾的順序的第二頁。所以我在文本框中有「哈代」,但不要點擊提交按鈕,而是點擊傳呼機控制的「下一頁」來查看第二頁。在服務器上,數據源提取文本框的「哈代」內容,運行查詢,然後嘗試傳遞哈代的第二頁,而不是勞雷爾的命令。所以這不是我想要的。 (也許哈迪只有幾個訂單,沒有足夠的兩頁,數據源可能會告訴我,然後「沒有發現」,因爲沒有什麼哈迪第二頁。)

(我的意思也可以在這裏可以看到在stackoverflow:在搜索框中輸入一些東西,例如「ASP.NET」,然後按回車鍵,你會得到一個很長的結果列表,並在搜索框中輸入另一個詞,例如「PHP 「但是不要回車,而是在頁面底部的頁面控制器中點擊第2頁,發佈回傳(我猜也會傳輸搜索框的新內容」PHP「),關鍵字」 ASP.NET「並且搜索框不再包含」PHP「,而是再次」ASP.NET「)。

現在的問題是:我怎樣才能避免這樣的情況?我的基本思想是:我需要恢復文本框中的舊值「Laurel」,以向數據源查詢提供正確的參數值,並且我的舊值「Laurel」必須存儲在「某處」(在服務器上?在服務器上?如果客戶端,隱藏在頁面或cookie中,或者...?)。是否有一些標準模式來處理這個要求?還是我在錯誤的方向思考?

預先感謝您!

回答

1

正如你在你的問題提了,你只需要保存當前的搜索詞的地方,只有在點擊搜索按鈕時更新。有很多選擇:

  • Session對象
  • ViewState的對象
  • 作爲URL中的查詢字符串
  • 在頁面上隱藏字段

大部分新手都會選擇會話對象,因爲它是最簡單的,但它也可能是不正確的,因爲會話跨頁面共享,並且您正在處理與單個頁面相關的數據。因此,從標準的角度來看,其他選擇之一會更好。

+0

感謝您的反饋!我只是看到,stackoverflow似乎使用QueryStrings來存儲搜索詞。我瞭解利用會話對象和隱藏字段的解決方案。但是,我不確定如何使用ViewState對象。直到現在,對於我來說,這始終是ASP.NET內部用於狀態管理的工具,沒有任何旨在以編程方式使用的工具。我必須閱讀更多關於ViewState的信息。成功使用會話對象需要在客戶端瀏覽器中接受Cookie,這是否正確? – Slauma 2010-03-04 14:49:58

+0

ViewState和Session訪問編碼相同 - 請參閱http://stackoverflow.com/questions/944484/syntax-to-access-variables-in-viewstate。通常,使用會話確實需要cookie,但您可以設置無Cookie會話,其中的ID作爲URL的一部分傳入。 (http://stackoverflow.com/questions/2273066/what-are-cookieless-sessions) – 2010-03-04 15:18:20

1

也許你可以嘗試存儲您的搜索字詞在ViewState中,當表單提交:

private void submitBtn_Click(object sender, EventArgs e) { 
    ... 
    ViewState["query"] = search.Text; 
    ... 
} 

然後檢查該ViewState的回發,並設置search.Text屬性:

private void Page_Load(object sender, EventArgs e) { 
    ... 
    if (!IsPostBack) { 
     ... 
    } else { 
     ... 
     if (ViewState["query"] != null) { 
      search.Text = ViewState["query"].ToString(); 
     } 
     ... 
    } 
    ... 
} 

(堆棧溢出是用ASP.NET MVC構建的,所以不需要處理回發:相反,它的搜索表單使用HTTP GET,這就是爲什麼你會在查詢字符串中看到搜索項。搜索輸入字段可能會重新填充如果搜索詞存在於查詢字符串和分頁鏈接中s可能會以類似的方式構建,因此爲什麼您可以更改輸入字段,而不是提交表單,但仍然查看原始查詢的第2,3頁等)。

+0

感謝您的回覆!我已經開始編寫與您的代碼示例非常相似的代碼,但是後來我擔心我的方式是否正確。但是,在我的代碼中,我使用'Session'而不是'ViewState'。 Jason Berkan在另一個答案中已經解釋說訪問ViewState和Session的編碼是相同的。但是,那又有什麼不同呢? ViewState比Session更有優勢嗎? – Slauma 2010-03-04 18:16:53

+0

上面的代碼實際上有一個頁面事件序列的問題:加載發生在Click之前,因此覆蓋在TextBox中輸入的文本,以及在實際點擊按鈕的情況下。我已經用一個私有變量解決了這個問題,將它設置爲Page_Load開頭的TextBox.Text,然後將它寫回到單擊事件處理程序開始處的TextBox.Text。 – Slauma 2010-03-08 19:08:00

+1

@Slauma ViewState在回傳期間持續保存數據,而Session持續用戶訪問網站的整個期間(除非它超出當然時間)。 – 2010-03-11 12:59:15

相關問題