1

ASP.Net Webサイトでステートフルダイナミックコンテンツを作成するには、どのような選択肢がありますか?

これが私のシナリオです。複数のネストされたコンテンツ領域があるサイトがあります。Catalogトップレベルは、機能領域に関連付けられたアクションですSubscriptions、、Settings

機能的なアクションをクリックすると、そのアクションに固有のコンテンツを動的に追加したいと思います。たとえば、[カタログ]をクリックすると、カタログのフォルダーとファイルを含むツリーと、右側に詳細が表示される領域が表示されます。

ユーザーがツリーをクリックしたときに、コンテキスト依存の詳細を詳細領域にロードする必要があります(ファイルを管理するためのプロパティやオプションなど)。


私はから始めましたUserControls。私がすべてをページにロードし続けている限り、それらは正常に機能し、1つが消えることはありませんでした。ViewStateビューステートツリーが無効だったため、1つが消えるとすぐに、ページが爆発しました。

(応答が大きくなりすぎないようにするため、ページにコンテンツをロードし続けたくありませんでした)

したがって、次のアプローチは、動的領域をに置き換えることでしたIFrames。次に、をインスタンス化する代わりにUserControl、のソースを変更するだけIFrameです。の内容IFramesは独立したページなので、問題はありませんでしたViewState

しかし、それが悪いデザインの選択かもしれないのではないかと心配していIFramesますが、その理由を完全には理解していません。このサイトは公開されていないので、検索エンジンは問題ではありません。


それで、最後に私の質問に。

このシナリオの私のオプションは何ですか?Ajaxソリューション(jQuery)を選択した場合、独自のViewStateを維持する必要がありますか?他に考慮すべき考慮事項はありますか?

4

4 に答える 4

2

動的に追加されたコントロールはビューステートに保持されません。これが、AJAX や iframe などを使用するかどうかが問題にならない理由です。

考えられる回避策の 1 つは、ポストバックでコントロールを再設定することです。これに関する問題は、ページのライフサイクル (簡略化) が次のとおりであることです。

  1. 初期化する
    • LoadViewState
    • ポストバック データの読み込み
    • 呼び出し制御ロード イベント
    • Load イベントの呼び出し
    • 通話制御イベント
    • PreRender の制御
    • プリレンダー
    • ViewState を保存
    • アンロード

これが意味することは、動的コントロールを再追加する唯一の場所が Initialize であるということです。そうしないと、投稿されたデータ (またはビューステート情報) がそのコントロールに読み込まれません。しかし、多くの場合、Viewstat/postback データは Initialize でまだ利用できないため、追加する必要があるコントロールを特定するために必要な情報がコードにありません。

この状況で私が見つけた他の唯一の回避策は、 DynamicControlsPlaceholderと呼ばれるサードパーティのコントロールを使用することです。これは非常にうまく機能し、コントロール情報をビューステートに保持します。


あなたの特定のケースでは、それほど多くの選択肢/ケースがあるようには見えません。ページにさまざまなコントロール セットをすべて配置し、それらを asp:placeholder コントロール内に配置してから、選択内容に応じて 1 つを表示に設定するだけで実用的ですか?

于 2008-09-24T02:06:10.140 に答える
1

さまざまなオプションがありますが、そうです、IFrameは悪いデザインの選択でした。

最初のオプションはAJAXソリューションです。そして、実際にはビューステートシナリオはありません。必要に応じて、Webサーバーとの間でデータをやり取りし、その場でUIを構築するだけです。

次のオプションは、特定の投稿に必要なコントロールを毎回動的に追加することです。これが機能する方法は、ページのライフサイクルの開始時に、前回送信されたとおりにページを再構築してから、不要なコントロールをすべてダンプし、必要なコントロールだけを構築する必要があるということです。 。

3番目のオプションは、マスターページを使用することです。トップレベルのコンテンツはマスターページ自体にあり、Webサイト内のさまざまなページへのリンクが含まれている可能性があります。

十分な時間があれば、もっと思いつくことができると思いますが、これら3つはあなたの問題を読んだだけで現れました。

于 2008-09-24T01:30:24.347 に答える
1

その他のオプション:

  1. コンテンツは動的に見えるだけです。ページに十分な数のコントロールをロードして、すべてを処理し、実際に必要なものだけを表示します。これにより、ビューステートなどをいじる手間が大幅に省けますが、ページのフットプリントが大きくなります。
  2. ページにコントロールを動的に追加します。あなたはすでにこれで遊んでいるので、ここでいくつかの問題を見てきました。ポストバックの動的コントロールを作成する場所は Page_Init() イベントであり、それらをステートフルにしたい場合は、その状態をどこかに保持する必要があることを覚えておいてください。データベースをお勧めします。
于 2008-09-24T03:01:59.133 に答える
1

上記のように、動的コントロールとビューステートはうまく混在しませんが、複雑な動的ページのビューステートを実行したとしても、パフォーマンスがゼロに低下するほど肥大化するため、これは良いことです。

Ajax を使用し [AJAX PRO は非常に使いやすいので気に入っています]、ページの状態を自分で管理します [セッション、データベース テーブル、またはシナリオに適したものなら何でも]。これを行うには少し複雑になりますが、結果は効率的で応答性が高くなります。各ページは変更が必要なものだけを更新でき、巨大なビューステート文字列を常に前後に吹き飛ばす必要はありません。

于 2008-09-24T04:37:13.773 に答える