4

これは本当に私を悩ませているので、誰かが私を少し助けてくれることを願っています


1) ページにユーザー コントロールが含まれていると仮定すると、Page.Page_LoadUserControl.Page_Loadの前に起動されます。


a) Page にObjectDataSource1コントロールが含まれている場合、 ObjectDataSource1はUserControl.Page_Loadの前にデータ バインディングを実行する と仮定します。


b) その場合、Page.PrerenderUserControl.Page_Loadの前に発生しますか?


c) UserControlObjectDataSource2コントロールが含まれている場合、このコントロールはObjectDataSource1 ( Page内に直接含まれている)と同時にデータ バインドを実行しますか?

  • しかし、 UserControl内のコントロールは、 PageではなくUserControl のライフ サイクルに従うと仮定するため、あまり意味がありません。

  • とにかく、ユーザー コントロールをホストしている Web ページは、イベントを受信したり、ユーザー コントロール内に含まれるコントロールのメソッドを呼び出したりできないと思いましたか?!もしそうなら、Web ページはObjectDataSource2でデータバインドを呼び出すことができますか?


ありがとう


編集:

私の混乱の主な原因は、ある本からの次の引用です。

…ユーザーの国、都道府県、都市はプロファイルから 1 回だけ読み取られ、ローカル変数に保存されます。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

とにかく、引用は基本的に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) 箇条書き: ユーザーコントロールには独自のライフサイクル (true) がありますが、コントロールがページ上のコンテナーに追加されるまで実行されません。これは、2 番目の箇条書きにも回答する必要があります。


編集: それは本からの興味深い抜粋であり、私はそれが完全に間違っていると言いたくなるでしょう. ただし、著者がどのような文脈で話しているのかを確認する必要があります。おそらく彼は、データバインディングを行うための OnInit ハンドラーに特別なロジックを持つ本の中のサンプル オブジェクトについて話しているのでしょう。

そうは言っても、デフォルトの動作を確認するためだけにテスト プロジェクトをセットアップしました。文字列の配列を返す Select メソッドを持つ ObjectDataSource 、データ ソースにバインドするリピーターを持つユーザー コントロール (.ascx)、およびユーザー コントロールを追加するページを追加しました。イベントの順序は、私が予想したとおりでした。

MyObjectDataSource -> 初期化
ユーザーコントロール -> 初期化
ページ -> 初期化
ページ -> 読み込み
ユーザーコントロール -> ロード
MyObjectDataSource -> 読み込み
Repeater1 -> DataBinding
MyObjectDataSource -> 選択中
MyObjectDataSource -> SelectMethod
Repeater1 -> データバインド

ObjectDataSourceのドキュメントもこれをサポートしています。

ObjectDataSource コントロールは、Select メソッドが呼び出されるたびにデータを取得します。このメソッドは、SelectMethod プロパティで指定されたメソッドへのプログラムによるアクセスを提供します。SelectMethod プロパティで指定されたメソッドは、DataBind メソッドが呼び出されたときに、ObjectDataSource にバインドされたコントロールによって自動的に呼び出されます。データ バインド コントロールの DataSourceID プロパティを設定すると、コントロールは必要に応じてデータ ソースのデータに自動的にバインドされます。DataSourceID プロパティを設定することは、ObjectDataSource コントロールをデータ バインド コントロールにバインドするための推奨される方法です。または、DataSource プロパティを設定できますが、データ バインド コントロールの DataBind メソッドを明示的に呼び出す必要があります。いつでもプログラムで Select メソッドを呼び出して、データを取得できます。

その引用が特別な状況の文脈で取られない限り、著者は完全に間違っていると結論せざるを得ません. 「以前にバインドされた値を ViewState から取得する」という意味で、誤って「データ バインディング」と書いたのではないでしょうか。

于 2009-08-12T22:38:55.143 に答える