Webフォームは、サーバーにポストバックするときにviewstateを使用して制御状態を維持します。たとえば、Webフォームにテキストボックスとボタンがあるとします。テキストボックスに何かを入力し、ボタンをクリックします。このボタンは、サーバーにポストバックを実行します。ページがリロードされるときに、サーバー側のコードでテキストボックスを自分でクリアしない限り、テキストボックスには、ボタンをクリックする前に入力したものはそのまま残ります。
実際には、テキストボックス内のデータは、非表示のビューステートフィールドに格納され、ページが更新されると再びテキストボックスに読み込まれました。ビューステートはbase64でエンコードされているので混乱しているように見えます。ビューステートに自分自身を手動で保存することもできます。あなたのページのPage_Loadイベントでこれだけの操作を行います。あなたは空白のWebフォーム上でこれをしなかった場合は、ページをロードするとき今
this.ViewState["someVariable"] = "some value";
を、あなたは(あなたが貼り付けられたようなHTMLでビューステートフィールドが表示されます非常に小さいものを除く)。その隠しフィールドから値をコピーし、ビューステートデコーダ(like this one)に貼り付けると、someVariableに値 "some value"が表示されます。
今すぐフォームにボタンを配置し、ボタンのクリックでも、次の操作を行います。
Response.Write(this.ViewState["someVariable"].ToString());
あなたがページ上に書かれた「何らかの値」を参照してくださいます。あなたが行ったのは、手動でビューステートに何かを保存し、それを隠しフィールドのページにレンダリングした後、その隠しフィールドをサーバーにポストバックし、そこから読み取ってデータを表示します。
これはWebフォームの主な機能です。 MVCはviewstateを使用しません。MVCはあなたの質問の範囲外になるモデルバインディングと呼ばれる別のテクニックに依存しています。 mvcが投稿間で情報を管理する方法の詳細については、Googleの「asp.net mvc model binding」を参照してください。
ビューステート冗談の少しオフトピック例:
私はU413と呼ばれるかなり大きなコミュニティサイトを持っています。私は最近、ASP.net MVC 2.0を使用するように再設計しました。プログラマーのためのコミュニティーであり、私はいつもウェブフォームを使用するために私を怒らせます。さて、私はそれらに少し冗談を再生することを決めたwebformsを使用しないでください。 MVCはviewstateを使用しませんが、私はwebformに入り、いくつかのデータを含むviewstateを生成し、手動で隠しフィールドをMVCアプリケーションのビューに貼り付けました。
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE2MTY2ODcyMjkPFgIeE1U0MTNTZWNyZXRBY2Nlc3NLZXkFM2h0dHA6Ly93d3cudTQxMy5jb20vQ29udGVudC9VNDEzU2VjcmV0QWNjZXNzS2V5LmpwZ2RkpshYUvbSiUuE0YaYNBH0rvTGj4qEcquSqQeUs9ZpuIQ=" />
すでに何人かの人々は、ほとんどの秘密やエクスプロイトを見つけることを期待してHTMLソースを通じてスヌーピング行って、これが発生しています。彼らはすぐにそれをデコードし、良い笑いを得ました。表示したい場合は、値をコピーして先にリンクしたデコーダに貼り付けてください。
グーグル「asp.net viewstate」 –
ViewStateはスライスされたパン以来最高のものです! –
ビューステートデータのサイズは注意深く管理する必要があります。あなたのページをすばやく追加して、本当に膨らませることができます。 – rboarman