所以我正在努力,我相信,更多的是Page Lifecycle / ViewState问题。我有一个托管三个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
这是当前的事件序列。
我有一个“SUMMARY”页面,它链接到显示ListView的“Detail”页面。
当我点击“SUMMARY”页面中的链接时,控件被TRANSFERRED(未重定向)到“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;
}
}
这些“DETAIL”页面属性只是简单地读取和写入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”错误。
查看错误,看起来没有正确设置寻呼机的PagedControlID属性。我不明白的是为什么。
寻呼机不应该记得之前设置的PagedControlID吗?是不是存储在Pagers自己的ViewState中?
如果没有,那么为什么在OnPreLoad之前抛出一个错误,其中ViewState跟踪被打开(这与他们在OnLoad事件中设置的Microsoft MSDN Example不一致)?
我试图在OnInit事件中在PreLoad事件之前设置PagedControlID,但我遇到的问题是,我在ViewState中不再存在最初加载页面时设置的ID,因此我得到一个NULL值。我也不明白为什么ID 不被保存到ViewState。根据MSDN documentation I am referencing,在OnInitComplete事件中设置它应该将其包含在跟踪的ViewState值中。
如果有人对此有任何想法,我将非常感激。
谢谢, ģ
答案 0 :(得分:1)
基于堆栈跟踪,在InvalidOperationException
期间抛出LoadControlState
,在视图状态加载之前称为。如果没有以声明方式设置PagedControlID
(在.ascx中),那么在页面生命周期的这一点上它仍然是一个空字符串。
MSDN Library示例在一个重要方面与您的代码不同:DataPager
正在动态构造,初始化并添加到页面中。在LoadControlState
添加到页面之前,DataPager
不会被调用,此时PagedControlID
已初始化。
ASP.NET团队似乎并不打算支持动态设置的PagedControlID
属性。我想您唯一可以尝试的是模拟MSDN Library示例并动态添加DataPager
。