私は、ユーザーの好みに応じてEmployee
とStation
CRUDタスクの両方を処理するページを設計しようとしています。私はUserControl
をサブクラス化してEditEntityControl
を作成し、この基本クラスから派生した2つのカスタムコントロールを開発し、それぞれEmployee
またはStation
オブジェクトのCRUDアクティビティを処理します。ポストバック中に動的にロードされるコントロールを変更します
ユーザーがポストバックをトリガーするドロップダウンリストの値を切り替えると、正しいコントロールをページに動的にロードする必要があります。これは、各コントロールの最初の負荷で動作しますが、私は(第2のロード後)最初のコントロールを再ロードしようとすると、私は次のエラーを取得する:
Failed to load viewstate. The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request. For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request.
私も初期の負荷にいくつかの奇妙な行動を参照してくださいデータバインディングが正しいコントロール(コントロールのテキストボックスではなくボタンのテキストを設定するなど)にバインドされない2番目のコントロールです。
このシナリオを処理する方法はありますか?または、ViewState
をクリアしてこのエラーを回避するためにページ全体を再リクエストする方法はありますか?これは、私がこのViewState
PostBacks間の混乱/混乱を解消できれば、他のすべてが設計どおりに動作しているようです。
ViewStateが必要ない場合は、コントロールまたはベースコントロールで 'EnableViewState'をfalseに設定してみましたか? –
しかし私はいくつかのPostBacksで 'ViewState'が必要です。これらは入力フォームなので、ユーザーがフォームの1つでsubmitをクリックすると、そのインスタンスに 'ViewState'が必要になり、値をデータベースに保持します。私は2番目の入力コントロールが要求されている場合に 'ViewState'をクリアしたいだけです。 –
まず、数値が予測可能な場合は、UserControlの表示を切り替える方がよいでしょう。表示されないコントロールはレンダリングされないため、パフォーマンスは引数ではありません。それとは別に、ページのライフサイクルのどこで、どのようにこれらのコントロールをロードしているのかを示す必要があります。 page_loadの後にコントロールを動的に追加することはできますが、**後で**コントロールを再作成することはできません(fe。イベントアンドラーで)。それらに静的IDを割り当てましたか?どのように作成されますか? –