所以我正在努力解决,我相信更多的是页面生命周期/视图状态问题。我有一个托管三个 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(s) 的“详细信息”页面。
当我单击“SUMMARY”页面中的链接时,控制权被转移(未重定向)到“DETAIL”页面,允许我通过 Page.PreviousPage 属性将“SUMMARY”页面的属性转发给“DETAIL”页。
在目标“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 示例不一致,他们在 OnLoad 事件中将其设置为向下)?
我试图在 PreLoad 事件之前在 OnInit 事件中设置 PagedControlID,但我遇到了一个问题,即我在最初加载页面时设置的 ID 不再存在于 ViewState 中,因此我得到了一个 NULL 值。我也不明白为什么没有将 ID保存到 ViewState。根据我引用的 MSDN 文档,在 OnInitComplete 事件中设置它应该包含在跟踪的 ViewState 值中。
如果有人对此有任何想法,我将不胜感激。
谢谢,G