4

这真的让我很烦恼,所以我希望有人可以帮助我


1)假设页面包含用户控件,则Page.Page_Load在UserControl.Page_Load之前被触发:


a) 我假设如果 Page 包含ObjectDataSource1控件,那么ObjectDataSource1将在UserControl.Page_Load之前执行数据绑定?!


b)如果是这种情况,那么Page.Prerender 是否也会发生在UserControl.Page_Load之前?


c) 如果UserControl包含ObjectDataSource2控件,该控件是否会与ObjectDataSource1(直接包含在Page中)同时执行数据绑定?

  • 但这没有多大意义,因为我假设 UserControl 中的控件遵循UserControl 的生命周期而不是Page 的?!

  • 无论如何,我认为托管用户控件的网页无法接收事件或调用用户控件中包含的控件的方法?!如果是这样,那么网页如何能够调用ObjectDataSource2上的数据绑定?


谢谢


编辑:

我困惑的主要来源是某本书的以下引用:

…用户的国家、州和城市仅从配置文件中读取一次并保存在本地变量中。UserControl.Page_Load 不能用于此,因为 UserControl.ObjectDataSource 完成的自动绑定发生得更早,所以我们必须使用 UserControl.Page_Init 事件处理程序

我假设在上面的引用中作者建议如果用户控件包含 ODS,那么这个 ODS 将在 UserControl.Page_Load 之前执行数据绑定,这不是你所说的吗?

顺便说一句 - 上面引用的用户控件在设计时添加到网页中


另一个编辑:

我做了一些谷歌搜索,这本书(或其中的一部分)可在以下链接中找到。

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 页上的代码可能会提供足够的上下文来弄清楚作者的实际意思

4

1 回答 1

10

您的所有问题都与 ASP.Net 页面生命周期有关。您应该从这里开始: ASP.Net 页面生命周期概述

但是,要回答一些具体问题。

(1)从我提供的链接:

Page 调用 Page 上的 OnLoad 事件方法,然后递归地对每个子控件执行相同的操作,这对其每个子控件执行相同的操作,直到加载页面和所有控件。

(a) 这是不正确的。DataBinding 发生在 PreRender 之前。

(b) Page.PreRender在页面生命周期的 PreRender 部分(即动态添加)之前未将 UserControl 添加到页面的情况下才会发生在 UserControl.PageLoad 之前。如果是这种情况,则用户控件的所有生命周期事件将在添加到 Page 的 Control 集合后立即连续触发,直到它赶上它的父容器,即 Page。

(c) DataBinding 大约会在同一时间发生,只要此时用户控件已添加到页面。用户控件的数据绑定将在页面的控件数据绑定之后发生。

(c) 项目符号:用户控件有自己的生命周期,是的,但同样,在控件被添加到页面上的容器之前,它不会被执行。这也应该回答您的第二个要点。


编辑: 这是书中有趣的摘录,我很想说这是完全不正确的。但是,我需要看看作者在谈论什么样的背景。也许他在谈论本书中的一个示例对象,该对象在 OnInit 处理程序中具有特殊的逻辑来执行数据绑定。

话虽如此,我建立了一个测试项目只是为了检查默认行为。我添加了一个带有返回字符串数组的 Select 方法的 ObjectDataSource、一个带有绑定到数据源的转发器的用户控件 (.ascx),以及一个添加了用户控件的页面。事件的顺序如我所料:

MyObjectDataSource -> 初始化
用户控制 -> 初始化
页面 -> 初始化
页面 -> 加载
用户控件 -> 加载
MyObjectDataSource -> 加载
Repeater1 -> 数据绑定
MyObjectDataSource -> 选择
MyObjectDataSource -> 选择方法
Repeater1 -> 数据绑定

ObjectDataSource 文档也支持这一点:

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

我不得不得出结论,除非这句话是在某些特殊情况下引用的,否则作者是完全错误的。也许当他的意思是“从 ViewState 中检索以前绑定的值”时,他错误地写了“数据绑定”?

于 2009-08-12T22:38:55.143 回答