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