0

わかりました、これは私が午前中ずっと問題を抱えていた本当に厄介なバグです!.

多くのプロジェクトで使用したカスタム コントロールがあります。このコントロールには、呼び出しページ onload によって Viewstate に設定および格納されるプロパティがあります。コントロールは、カスタム コントロールの CreateChildControls() メソッドのプロパティで childcontrols を設定します。

通常、ポストバックで通常どおり Page_Load イベントが発生し、次にページ上のコントロールの CreateChildControls メソッドが発生します。

奇妙なことに、サイトにログイン システム (カスタム メンバーシップ プロバイダー) があり、ユーザーがログインすると、最初に CreateChildControls() メソッドが起動し、次に Page_Load が起動するため、コントロール プロパティが間違っています (前のポストバックから設定)。 )

イベントが別の順序で発生する可能性はありますか? すべてのページイベントは同じ順序で発生すると思っていましたが、ログインするとその順序がどのように変わるかわかりません。

更新:問題は、EnsureChildControls() を呼び出していないようですが、どこで呼び出す必要があるかわかりませんか? 子コントロールの設定に使用されるいくつかのプロパティがコントロールに設定されている場合、EnsureChildControls() をいつ呼び出す必要がありますか?

4

2 に答える 2

4

CreateChildControls は、ASP.NET ページがそれらを必要とするたびに呼び出されます。そのためのページサイクルには特定のポイントはありません。これは Init イベントで発生する可能性があり、Load イベントで発生する可能性があります。子コントロールが利用可能であることを確認したい場合は、コントロールの EnsureChildControls() メソッドを呼び出します。コントロールの Init イベントでこれを実行して、ライフサイクル全体を通じて子コントロールがあることを確認するか、子コントロールの 1 つへの参照が必要なときにいつでも実行できます (たとえば、コントロールのプロパティのゲッター/セッター)。

于 2009-05-07T12:29:31.600 に答える
1

含まれている子コントロールにアクセスする必要があるサーバー/ユーザー コントロールのプロパティを作成するときは、次を使用します。

public Whatever SomeProperty
{

    get
    {
        EnsureChildControls();
        <more code here>
    }
    set
    {
        EnsureChildControls();
        <more code here>
    }
}

これにより、コントロールのコンシューマーは、ページ ライフサイクルのさまざまな段階でコントロールを自由に操作できるようになります。

于 2009-05-07T15:28:23.467 に答える