ASP.ネット:プレースホルダーに追加されたユーザー コントロールは値を動的に取得できません
-
01-07-2019 - |
質問
いくつかのユーザー コントロールを PlaceHolder サーバー コントロールに動的に追加しています。私のユーザー コントロールは、いくつかのラベルといくつかのテキストボックス コントロールで構成されています。
フォームを送信し、サーバー上のテキスト ボックス (各ユーザー コントロール内) の内容を表示しようとすると、テキスト ボックスが空になります。
ポストバックが完了すると、テキストボックスにはポストバック前に入力したデータが表示されます。これは、ボックス内のテキストが ViewState を通じて保持されていることを示しています。デバッグ中になぜ見つからないのかわかりません。
ユーザーがサーバーに入力したデータが表示されない理由を誰か教えてください。
助けていただきありがとうございます。
解決
これは .NET v1 のイベント シーケンスに基づいていますが、次のようなアイデアが得られるはずです。
- 初期化(Initイベント)
- ビューステートの追跡を開始 (ポストバックかどうかを確認)
- ビューステートをロードする (ポストバックの場合)
- ポストバック データのロード (ポストバックの場合)
- ロード(ロードイベント)
- 変更されたイベントを発生させる (ポストバックの場合)
- ポストバック イベントを発生させる (ポストバックの場合)
- PreRender (PreRender イベント)
- ビューステートの保存
- 与える
- アンロード (アンロードイベント)
- 廃棄
ご覧のとおり、ViewState データのコントロールへのロードは、Load イベントの前に行われます。したがって、動的に追加されたコントロールがこれらの値を「保持」するには、次のようにする必要があります。 現在 ASP.NET ページが最初に値を再ロードするようにします。ビュー ステートの読み込みが発生する前に、初期化段階でこれらのコントロールを再作成する必要があります。
他のヒント
昨日、loadviewstateevent が発生した直後にコントロール ツリーをロードすることで、実際にアプリを通常どおり動作させることができることが分かりました。loadviewstate イベントをオーバーライドして mybase.loadviewstate を呼び出し、その直後にコントロールを再生成する独自のコードを配置すると、それらのコントロールの値はページの読み込み時に使用できるようになります。私のアプリの 1 つでは、ビューステート フィールドを使用して、これらのコントロールの再作成に使用できる ID または配列情報を保持しています。
Protected Overrides Sub LoadViewState(ByVal savedState As Object)
MyBase.LoadViewState(savedState)
If IsPostBack Then
CreateMyControls()
End If
End Sub
これらの値を読み取るために Load フェーズで ViewState を設定するには、ページ ライフ サイクルの Init フェーズ中に UserControl を PlaceHolder に追加する必要があると思います。これはロードする順番ですか?
動的コントロールをクラス レベルで定義し、ASP コンテナに追加していることを確認します。
Private dynControl As ASP.MyNamespace_MyControl_ascx
また、コントロールをインスタンス化するときは、オブジェクトが適切に追加されるように LoadControl を必ず呼び出してください。
dynControl = CType(LoadControl("~/MyNamespace/MyControl/MyControl.ascx"), ASP.MyNamespace_MyControl_ascx)
Page_PreInit イベント ハンドラーでコントロールを作成する必要があります。ASP.NET サーバー制御モデルは扱いが難しいです。を完全に理解する必要があります ページのライフサイクル 正しくやるために。
他の人が言ったように、ビューステートが作成される前に、いかなる形式のコントロール操作も実行する必要があります。
ページのライフサイクルに関する役立つリンクは次のとおりです。
私たちも同じことを経験し、まったく同じ .ID を持つ page_load のゴースト コントロールを使用して対処し、ポストバックでイベントとデータを取得しました。他の人が言ったように、初期段階の後のコントロールの動的追加であり、状態はすでに構築されており、その後に追加されたコントロールは保存されません。
これが少しでも役立つことを願っています。
また、実行時に Control.ID プロパティを設定するだけで、ユーザー コントロールが期待どおりに動作することを確認したことも付け加えておきます。ID を設定しないと、項目が異なる順序で構築され、動作がおかしくなる可能性があります。