【发布时间】:2012-07-06 20:07:47
【问题描述】:
我正在动态加载用户控件以在我的项目中的视图之间切换。我知道我需要在每次回发时重新加载我的用户控件。奇怪的是,即使控件消失了,我的控件视图状态仍然保持不变?我确认我加载它的面板是空的,然后我检查视图状态并且我的值在那里。
奇怪的是,如果我加载不同的控件,它可以看到前一个控件的视图状态?我检查了一下,我的页面无法从动态加载的控件中看到视图状态,反之亦然。这让我觉得用户控件被视为自己的页面。令人困惑的部分是为什么我加载的第二个视图可以看到第一个视图中的值以及为什么即使我的控件消失了这些值仍然存在?
我也发现这部分代码没用。为什么要取消控制?面板始终为空(代码来自 Telerik):
string controlId = LatestLoadedControlName.Split('.')[0];
Control previousControl = pnlControlPlaceholder.FindControl(controlId);
if (!Object.Equals(previousControl, null))
{
this.pnlControlPlaceholder.Controls.Remove(previousControl);
}
我查看了几篇帖子,大多数人说每次回发都会丢失视图状态,尽管对我来说不是这种情况。也许是因为我正在使用更新面板。尽管如果一个初始请求处理了一个事件,然后再次重新加载相同的控件,视图状态就会丢失。它似乎只保留下一次回发时的视图状态。
任何人都可以解释这种在用户控件之间共享视图状态的奇怪行为,或者为什么即使控件丢失,它仍然存在?
【问题讨论】:
-
“为什么即使失去了控件,它仍然存在?” 可能是因为另一个控件使用了与前一个控件相同的 ID。
-
设置ID的代码在哪里?
-
在将用户控件添加到面板之前: UserControl userControl = (UserControl)this.LoadControl(controlName); userControl.ID = userControlID.Replace("/", "").Replace("~", ""); ((IView)userControl).IsFirstLoad = bFirstLoad; this.pnlControlPlaceholder.Controls.Add(userControl);
-
这是几年前的一篇好文章,作者深入探讨了视图状态处理:ViewState and Dynamic Control。有点长,但 IMO 读起来不错。
-
@KingOfHypocrites userControlID 在哪里设置/定义?对于移除到控件的代码,逻辑是在尝试移除控件之前验证该控件是否存在于集合中。这是否必要取决于控件如何添加到面板中,但默认情况下,如果您动态创建控件,它们只会在您添加它们之后存在。对于有关视图状态行为的问题,如果您可以通过更详细的步骤以及查看视图状态中的值以及如何查看它们来扩展您的问题,这将有所帮助。