c# - Viewstate 变量在动态加载的用户控件上丢失

标签 c# asp.net user-controls

我对 ViewState 有疑问。我有一个 aspx 页面,左侧有一个 TreeView ,右侧有一个带有 ASP.NET 面板的 UpdatePanel。正是在那个内部面板中,我动态地加载和卸载用户控件。我使用该更新面板来动态加载控件。

我还为我的用户控件制作了一个自定义控件,因为我需要从页面传递一些值。在该构造函数上,我使用 ViewState 来存储这些值。

第一次加载用户控件时,我调用了带参数的构造函数。当我在每次回发时重新加载该用户控件时,我使用它的普通构造函数。

我的问题是我存储在 ViewState 上的值在连续回发时变为 null。

更新:

这是我的用户控件的一部分:

public class MyUserControl : System.Web.UI.UserControl
{
private int PKId
{
    get { return ViewState["pkId"] as int; }
    set { ViewState["pkId"] = value; }
}

public MyUserControl(int pkId)
{
    this.PKId = pkId;
}

...
}

我正在关注这篇动态加载控件的文章:http://msdn.microsoft.com/en-us/magazine/cc748662.aspx#id0070065 .

第二次更新:
我还在第一次加载用户控件和每次重新加载时设置了相同的控件 ID。

也许我可以使用另一种方法来存储这些值,例如输入隐藏字段或缓存。我选择了 ViewState,因为我不想让每个用户的 Session 值服务器过载。

第三次更新:

I load the controls with this code:

System.Web.UI.UserControl baseControl = LoadControl(ucUrl) as System.Web.UI.UserControl;
if (baseControl != null)
{
    baseControl.ID = "DestinationUserControl";
    PanelDestination.Controls.Add(baseControl);
}

并重新加载此代码:

DynamicControls.CreateDestination ud = this.LoadControl(TrackedUserControl) as DynamicControls.CreateDestination;
if (ud != null)
{
    ud.ID = "DestinationUserControl";
    PanelDestination.Controls.Add(ud);
}

这是怎么回事?

最佳答案

在将控件添加到控件层次结构之前,尝试将控件存储到局部变量中。这允许 ViewState 数据从控件映射到控件。请参阅此处的“规则 2”http://chiragrdarji.wordpress.com/2009/05/20/maintain-viewstate-for-dynamic-controls-across-the-postback/ .

关于c# - Viewstate 变量在动态加载的用户控件上丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2252857/

相关文章:

c# - 如何创建新的自定义View(UserControl)?阿瓦隆码头

asp.net - 从 ASP.NET MVC 应用程序使用 ASP.NET AJAX 客户端脚本调用 Web 服务?

asp.net - JavaScript 中 window.onback 的意外行为?

c# - 使用 C# 或第 3 方库发出传真?

c# - 存储过程返回多个记录集

asp.net - 多个 Html.dropdownlistfor 具有相同的选择列表,设置选定值

silverlight - 将 Silverlight UserControl 自定义属性绑定(bind)到其元素

.net - 如何在 Visual Studio 中为我的自定义控件设置要编辑的默认事件?

c# - MongoDb 更新同一数组中的多个特定嵌入式文档

c# - WPF Visual Studio 调试 - 控制台