簡體   English   中英

如何將TabContainer保存到Viewstate?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM