数据绑定和用户控件

4
这个问题真的让我很困扰,所以我希望有人能帮我一下。
1)假设页面包含用户控件,则在UserControl.Page_Load之前将触发Page.Page_Load:
a) 我假设如果页面包含ObjectDataSource1控件,则ObjectDataSource1将在UserControl.Page_Load之前执行数据绑定?!
b) 如果是这种情况,那么Page.Prerender也会在UserControl.Page_Load之前发生吗?
c) 如果UserControl包含ObjectDataSource2控件,那么该控件是否与直接包含在Page中的ObjectDataSource1同时执行数据绑定?
但那没什么意义,因为我认为UserControl内部的控件遵循UserControl的生命周期而不是Page的生命周期?!
无论如何,我认为Web页面托管用户控件不能接收用户控件内包含控件的事件或调用方法!如果是这样,那么Web页面如何能够在ObjectDataSource2上调用databind?
谢谢
编辑:
我的困惑主要来源于某本书中的以下引用:
“……用户的国家、州和城市只读一次从配置文件中读取并保存在本地变量中。UserControl.Page_Load不能用于此,因为UserControl.ObjectDataSource自动绑定在之前发生,因此我们必须使用UserControl.Page_Init事件处理程序。”
我认为在上述引文中,作者建议如果用户控件包含ODS,则此ODS将在UserControl.Page_Load之前执行数据绑定,这不是您所说的吗?
顺便说一句-上述引用中所说的用户控件是在设计时添加到Web页面中的。
另一个编辑:
我搜索了一下,这本书(或其中的一部分)可以在以下链接中找到。

http://books.google.com/books?id=hziE1NB0UkIC&printsec=frontcover&dq=website+programming+asp.net+2.0+design+solution&ei=7lmESv63Npu-ygTO0f2yDg#v=onepage&q=&f=false

这句话出自第257页,基本上是描述 ArticleListing.ascx 用户控件的一部分。

顺便说一下 - 只是为了让您不认为我是妄想症...我不希望任何人阅读有关该用户控件的整个部分,我只是认为第257页上的代码可能提供足够的上下文来理解作者实际意思。


1
很遗憾,在该预览中似乎无法访问第257页。 - womp
1个回答

10
您提出的所有问题都与ASP.Net页面生命周期相关。您应从这里开始: ASP.Net页面生命周期概述 然而,为了回答一些具体的问题。
(1) 来自我提供的链接:
引用: 页面在页面上调用OnLoad事件方法, 然后递归地对每个子控件执行相同的操作, 直到加载页面和所有控件。
(a) 这是不正确的。数据绑定发生在PreRender之前。
(b) Page.PreRender仅在用户控件没有添加到页面直到页面的生命周期(即动态添加)的情况下才会在UserControl.PageLoad之前发生。如果是这种情况,则该用户控件的所有生命周期事件将在其添加到Page的Control集合后立即依次触发,直到它赶上其父容器,即Page。
(c) 只要在此之前已将用户控件添加到页面中,数据绑定就会大致同时发生。用户控件的数据绑定将在页面的控件进行数据绑定之后发生。
(c) 点号符:用户控件具有自己的生命周期,但是,除非将控件添加到页面上的容器中,否则不会执行。这也应该回答您的第二个点号符。
编辑: 那是一本有趣的书摘,我很想说它完全不正确。然而,我需要看看作者在谈论什么样的上下文。也许他正在谈论一本书中具有特殊逻辑的示例对象,在OnInit处理程序中进行数据绑定。话虽如此,我建立了一个测试项目来检查默认行为。 我添加了一个ObjectDataSource,它具有返回字符串数组的Select方法,一个使用数据源绑定的用户控件(.ascx),以及一个向页面添加用户控件的页面。 事件的顺序与我预期的相同:
MyObjectDataSource -> Init
UserControl -> Init
Page -> Init
Page -> Load
UserControl -> Load
MyObjectDataSource -> Load
Repeater1 -> DataBinding
MyObjectDataSource -> Selecting
MyObjectDataSource -> SelectMethod
Repeater1 -> DataBound
ObjectDataSource文档也支持这一点:

每当调用Select方法时, ObjectDataSource控件检索数据。 此方法提供对由SelectMethod属性指定的方法的编程访问 当调用其DataBind方法时,绑定到ObjectDataSource的控件自动调用SelectMethod属性指定的方法。如果设置数据绑定控件的DataSourceID属性,则该控件会根据需要自动绑定到数据源。 设置DataSourceID属性是将ObjectDataSource控件绑定到数据绑定控件的推荐方法。 或者,您可以设置DataSource属性,但是然后必须明确调用数据绑定控件的DataBind方法。 您可以随时以编程方式调用Select方法来检索数据。

我不得不得出结论,除非该引用是在某些特殊情况下进行的,否则作者是完全错误的。 也许他误将“数据绑定”写成了“从ViewState检索先前绑定的值”?

嗨,我已更新了我的帖子,如果您有时间,可以再帮我一些。 - SourceC
抱歉,我不会再打扰您了,但如果您有时间的话...我已经回复了您的答复。无论如何,您已经帮了我很多,谢谢。 - SourceC
它是可用的,只是可能需要一些时间来加载。 - SourceC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接