2012-11-28 61 views
2

我正在嘗試開發一個頁面。有一個按鈕和一個placeholeder的 。 點擊按鈕時,用戶控件被添加到佔位符中。ASP.NET:如何在viewstate中存儲佔位符?

每次點擊按鈕時,應將多個用戶控件添加到佔位符。

我想存儲佔位符在預覽事件的視圖狀態,但從視圖狀態檢索佔位符在加載事件viewstate保持爲空。

下面

是我的代碼:

protected void PreInit(object sender, EventArgs e) 
     { 
      this.OnPreInit(e); 
      if (!Page.IsPostBack) 
      { 
       ViewState["c"] = PlaceHolder1; 

      } 
      else { PlaceHolder1 = (PlaceHolder)ViewState["c"]; } 
     } 

protected void Page_Load(object sender, EventArgs e) 
     { 

      if(IsPostBack) 
     { PlaceHolder1= (PlaceHolder)ViewState["c"]; } 

     } 


public void addDepartmentBtn_Click(object sender, EventArgs e) 
     { 
      // User Control Code 


      c1 = LoadControl("~/AddDepartment.ascx"); 
      PlaceHolder1.Controls.Add(c1); 
} 

如果視圖狀態不適合在這個scenarion那麼什麼是另一種方式來實現這一目標?

+0

通過存儲在ViewState中,您是指佔位符內的控件? –

+0

PlaceHolder1控件是否存在於標記中? – Igor

+0

@ System Down:在第一個按鈕上單擊我的用戶控件位於佔位符內。現在我想要在視圖中存儲佔位符。在隨後的下一個按鈕單擊佔位符sholud從視圖狀態獲取檢索新的用戶控件添加到佔位符。 – Raj

回答

1

這是行不通的。 ASP.NET服務器控件太複雜,無法存儲在ViewState中。 ASP.NET設計通過哪些服務器控件將其數據(狀態,屬性值等)存儲在Page的ViewState中。

您可以做的是在ViewState中存儲已創建並添加到佔位符的AddDepartment用戶控件的數量。這可以在PreRender中完成。然後在回發中,您從ViewState中讀取這個數字,並創建並添加許多AddDepartment控件的佔位符。

2

如果您試圖動態地將控件添加到頁面,則必須在每次回發的Init 中完成此操作。這意味着你必須使用一個數據結構(ViewState中將保留的東西)作爲動態創建控件的列表 - 而不是控件本身,但是用作ID的字符串散列是一種常用方法。

每次用戶執行某些操作將控件添加到頁面時,都會在列表中添加一個鍵。在Page Init中,您必須閱讀列表並使用它重新創建動態控件並將其添加回頁面集合,否則它們將不會顯示在頁面上。

2

您必須在每個帖子後面重新添加控件到您的佔位符。

您對ViewState的嘗試正在吠叫錯誤的樹--ViewState適用於完全不同的東西,即使您想要,也只能將可序列化的東西存儲到ViewState中。