【问题标题】:Programmatically Assigning PagedControlID to DataPAger以编程方式将 PagedControlID 分配给 DataPAger
【发布时间】: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

这是当前的事件顺序。

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

  2. 当我单击“SUMMARY”页面中的链接时,控制权被转移(未重定向)到“DETAIL”页面,允许我通过 Page.PreviousPage 将“SUMMARY”页面的属性向前传递属性添加到“详细信息”页面。

  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 Example 不一致,他们在 OnLoad 事件中将其设置为低)?

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

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

谢谢, G

【问题讨论】:

    标签: asp.net viewstate page-lifecycle datapager


    【解决方案1】:

    根据堆栈跟踪,InvalidOperationExceptionLoadControlState 期间被抛出,这被称为 before 视图状态已加载。如果您没有以声明方式(在 .ascx 中)设置 PagedControlID,那么在页面生命周期的这一点上它仍然是一个空字符串。

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

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

    【讨论】:

    • 抱歉迟到了……我确实采纳了你的建议,虽然它对我来说并不完全有效,但它是正确的路径。我遇到的问题是 DataPager 控件是另一个 UserControl 的一部分,它以不允许我在正确的时间动态添加它的方式管理 Page LifeCycle。我将有机会重新编写此 UserControl 以听取您的建议。再次感谢!
    猜你喜欢
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多