5

私は一連の一般的な ASP.NET コントロールを作成してきましたが、ビューステートに値を格納するタイミングと、値を格納しなくても問題ないと判断するタイミングについては、頭を悩ませているようです。

一方では、次のようなプロパティを含むコントロールの状態全体をビューステートに保存することは理にかなっています。

  • ユーザーが入力したテキスト ボックスの値 (または任意のフォーム データ)
  • 高さやページサイズなどの設定オプション
  • コントロールがどのように構成されているかも - たとえば、グリッド ビューが構築されるすべてのデータ、またはグリッド自体を保存します。

パフォーマンスを無視して、viewstate に押し込むことができるほど良いです。これは、コントロールがポストバック間でまったく同じように動作し、「誤って」値を元に戻したり、無効になったことを「忘れたり」しないことを意味するためです。ただし、ビューステートは無料ではありません。すべてを格納するということは、コントロールが HTML とそのすべての内部プロパティの両方を出力してその HTML を作成することを意味し、ほとんどの場合、出力は 2 倍以上になります。

私の質問はパフォーマンスについてではなく、戦略についてです。どのような基準でプロパティをビューステートに置くことを決定しますか? 私はこれらの線に沿って何かを考えていました:

ユーザーがプロパティを変更できない場合、サーバーは常にプロパティを明示的に設定するため、viewstate から除外してもかまいません。のようなものでもcolor=red、ユーザーはこのプロパティを直接設定しません。このプロパティを間接的に設定する別の場所のボタンをクリックします。そのボタンまたはその所有者は、赤色をレンダリングするコントロールではなく、状態を保持する必要があります。

このロジックは、ビューステートに入る必要があるプロパティは次のとおりであることを意味します。

  1. のようなフォーム要素<input>(そして、Request.Form[c.UniqueID]これを使用しても回避できます)
  2. ユーザーがコントロール上で直接インタラクティブに制御できるプロパティ。

このロジックは理にかなっていますか?弱いようで、専門家からもっと聞きたいです。

4

3 に答える 3

4

ViewStateコントロールが機能するために必要ではないものに使用します。

ControlStateViewState が無効になっている場合でも、コントロールが機能するために必要なものに使用します。

ページが最初に要求されたときに、初期値とコントロール階層 (html コントロールも含む) が一時 ASP.NET ファイルにコンパイルされます。そのため、変更されていない場合はどこにも保存する必要はありません (ViewState でさえ保存されません)。

ViewStateコントロールは、ページのライフサイクル中に変更されたプロパティのみを保存します(以降TrackViewState)。状態が変化したコントロールは「ダーティ」です。たとえばTextBox1.Text、page_load を変更すると、ViewState.IsItemDirty("TextBox1.Text")true が返されます。これらの値は ViewState に格納されます。

ここここを見 てください。(両方の記事を読むことを強くお勧めします)

コントロール状態とビュー状態の例

于 2012-08-31T14:50:51.657 に答える
3

ASP.NET で利用可能な多数の状態管理オプションをいつ、どこで、何を使用するかについて説明している MSDN のこの記事を確認してください。ビュー ステートのセクションは便宜上以下に掲載されています。長所と短所に対する要件を確認することで、ケースでの使用方法をガイドする必要があります。ケースバイケース:

記事全体: http://msdn.microsoft.com/en-us/library/z1hkazw7(v=vs.100).aspx

ビューステートの抜粋:

状態を見る

Web フォーム ページは、同じページに対する複数の要求間で値を自動的に保持するための組み込み構造として ViewState プロパティを提供します。ビュー ステートは、ページの非表示フィールドとして維持されます。詳細については、「ASP.NET 状態管理の概要」を参照してください。

ビューステートを使用して、ページがそれ自体にポストバックするときに、ラウンドトリップ全体で独自のページ固有の値を保存できます。たとえば、アプリケーションがユーザー固有の情報 (ページで使用されているが、必ずしもコントロールの一部ではない情報) を保持している場合、それをビュー ステートに格納できます。

ビュー ステートを使用する利点は次のとおりです。

サーバー リソースは必要ありません ビュー ステートは、ページ コード内の構造体に含まれています。

シンプルな実装 ビュー ステートを使用するためのカスタム プログラミングは必要ありません。コントロールの状態データを維持するために、デフォルトでオンになっています。

強化されたセキュリティ機能 ビュー ステートの値は、Unicode 実装用にハッシュ化、圧縮、およびエンコードされるため、隠しフィールドを使用するよりもセキュリティが強化されます。

ビュー ステートを使用するデメリットは次のとおりです。

パフォーマンスに関する考慮事項 ビュー ステートはページ自体に格納されるため、大きな値を格納すると、ユーザーがページを表示したり投稿したりするときに、ページの速度が低下する可能性があります。これは、帯域幅が制限されることが多いモバイル デバイスに特に関係します。

デバイスの制限 モバイル デバイスには、大量のビューステート データを格納するためのメモリ容量がない場合があります。

潜在的なセキュリティ リスク ビュー ステートは、ページ上の 1 つまたは複数の非表示フィールドに格納されます。ビュー ステートはデータをハッシュ形式で保存しますが、改ざんされる可能性があります。ページ出力ソースを直接表示すると、非表示フィールドの情報が表示される可能性があり、セキュリティ上の問題が発生する可能性があります。詳細については、「ASP.NET Web アプリケーション セキュリティ」および「Web アプリケーションの基本的なセキュリティ プラクティス」を参照してください。

于 2012-08-31T14:55:51.917 に答える
0

ビューステートの肥大化を懸念するのは正しいと思いますが、他にどのようなオプションを利用できますか? そこに変数データを保存しない場合、どこに置きますか? (いくつかの構成項目を削除することを検討したい場合があります-おそらく、ユーザーに多くのプロパティを変更させないでください)。

于 2012-08-31T14:50:02.653 に答える