4

私はWebFormsにまったく慣れておらず、 ViewStateを理解しようとしています。今日のAFAIKは、同じページへのポストバックでUIの変更を維持します。しかし、なぜそれは状態(=保存された変更)をクライアントに送信し、CPUサイクルと帯域幅を節約してサーバー上に保持しないのですか?

私は何か完全に間違っていることを理解していますか?

4

2 に答える 2

3

ビュー ステートは、名前が示すようにビューに本質的に接続されているものであり、その関係を維持しながら個別に管理しようとすることは、簡単に達成できるものではありません。

ページごとにビュー ステートを保存する必要があるため、ポストバックで正しいビュー ステートを取得するには、クライアントに ID を送信する必要があります。もう 1 つの深刻な問題は、ページをクライアントに送信しても、クライアントがいつそのページをサーバーにポストバックするかがわからないため、少なくともセッションが期限切れになるまでビュー ステートを保存する必要があることです。

これは、サーバーにポストバックしない可能性のあるユーザーのためにすべてのビュー ステートが保存されるため、サーバー リソースの浪費につながる可能性があります。ビュー ステートをスリムに保つ場合は、それを格納するのに最適な場所はビューと共に送信することであることに同意するでしょう。

最後に、クライアントのビュー ステートにまだ満足できない場合は、ページのメソッドSavePageStateToPersistenceMediumLoadPageStateFromPersistenceMediumメソッドをオーバーライドして、別のメディアに保存できます。多くの人がクライアントのビュー ステートについて不満を言っているのを聞いたことがありますが、ほとんどの場合、サーバー上の別のメディアに永続性を実装するように伝えています...しかし、おそらく複雑なため、誰も実行したことがないと思いますそして、あなたはそれほどきれいではない解決策になってしまいます。

于 2012-08-15T09:18:55.887 に答える
2

ViewState は、ページのコントロール ツリーを、ページが最後にレンダリングされたときの状態に復元するために、ページがポストバックを実行するときに使用されます。

これにより、たとえば、GridView コントロールは、同じデータに再バインドすることなく、ポストバック時にその状態 (GridView に表示されるもの) を保持できます。

デフォルトで ViewState がシリアル化されてクライアントに送信される理由は、クライアントがポストバックを実行したときにそれを取得する最も簡単な方法だからです。

たとえば、ユーザーが複数のブラウザ ウィンドウを開いて同じページをロードしていて、ビューステートがセッションに保存されている場合はどうでしょうか。このような場合、異なるウィンドウに正しいビューステートを割り当てることはもちろん解決できますが、クライアントに明示的に投稿させるのが最も簡単な方法のようです。

そうは言っても、ビューステートをセッションに保存することは可能です。たとえば、このリンクを参照してください。

独自の を実装することで、他の可能性を利用できますSystem.Web.UI.PageStatePersister

于 2012-08-15T09:37:28.663 に答える