3

私は Web パーツと Web フォームに比較的慣れていません (私は MVC フレームワークでしか多くの作業をしたことがありません)。

制御状態にデータを保存する予定です。私が見つけることができるすべての例は、object[]配列を制御状態に置き、base制御状態を 0 インデックスに置きます。

すべてを に入れるのはあまり好きではないobject[]ので、型指定されたプロパティを持つ Web パーツ用の追加のクラスを作成したいと思いましたMyWebPartControlStateBaseControlState基本コントロールの状態を typeのプロパティに格納しますobject

これが問題を引き起こす可能性があるかどうか、またはこれが良い考えではない他の理由があるかどうか疑問に思っていました. 私には論理的に感じられるので疑問に思っていますが、すべてを制御状態に直接またはobject[].

前もって感謝します。

4

1 に答える 1

3

制御状態は、ビュー状態と同じフィールドに保持され、シリアル化の同じルールに従います。見つかったすべてのサンプルはオブジェクト配列を使用しています。これは、ASP.NETの最適化された状態シリアライザーが理解し、シリアル化を最適化できるタイプの1つであるためです。

カスタムオブジェクトを使用する場合、シリアライザーは最適化を使用せず、代わりにを使用してオブジェクトをシリアル化します。これにより、制御状態が肥大化します。状態の厳密に型指定されたビューが必要な場合は、カスタムクラスに実装して、シリアライザーが理解できる単純なオブジェクトとの間の変換をカプセル化する必要があります。BinaryFormatter IStateManager

正しく思い出せば、シリアライザーは次のタイプを効率的にシリアル化できます。

  • プリミティブ型(、、intなどlong);
  • DateTime;
  • string;
  • サポートされている値タイプのボックス化された値。
  • サポートされているタイプのインスタンスを含むオブジェクト配列。
  • PairTripletサポートされているタイプのインスタンスを含むオブジェクト。

BinaryFormatter単純なカスタムクラスがシリアル化されることと、シリアライザーが最適化できる単純な型に実装IStateManagerおよび分解されることによるサイズの違いを説明する短いブログ投稿を書きました。あなたはそれを見つけることができます:

ASP.NET ViewStateのヒントとコツ#2

于 2012-08-21T10:08:15.567 に答える