ビューステートは、フォームの隠し<input />
タグに保存されます。ユーザーが (ボタンをクリックするなどして) ポストバックを開始すると、データはフォーム データの一部としてサーバーに返されます。
ViewState に大量のデータを保存すると、ユーザーがページをダウンロードしようとしたとき (すべてのデータが HTML の一部になるため) と、ユーザーがフォームを送信しようとしたとき (すべてのデータが HTML の一部になるため) の両方でペナルティが発生します。データはサーバーにアップロードする必要があります)。
さらに、ViewState は簡単に失われます。ユーザーがフォームを送信している間のみ保持されます。ユーザーが別のページへのハイパーリンクをクリックすると、フォームは送信されず、ViewState に含まれるすべてのデータが失われます。これは、アンカー タグがユーザーが現在いるページを指している場合でも当てはまります。
以前の質問から、DataTable を配置するのに適した場所を見つけようとしていることがわかります。データが比較的小さい限り、ViewState は最悪の場所ではありません。Base64 はメモリ使用量の点では XML よりも優れていますが、効率的とは言えません。データがかなり静的な場合は、 ApplicationStateに格納することを検討してください。GridView を使用して DataTable を編集している場合、GridView は実際にはDataSourceプロパティを介してアクセスできる DataTable を既に格納しています (DataTable にキャストするだけです)。
また、ViewState データは base64 でエンコードされていますが (平均的なユーザーには理解できないことを意味します)、熱心なユーザーであれば簡単に編集できることにも注意してください。一見無害なデータが編集されて、Web サイトにとって非常に有害になる可能性があります。これはウェブサイトをハッキングするための古典的な手段であるため、どのデータを正確に保存するかについて非常に注意する必要があります. たとえば、ユーザーの ID を ViewState に保存すると、ユーザーは ID を編集して、別のユーザーのアカウントに侵入する可能性があります。(注: これは、EnableViewStateMac が に設定されている場合のみの問題ですFalse
。 )