私は DataBase から DataTable を取得し、以下のように ViewState に割り当てています: 毎回データベースにアクセスしたくないからです。
DataTable dt = GetDataTable();
ViewState["dtTable"] = dt;
GetDataTable()
は、DataBase から 1000 レコードを取得するメソッドです。これが最善の方法ですか、それともこれを処理するための最良の方法はどれですか?
私は DataBase から DataTable を取得し、以下のように ViewState に割り当てています: 毎回データベースにアクセスしたくないからです。
DataTable dt = GetDataTable();
ViewState["dtTable"] = dt;
GetDataTable()
は、DataBase から 1000 レコードを取得するメソッドです。これが最善の方法ですか、それともこれを処理するための最良の方法はどれですか?
まず最初に: 説明はさておき、要件や環境設定に大きく依存します...
<input />
ビューステートは、ブラウザに送信される最終的な HTML のタグとしてレンダリングされる隠しフィールドに格納されます 。ユーザーがポストバック (ボタンのクリックなど) を開始すると、送信されたフォーム データの一部としてデータがサーバーに送り返されます。
ViewState に大量のデータを保存すると、ユーザーがページをダウンロードしようとしたときにペナルティが発生する必要があります。そのようなデータはすべて HTML の一部になるためです。サーバーに送り返されます。
さらに、ViewState は簡単に失われます。ユーザーがフォームを送信している間のみ保持されます。ユーザーが別のページへのハイパーリンクをクリックすると、フォームは送信されないため、ViewState に含まれるデータは失われます。
データが比較的小さい場合は、ViewState を使用することをお勧めします。
セキュリティ オプションを考慮すると、ViewState データは base64 でエンコードされており、簡単にデコードできます。これは Web サイトをハッキングする典型的な例なので、保存しているデータを正確に確認してください。ただし、この問題はEnableViewStateMac
true に設定することで解決できます。
大量のデータの場合、セッションは適切なオプションです。ユーザーが特定のデータ ブロックをいつ処理したかを検出できる場合は、Session 変数を null に設定して、メモリ オーバーヘッドに対処します。常にこれを行うことはできませんが、セッションは期限切れになり、メモリは自動的に再利用されます。セッションタイムアウトを下げることも役立ちますが、要件のニーズに応じて設定してください。
また、セッション内のデータは、ページのロード間で実際に Web サーバー上に存在します。これにより、ページ サイズを小さく保つことができ、セッション ID のみを使用する必要があります。
最後のオプションは、キャッシュを使用することです。キャッシュのベスト プラクティスについては、MSDN のこちらを確認してください。
ビュー状態の副作用
1) 入力値にシリアライズされ、戻る途中でデシリアライズされます。
2) ビューステートは、フォームの隠しタグに格納されます。ユーザーが (ボタンをクリックするなどして) ポストバックを開始すると、データはフォーム データの一部としてサーバーに返されます。それは物事を遅くする可能性があります。
3)ViewState は簡単に失われます。ユーザーがフォームを送信している間のみ保持されます。ユーザーが別のページへのハイパーリンクをクリックすると、フォームは送信されず、ViewState に含まれるすべてのデータが失われます。これは、アンカー タグがユーザーが現在いるページを指している場合でも当てはまります。
次の理由から、 ASP.NET キャッシュを使用してこれらのデータ テーブルを格納します。
1) キャッシュには有効期限があります。つまり、スライドまたは絶対有効期限の値に基づいて自動的に削除できます。
2) プロセスのメモリ「プレッシャー」が高すぎる場合、キャッシュは自動的に削除されます。
3) キャッシュされたアイテムを 1 人のユーザーに固有にするか、そのキーに基づいてすべてのユーザーにグローバルにすることができます
DataTable を使用するとうまくいきます。ただし、DataTable は基本的に動的オブジェクトであり、ビュー内のコードはデバッグが困難になる傾向があります。
必要なプロパティを保持するクラスまたは構造体を作成することをお勧めします。次に、DataTable をこのクラスのリスト インスタンスに変換し、代わりにそれをビューに送信します。
これにより、取得しようとしているデータをプログラマーが確認できるようになるため、コードが読みやすくなります。また、ビューを何度もデバッグする必要がなくなります。
ViewState は悪い方法ではありませんが、大きなデータの場合は、有効期限を制御できるセッション変数にデータを保存することをお勧めします