[英]How to save TabContainer to Viewstate?
我一直在努力地將TabContainer保存到一個viewstate變量中,該變量將加載該TabContainer的所有TabPanel。 (頁面加載速度會更快嗎?)。 如果問題的格式不正確,請原諒我。 我還是asp.net的新手,這是我的代碼:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
CreateTabbedPanel();
Response.Write("New Tabs Loaded");
}
else
{
// Here i would need to load the TabContainer from the viewstate variable
Response.Write("Tabs Loaded from ViewState");
}
}
private void CreateTabbedPanel()
{
TabPanel tp = null;
string CS = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
using (SqlConnection con = new SqlConnection(CS))
{
SqlCommand cmd = new SqlCommand("select Description from TblProductType", con);
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
tp = new TabPanel();
tp.HeaderText = rdr["Description"].ToString();
TabContainer1.Tabs.Add(tp);
}
}
// Here i would need to create the viewstate variable
}
這是我的網絡表單:
<form id="form1" runat="server">
<div>
<ajaxToolkit:TabContainer ID="TabContainer2" runat="server"
ActiveTabIndex="1" AutoPostBack="false">
</ajaxToolkit:TabContainer>
</div>
</form>
我需要做什么?
如果希望將.Net對象保存到ViewState,則需要確保該對象支持序列化/反序列化。 但是,這不太可能提高性能。
ViewState數據呈現到特定的隱藏字段中。 如果將復雜對象保存到ViewState中,則會大大增加HTML頁面大小。 接下來,序列化/反序列化也需要時間。
最后,由於ASP / NET頁面和控件的生命周期 ,您無法在ViewState中存儲ASP.NET控件。 當您創建控件並將其添加到頁面控件層次結構中時,它將經歷ASP.NET生命周期的所有階段:初始化,加載,渲染,[保存在ViewSate中],卸載。 下次當您從ViewState獲取控件時,控件狀態將為“渲染后”。 如果將此類控件添加到新的頁面控件層次結構中, 則處於“渲染后”狀態的控件將再次開始執行Init,Load和Render階段。 盡管它可以在原始控件(Labes,TextBoxes等)的情況下運行,但它完全破壞了控件的生命周期,並在復雜控件中引起了不同的奇怪問題。
如果您動態創建ASP.NET控件, 強烈建議您按照ASP.NET頁面生命周期的要求,在每個新頁面請求上重新創建它們 。
假設您只需要保存幾個選項卡名稱,則可以使用ViewState
。 否則,我建議使用Session
因為它允許在服務器端存儲復雜的對象而不必將它們發布到頁面中,它需要較少的代碼,但是您還需要處理過期的會話。
選項卡的集合是只讀的,不可序列化的等。但是,此代碼可用於將標頭保存在CreateTabbedPanel()
。
private void SaveTabs()
{
TabPanel[] tabs = new TabPanel[TabContainer1.Tabs.Count];
TabContainer1.Tabs.CopyTo(tabs, 0);
ViewState["tabs"] = tabs.Select(t=>t.HeaderText).ToArray();
}
如果頁面加載沒有回發:
private void LoadTabs()
{
string[] headers = (string[])ViewState["tabs"];
if(headers!=null)
{
foreach (string header in headers)
{
TabContainer1.Tabs.Add(new TabPanel() { HeaderText = header });
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.