【发布时间】:2013-01-12 01:10:46
【问题描述】:
所以我正在努力解决,我相信更多的是页面生命周期/视图状态问题。我有一个托管三个 ListView 控件的页面。任何时候都只能看到一个。我想使用单个 DataPager,以编程方式将 DataPager 的 PagedControlID 分配给可见 ListView 的 ID。可能需要指出 DataPager 包含在用户定义的用户控件 (ASCX) 中,它主要只是传递给 DataPager。
这个错误看起来很简单......
[InvalidOperationException: No IPageableItemContainer was found. Verify that either the DataPager is inside an IPageableItemContainer or PagedControlID is set to the control ID of an IPageableItemContainer.]
System.Web.UI.WebControls.DataPager.LoadControlState(Object savedState) +628838
System.Web.UI.Control.LoadControlStateInternal(Object savedStateObj) +137
System.Web.UI.Page.LoadAllState() +342
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2533
这是当前的事件顺序。
我有一个“摘要”页面,该页面链接到显示 ListView 的“详细信息”页面。
当我单击“SUMMARY”页面中的链接时,控制权被转移(未重定向)到“DETAIL”页面,允许我通过 Page.PreviousPage 将“SUMMARY”页面的属性向前传递属性添加到“详细信息”页面。
-
在目标“DETAIL”页面的 OnInitComplete 事件中,我将“PreviousPage”中的属性值分配给新“DETAIL”页面中的属性。
protected override void OnInitComplete(EventArgs e) { IExceptionPage previousPage = (PreviousPage != null) ? ((IExceptionPage)PreviousPage) : null; if (previousPage != null) { this.ActiveListID = previousPage.ActiveListID; this.ActionType = previousPage.ActionType; this.CategoryTheme = previousPage.CategoryTheme; this.ExceptionCode = previousPage.ExceptionCode; } } -
这些“详细”页面属性只是读取和写入 ViewState,因此通过在 OnInitComplete 事件中为这些属性分配值,我希望这些值将在此页面上的未来回发之间保持不变。这些属性之一是我希望 DataPager 绑定到的 ListView 的 ID。
public String ActiveListID { get { return (String)ViewState["ActiveListID"]; } set { ViewState["ActiveListID"] = value; } } 现在在 OnPreLoad 事件中,我将 DataPager 控件的 PagedControlID 属性设置为存储在 ViewState 属性中的 ListView 的 ID。
页面的初始加载没有问题。
当我尝试执行任何发回页面的操作时,就会出现问题。在 OnInitComplete 和 OnPreLoad 事件处理程序之间会引发“InvalidOperationException”错误。
查看错误,似乎没有正确设置 Pager 的 PagedControlID 属性。我不明白为什么。
寻呼机不应该记住之前设置的 PagedControlID 吗?不是存储在Pagers自己的ViewState中吗?
如果不是,那为什么在 OnPreLoad 之前抛出错误,其中 ViewState 跟踪已打开(这与 Microsoft 的 MSDN Example 不一致,他们在 OnLoad 事件中将其设置为低)?
我试图在 OnInit 事件中的 PreLoad 事件之前设置 PagedControlID,但我遇到了问题,即我在最初加载页面时设置的 ID 不再存在于 ViewState 中,因此我返回一个 NULL 值。我也不明白为什么 ID 不 被保存到 ViewState。根据 MSDN documentation I am referencing,在 OnInitComplete 事件中设置它应该包含在跟踪的 ViewState 值中。
如果有人对此有任何想法,我将不胜感激。
谢谢, G
【问题讨论】:
标签: asp.net viewstate page-lifecycle datapager