动态创建的用户控件不能使用Viewstate

zkxp 2009-04-13 03:39:59
动态载入的ascx控件,在该控件里使用viewtate没用。不能记入也不能读出。

为了解决页面回传后动态创建的控件消失的问题。我在page_Load里面又有注册该控件。
以下是载入控件的页面的代码


protected void Page_Load(object sender, EventArgs e)
{

if (this.LatestLoadedControlName != "")
this.LoadUserControl(LatestLoadedControlName, Panel2);

}

protected string LatestLoadedControlName
{
get
{
return ViewState["LatestLoadedControlName"] == null ? "" : (string)ViewState["LatestLoadedControlName"];
}
set
{
ViewState["LatestLoadedControlName"] = value;
}
}
... ...
public void LoadUserControl(string controlName, Control container)
{
//先移出已有的控件
if (LatestLoadedControlName != null)
{
Control previousControl = container.FindControl(LatestLoadedControlName.Split('.')[0]);
if (previousControl != null)
{
container.Controls.Remove(previousControl);
}
}
string userControlID = controlName.Split('.')[0];
Control targetControl = container.FindControl(userControlID);
if (targetControl == null)
{
UserControl userControl = (UserControl)this.LoadControl(controlName);
userControl.ID = userControlID;
container.Controls.Add(userControl);
LatestLoadedControlName = controlName;
}
}

...全文
199 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
陌上花花 2009-04-13
  • 打赏
  • 举报
回复
学习过。谢谢诶
wuyq11 2009-04-13
  • 打赏
  • 举报
回复
BossFriday 2009-04-13
  • 打赏
  • 举报
回复
先看看我在微软里论坛提出的问题.
http://social.microsoft.com/Forums/zh-CN/295/thread/11db63ed-9336-4a6c-9181-2234444d16eb
里面给的解决方法,我嫌弃太麻烦也没有去尝试.

关键就是:我觉得问题应该出在运行时,控件生成先后顺序问题上。
于是我把动态生成控件的代码"提前"到:OnInit 里,问题解决了。

所以,个人更加感觉通常动态生成的控件不能保存住状态,就是因为:在运行时上,控件是在OnInit 之后才生成的,当然不会像一般server控件一样能保持ViewState了。不过搂主不明白我的意思,可以先了解一下asp.net模型控件/页面的整个生存周期。

至于:孟宪会的方法:重写LoadViewState和SaveViewState方法,或者自己使用ViewState进行控制
我觉得应该也是可以实现的,确实我也是测试过自定义ViewState控制方法的。比如说:把ViewState放到server硬盘上。通过牺牲server的IO来换取client更小的html下载量。
xingdongfang 2009-04-13
  • 打赏
  • 举报
回复
protected void Page_Load(object sender, EventArgs e)
{

if (this.LatestLoadedControlName != "")
this.LoadUserControl(LatestLoadedControlName, Panel2);

}

上面的代码错了.请在page_init事件中调用.
protected void Page_Init(object sender, EventArgs e)
{

this.LoadUserControl(LatestLoadedControlName, Panel2);

}
End 2009-04-13
  • 打赏
  • 举报
回复
关注下

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧