【发布时间】:2010-12-17 02:41:58
【问题描述】:
我的代码中出现了这个异常,想知道是否有人可以帮助我。
我有一个绑定到 ObjectDataSource 的转发器控件,并且转发器的项目模板包含一个用户控件 (ASCX)。该用户控件又包含几个其他控件,主要是与 ObjectDataSource 关联的 GridView。
初次使用此设置中的控件时,一切正常 - 数据显示正常。但是,当我更改过滤器选项(中继器外部的下拉菜单),然后重新绑定中继器时,我得到了异常:
ObjectDataSource 控件“expDataSource”没有命名容器。确保在调用 DataBind 之前将控件添加到页面。” 在 System.Web.UI.WebControls.DataBoundControlHelper.FindControl(控制控件,字符串 controlID) ... ... 在 System.Web.UI.WebControls.ObjectDataSource.LoadCompleteEventHandler(Object sender, EventArgs e)
我不确定问题出在哪里——我在一些地方读到,将数据源移到 ASCX 控件之外可能会有所帮助——这无济于事。 objectdatasource 似乎结构正确,正如我所说,它在第一次(仅)工作。
我在堆栈跟踪中注意到,当 ASP.NET 在 LoadComplete() 发生后调用 FindControl() 时会发生这种情况。如果我单步执行我的代码,看起来好像我的所有代码都在这之前完成了执行,所以它都是“系统”代码。
为什么 ASP.NET 在 LoadComplete Handler 中找不到这个数据源控件?
谢谢!
其他说明:
每隔一段时间就会出现此错误。因此,第一次正确加载数据时,第二次刷新失败并出现此错误。再次单击“加载”,它可以工作(第三次)。
-
在失败的时候,看起来“Page_Load”在 ASCX 控件中被调用了两次。所以模式是:
- 工作模式:
- 父页面上的Page_Load
- ASCX 上的 Page_Load
-
数据加载正常
- 失败模式:
- 父页面上的Page_Load
- ASCX 上的 Page_Load
- ASCX 上的 Page_Load
- 异常
这一切都发生在对“Repeater.DataBind()”的调用中,但它的行为会有所不同,具体取决于它是否已经被绑定(显然)。
更多注释:
真正奇怪的行为。我从 ObjectDataSource 的底部删除了 SelectParameters 列表,突然之间,页面不会因为没有 NamingContainer 而拒绝 ObjectDataSource。当然,如果没有这些参数,Databinding 将无法实际工作……我可以将它们添加到代码中,但为什么会重要呢?
【问题讨论】:
-
听起来您的初始成功加载是使用“GET”请求,而失败发生在“POST”中 - 您是否使用“if (IsPostBack)”以不同方式加载控件或数据?
-
否 - 两种类型的请求都应该遵循相同的流程。嗯...
-
我认为初始加载实际上也是一个 POST,因为他们首先从过滤器控件 (DropDowns) 中选择一些选项,然后单击“加载”按钮进行首次加载。
-
关闭转发器的视图状态是否有效?
-
是的 - 如果我关闭转发器的 ViewState,错误就会消失。问题是,我需要打开 ViewState,因为我正在添加临时控件(至少没有对此进行一些重大更改)。为什么关闭 ViewState 会使错误消失?
标签: asp.net data-binding datasource exception naming-containers