2012-03-12 117 views
3

假設點擊一個asp:button後,我想存儲實際的「視圖」,每個控制器的選定值(如asp:checkbox)或用戶在inputbox上插入的輸入。我可以保存回髮狀態並將其恢復嗎?

比我改變頁面,帶有諸如「回到上一頁」的鏈接。在離開之前,我想這樣「恢復」舊的實際形式。

.NET可以嗎?或者我需要在變量中實現所有控件並將它們放入會話中?

+0

這是ASP.NET還是ASP.NET MVC? – 2012-03-12 14:27:19

+0

ASP.NET 3.5,而不是MVC – markzzz 2012-03-12 14:30:13

+2

http://msdn.microsoft.com/en-us/library/6c3yckfw%28v=vs.90%29.aspx – 2012-03-12 14:33:46

回答

1

你不需要會話來做到這一點。只需使用JavaScript。

考慮你有兩頁Page1.aspx和Page2.aspx。 您在Page1.aspx上有文本框,複選框和單選按鈕,並且您有一個「提交」按鈕。通過點擊按鈕它需要Page2.aspx。

只需在Page2.aspx上有一個「返回上一頁」按鈕,點擊該按鈕即可將您帶到Page1.aspx,所有這些值仍然存在。要做到這一點,添加此行對你Page2.aspx Page_Load事件

protected void Page_Load(object sender, EventArgs e) 
{ 
btnBackButton.Attributes.Add("onClick", "javascript:window.history.go(-1);return false;"); 
} 
+0

Wooowww ...非常漂亮的技巧:)我也應該把(-2)和管理得很好!謝謝!附:你知道這個不起作用的瀏覽器嗎?也許是因爲歷史不支持,或因爲回頭它不存儲舊數據......只是好奇... – markzzz 2012-03-13 08:14:55

+0

很高興它幫助你。它幾乎適用於所有瀏覽器(在safari中進行測試,並在ya中進行征服);),當Javascript被禁用時,這不起作用。 – 2012-03-13 14:51:12

3

有幾種方法,你可以堅持怎樣或ASP.NET頁面之間傳遞值。

看一看here瞭解更多信息。

因爲你已經提到你有「噸」的控制存儲和恢復,我試圖找到一種方法來自動化這個過程。

這是我的方法,它使用會話作爲存儲來堅持IPostBackDataHandler類型的所有控件的值。沒有真正的測試,但希望無論如何有幫助。

using System; 
using System.Collections.Generic; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

public class FormStorage 
{ 
    private System.Web.UI.Page _page = null; 

    public Dictionary<String, Dictionary<String, String>> storage 
    { 
     get { return (Dictionary<String, Dictionary<String, String>>)_page.Session["FormStorage"]; } 
     set { _page.Session["FormStorage"] = value; } 
    } 

    public FormStorage(System.Web.UI.Page page) 
    { 
     _page = page; 
     initHandler(); 
     if (this.storage == null) 
     { 
      this.storage = new Dictionary<String, Dictionary<String, String>>(); 
     } 
     if(!this.storage.ContainsKey(_page.Request.Path)) 
      this.storage.Add(_page.Request.Path, new Dictionary<String, String>()); 
    } 

    private void initHandler() 
    { 
     _page.Init += Init; 
     _page.Load += Load; 
    } 

    private void Init(Object sender, EventArgs e) 
    { 
     loadForm(); 
    } 

    private void Load(Object sender, EventArgs e) 
    { 
     saveForm(); 
    } 

    private void loadForm() 
    { 
     var pageStorage = storage[_page.Request.Path]; 
     var e = pageStorage.GetEnumerator(); 
     while (e.MoveNext()) 
     { 
      loadControl(e.Current.Key, e.Current.Value); 
     } 
    } 

    private void loadControl(String ID, String value) 
    { 
     Control control = findControlRecursively(_page, ID); 
     if (control != null) 
     { 
      setControlValue(control, value); 
     } 
    } 

    private void setControlValue(Control control, String value) 
    { 
     if (control is ITextControl) 
     { 
      ITextControl txt = (ITextControl)control; 
      txt.Text = value == null ? "" : value; 
     } 
     else if (control is ICheckBoxControl) 
     { 
      ICheckBoxControl chk = (ICheckBoxControl)control; 
      chk.Checked = value != null; 
     } 
     else if (control is ListControl) 
     { 
      ListControl ddl = (ListControl)control; 
      if (value == null) 
       ddl.SelectedIndex = -1; 
      else 
       ddl.SelectedValue = value; 
     } 
    } 

    public void saveForm() 
    { 
     saveControlRecursively(this._page); 
    } 

    private void saveControlRecursively(Control rootControl) 
    { 
     if (rootControl is IPostBackDataHandler) 
     { 
      var postBackData = _page.Request.Form[rootControl.ID]; 
      storage[_page.Request.Path][rootControl.ID] = postBackData; 
     } 

     if (rootControl.HasControls()) 
      foreach (Control subControl in rootControl.Controls) 
       saveControlRecursively(subControl); 
    } 

    private static Control findControlRecursively(Control rootControl, String idToFind) 
    { 
     if (rootControl.ID == idToFind) 
      return rootControl; 

     foreach (Control subControl in rootControl.Controls) 
     { 
      Control controlToReturn = findControlRecursively(subControl, idToFind); 
      if (controlToReturn != null) 
      { 
       return controlToReturn; 
      } 
     } 
     return null; 
    } 
} 

下面是一個重定向到其他網頁的網頁發明實施例一實現:

private FormStorage storage; 

protected void Page_PreInit(object sender, EventArgs e) 
{ 
    storage = new FormStorage(this); 
} 

protected void BtnRedirect_Click(object sender, EventArgs e) 
{ 
    Response.Redirect("RedirectForm.aspx"); 
} 

需要注意的是IT負載和Page_Load/Page_PreRender隱含撲救。因此,必須在Page_PreInit中創建FormStorage實例。

如果你想Page_Load後改變值編程,你需要手動調用storage.saveForm()(例如Page_PreRender),以確保這些值將被覆蓋,因爲FormStorage會自動保存在Page_Load所有回傳數據。

編輯:sh4nx0r的history.go方法可能更好,因爲它更具可擴展性。我的方法使用會話,並不適合擁有大量(可能)用戶的互聯網應用程序。

我的一個(小)優勢是,它即使在禁用javascript時也能正常工作。一個更大的優勢是您可以控制要重定向的頁面。您甚至可以跨多個重定向恢復值。

+0

謝謝,也許我會在用戶訪問其他頁面後使用它來恢復頁面(請參閱http://stackoverflow.com/questions/10600566/is-it-possible-to-save-and-restore-a-complete -aspx頁)。它似乎在一個小測試網站上工作正常。我只是在加載中刪除了'SaveForm',因爲它不保存恢復的頁面。當我自己需要時(搜索之後),我只會保存頁面。謝謝! – 2012-05-22 10:22:36

相關問題