ASP.NET数据源控件 "does not have a naming container"异常

标签 asp.net data-binding datasource exception naming-containers

我在代码中遇到了这个异常,想知道是否有人可以帮助我。

我有一个绑定(bind)到 ObjectDataSource 的转发器控件,并且转发器的项目模板包含一个用户控件 (ASCX)。该用户控件又包含几个其他控件,主要是与 ObjectDataSource 关联的 GridView。

初次使用此设置中的控件时,一切正常 - 数据显示正确。但是,当我更改过滤器选项(中继器外部的下拉菜单),然后重新绑定(bind)中继器时,出现异常:

ObjectDataSource 控件“expDataSource”没有命名容器。确保在调用 DataBind 之前将该控件添加到页面。” 在System.Web.UI.WebControls.DataBoundControlHelper.FindControl(控制控件,字符串controlID) ... ... 在System.Web.UI.WebControls.ObjectDataSource.LoadCompleteEventHandler(对象发送者,EventArgs e)

我不确定问题是什么 - 我在一些地方读到将数据源移到 ASCX 控件之外可能会有所帮助 - 这没有任何作用。 objectdatasource 似乎结构正确,正如我所说,它(仅)第一次工作。

我在堆栈跟踪中注意到,当 ASP.NET 在 LoadComplete() 发生后调用 FindControl() 时,会发生这种情况。如果我单步执行我的代码,看起来好像我的所有代码都在这种情况发生之前完成了执行,所以它都是“系统”代码。

为什么 ASP.NET 在 LoadComplete 处理程序中找不到此数据源控件?

谢谢!

其他注意事项:

  • 此错误每隔一段时间就会发生一次。因此,第一次数据加载正确,然后第二次刷新失败并出现此错误。再次点击“加载”,就可以了(第三次)。

  • 当它失败时,看起来“Page_Load”在 ASCX 控件中被调用了两次。所以模式是:

    1. 工作模式:
  • Page_Load 在父页面上
  • ASCX 上的页面加载
  • 数据加载良好

  • 失败模式:
  • Page_Load 在父页面上
  • ASCX 上的页面加载
  • ASCX 上的页面加载
  • 异常

这一切都是通过调用“Repeater.DataBind()”而发生的,但它的行为有所不同,具体取决于它是否已经绑定(bind)(显然)。

更多注释:

真正奇怪的行为。我从 ObjectDataSource 底部删除了 SelectParameters 列表,突然之间,页面不会因为没有 NamingContainer 而拒绝 ObjectDataSource。当然,如果没有这些参数,数据绑定(bind)实际上将无法工作...我可以将它们添加到代码中,但这有什么关系呢?

最佳答案

发现了一个奇怪的解决方案,我将发布该解决方案,我们可以讨论以找出解决此问题的原因。

在我的页面上,我有以下结构(稍微解释一下标签):

页面

下拉过滤器

复读机

用户控件X

对象数据源

引用 DropDownFilter 的 ControlParameters

结束对象数据源

最终用户控件 X

结束中继器

结束页

正如您所看到的,Repeater ItemTemplate 中是用户控件,而该控件又具有带有 ControlParameters 的“有罪”ObjectDataSource。这些控件参数具有引用的父页面上的 DropDownList 过滤器的名称(因此基本上,如果将此控件添加到任何其他页面,如果找不到具有正确名称的控件,它当然会失败)。

因此,当我检查并将所有 ControlParameters 更改为参数(删除对该 DropDownList 控件的引用)时,现在我不再收到错误。

我可以假设的是,该数据源引用父页面上的控件这一事实意味着它无法添加回 DataBind() 上的页面控件集。你可能会认为,如果它真的会失败的话,它第一次就会失败,所以这仍然是一个谜。

有什么想法吗?

关于ASP.NET数据源控件 "does not have a naming container"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1743002/

相关文章:

java - 索引 1 处的片段中存在非法字符 : #{systemEnvironment ['DATABASE_URL' ]} configurando datasource on Heroku

c# - 如何将列表数组与 GridView 或 DataList 绑定(bind)?

c# - 如何使用 C# 解码 URL 参数?

javascript - 如何从单选按钮列表中更改已选择的单选按钮的颜色

c# - Silverlight 和 ArrayList

asp.net - 使用 ASP.NET 流式传输视频

html - 使用源文件标记 HTML 元素

c# - 失去焦点时 Datagridview 单元格丢失输入值

WPF DataGrid 显示空双单元格但列标题正确

c# - ASP.NET LinqDataSource WHERE 子句