0

所以我正在努力解决,我相信更多的是页面生命周期/视图状态问题。我有一个托管三个 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

这是当前的事件顺序。

  1. 我有一个“摘要”页面,它链接到显示 ListView(s) 的“详细信息”页面。

  2. 当我单击“SUMMARY”页面中的链接时,控制权被转移(未重定向)到“DETAIL”页面,允许我通过 Page.PreviousPage 属性将“SUMMARY”页面的属性转发给“DETAIL”页。

  3. 在目标“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;
        }
    }
    
  4. 这些“详细”页面属性只是读取和写入 ViewState,因此通过在 OnInitComplete 事件中为这些属性分配值,我希望这些值将在此页面上的未来回发之间保持不变。这些属性之一是我希望 DataPager 绑定到的 ListView 的 ID。

    public String ActiveListID
    {
        get { return (String)ViewState["ActiveListID"]; }
        set { ViewState["ActiveListID"] = value; }
    }
    
  5. 现在在 OnPreLoad 事件中,我将 DataPager 控件的 PagedControlID 属性设置为存储在 ViewState 属性中的 ListView 的 ID。

  6. 页面的初始加载没有问题。

  7. 当我尝试执行任何发回页面的操作时,就会出现问题。在 OnInitComplete 和 OnPreLoad 事件处理程序之间会引发“InvalidOperationException”错误。

查看错误,似乎没有正确设置 Pager 的 PagedControlID 属性。我不明白为什么。

  1. 寻呼机不应该记住之前设置的 PagedControlID 吗?不是存储在Pagers自己的ViewState中吗?

  2. 如果不是,那么为什么在 OnPreLoad 之前抛出错误,其中 ViewState 跟踪已打开(这与 Microsoft 的MSDN 示例不一致,他们在 OnLoad 事件中将其设置为向下)?

  3. 我试图在 PreLoad 事件之前在 OnInit 事件中设置 PagedControlID,但我遇到了一个问题,即我在最初加载页面时设置的 ID 不再存在于 ViewState 中,因此我得到了一个 NULL 值。我也不明白为什么没有将 ID保存到 ViewState。根据我引用的 MSDN 文档,在 OnInitComplete 事件中设置它应该包含在跟踪的 ViewState 值中。

如果有人对此有任何想法,我将不胜感激。

谢谢,G

4

1 回答 1

1

根据堆栈跟踪,在InvalidOperationException加载视图状态之前LoadControlState调用它。如果您没有以声明方式设置(在 .ascx 中),那么在页面生命周期的这一点上它仍然是一个空字符串。PagedControlID

MSDN 库示例在一个重要方面与您的代码不同:DataPager动态构造、初始化并添加到页面。LoadControlState在添加到页面之前不会调用DataPager,此时PagedControlID已经初始化。

ASP.NET 团队似乎并不真正打算支持PagedControlID动态设置的属性。我想您唯一可以尝试的是模拟 MSDN Library 示例并DataPager动态添加。

于 2013-01-12T04:59:43.880 回答