Sam*_*tte 5 asp.net data-binding datasource exception naming-containers
我一直在我的代码中得到这个例外,并想知道是否有人可以帮助我.
我有一个绑定到ObjectDataSource的Repeater控件,并且转发器的itemtemplate包含一个用户控件(ASCX).该用户控件又包含几个其他控件,主要是与ObjectDataSource关联的GridView.
在此设置中初始使用控件时,一切都很好 - 数据显示正常.但是,当我更改过滤器选项(转发器外部的下拉菜单),然后重新绑定Repeater时,我得到异常:
ObjectDataSource控件'expDataSource'没有命名容器.确保在调用DataBind之前将控件添加到页面中."在System.Web.UI.Web.控件,控件控件,字符串控件ID中的System.Web.UI.WebControls.DataBoundControlHelper.FindControl(控件控件,字符串控件ID)......"处于System.Web.UI.WebControls.ObjectDataSource. LoadCompleteEventHandler(Object sender,EventArgs e)
我不确定问题是什么 - 我在一些地方读过,将数据源移到ASCX控件之外可能会有所帮助 - 这没什么用.objectdatasource看起来结构合理,正如我所说,它是第一次(仅).
我在堆栈跟踪中注意到,当发生LoadComplete()之后ASP.NET正在调用FindControl()时发生这种情况.如果我单步执行代码,似乎所有代码都在执行之前完成执行,因此它是所有"系统"代码.
为什么ASP.NET无法在LoadComplete处理程序中找到此数据源控件?
谢谢!
其他说明:
每隔一次都会发生此错误.因此,第一次正确加载数据时,第二次刷新会因此错误而失败.再次单击"加载",它可以工作(第三次).
在它失败的时候,看起来在ASCX控件中调用了两次"Page_Load".所以模式是:
数据加载正常
这一切都发生在对"Repeater.DataBind()"的调用中,但它的行为会有所不同,具体取决于它是否已被绑定(显然).
更多说明:
真奇怪的行为.我从ObjectDataSource的底部删除了SelectParameters列表,突然之间,该页面没有拒绝ObjectDataSource,因为没有NamingContainer.当然,没有这些参数,数据绑定实际上不会起作用......我可以在代码中添加它们,但为什么它会重要?
找到了一个奇怪的解决方案,我将发布该解决方案,我们可以讨论以找出解决此问题的原因。
在我的页面上,我有以下结构(稍微解释一下标签):
页
下拉过滤器
中继器
用户控制X
对象数据源
ControlParameters 引用 DropDownFilter
结束对象数据源
最终用户控制 X
终端中继器
结束页
正如您所看到的,Repeater ItemTemplate 中是用户控件,而该控件又具有带有 ControlParameters 的“有罪”ObjectDataSource。这些控件参数具有引用的父页面上的 DropDownList 过滤器的名称(因此基本上,如果将此控件添加到任何其他页面,如果找不到具有正确名称的控件,它当然会失败)。
因此,当我检查并将所有 ControlParameters 更改为Parameters(删除对该 DropDownList 控件的引用)时,现在我不再收到错误。
我可以假设的是,该数据源引用父页面上的控件这一事实意味着它无法添加回 DataBind() 上的页面控件集。你可能会认为,如果它真的会失败的话,它第一次就会失败,所以这仍然是一个谜。
有什么想法吗?
归档时间: |
|
查看次数: |
10270 次 |
最近记录: |