HiddenField コントロールは、その名前が示すように、入力ボックスを非表示にするサーバー コントロールで、ページに表示する必要がなく、高度なセキュリティを必要としないデータを保存できます。おそらくこの時点で、ViewState、Session、Cookie などの状態保存メカニズムがあるにもかかわらず、なぜ HiddenField を使用する必要があるのかという疑問が生じるはずです。
HiddenField を追加する目的は、状態管理メカニズム全体のアプリケーションをより包括的にすることです。 ViewState、Cookie、Session のいずれであっても、たとえば、ユーザーが特定のニーズのために ViewState を false に設定する必要があるか、環境条件により Cookie の使用が制限されているか、ユーザーが非アクティブであるなど、有効期限が切れる時間が存在するためです。長時間使用するとセッションの有効期限が切れてしまいます。現時点では、HiddenField が最良の選択であることは間違いありません。
HiddenField コントロールの機能は、サーバーに送信するまでに維持する必要がある値を保存することだけです。これは <input type="hidden"/> 要素としてレンダリングされ、runat="server" を追加することで標準の HTML サーバー コントロールにすることができます。以下に、ASP.NET HiddenField Web サーバー コントロールで使用できるプロパティとイベントを示します。
<asp:HiddenField
EnableTheming="True|False"
EnableViewState="True|False"
ID="文字列"
OnDataBinding="DataBinding イベント ハンドラー"
OnDissolved="破棄されたイベント ハンドラー"
OnInit="初期化イベント ハンドラ"
OnLoad="イベントハンドラをロード"
OnPreRender="PreRender イベント ハンドラー"
OnUnload="アンロード イベント ハンドラー"
OnValueChanged="ValueChanged イベント ハンドラー"
runat="サーバー"
スキンID="文字列"
値 = "文字列"
Visible="True|False"
/>
HiddenField の値はクライアント ブラウザーにレンダリングされるため、セキュリティが重要な値を保存するのには適していません。 HiddenField コントロールの値を指定するには、Value プロパティを使用します。これは Text ではなく Value であることに注意してください。実際、HiddenField には Text プロパティがありません。これは、DropDownList や CheckBoxList などの標準ボタンのプロパティ名と一致しています。標準のプロパティ命名方法では、Text の値がユーザーに表示され、Value の値はコードを通じて制御されます。たとえば、DropDownList の Text プロパティにユーザーの名前を表示し、その Value プロパティにユーザーの番号を格納することができます。
以下のコードは、コントロールの基本的な使用法を示しています。
<html>
<頭>
<script language="C#" runat="server">
void Button1_Click(オブジェクト送信者、EventArgs e)
{
if (HiddenField1.Value == String.Empty)
HiddenField1.Value = "0";
HiddenField1.Value = (Convert.ToInt32(HiddenField1.Value)+1).ToString();
Label1.Text = HiddenField1.Value;
}
</script>
</head>
<本文>
<h3><font face="Verdana">隠しフィールド</font></h3>
<フォーム runat=サーバー>
<asp:HiddenField id=HiddenField1 runat=Server />
<asp:Button id=Button1 Text="ボタンをクリック" onclick="Button1_Click" runat="server" />
<asp:Label id=Label1 Text="0" runat=server /> 回クリックされました
</form>
</body>
</html>
上記のコードでは、 <asp:HiddenField id=HiddenField1 runat=Server /> は、ボタンのクリック イベントでのユーザーのクリック数をカウントし、変更の数を Label1 に割り当てる隠しコントロールを定義します。
上記のコード
の <asp:HiddenField id=HiddenField1 runat=Server /> を <input type=hidden id=HiddenField1 runat=Server> に変更することもできます。
ブラウザ コードは次の情報を取得します。
<form name="Form1" method="post" action="Default.aspx" id="Form1">
これは、HiddenField が HTTP プロトコルを通じてデータを送信するため、「method="get」またはリンクを通じて新しいフォーム ページを開いた場合、HiddenField は使用できません。
さらに、HiddenField はステータスを維持するために Session を置き換えるものではありません。ボタンを 1 回クリックしてクリック数を表示しても、ステータス情報を記録できるわけではありません。ブラウザを再度開いても、ここには 3 ではなく 0 が表示されます。
隠しフィールドイベント
より一般的に使用される HiddenField は、ValueChanged イベントです。これは、Value が変更されたときにトリガーされます。ただし、実際に使用する場合は、ページの記録順序を知っておく必要があります。ページのポストバック プロセス中に、次の Web サイトで特定のページ サイクルを確認できます。
http://msdn2.microsoft.com/zh-cn/library/ms178472.aspx
次の例は、この問題を示しています
<head>
<script runat="server" language="c#">
protected void Page_Load(オブジェクト送信者, EventArgs e)
{ Response.Write("<p>ページの Page_Load イベントがトリガーされ、トリガー時間は次のとおりです: " + DateTime.Now.ToString());
if (HiddenField1.Value == String.Empty)
HiddenField1.Value = "0"; }
protected void Button1_Click(object sender, EventArgs e)
{ Response.Write("<p>Button1_Click は Hidden の値を変更する前にトリガーされるイベントです。トリガー時間は次のとおりです: " + DateTime.Now .ToString( ));
HiddenField1.Value = (Convert.ToInt32(HiddenField1.Value) + 1).ToString();
Label1.Text = HiddenField1.Value;
}
protected void HiddenField1_ValueChanged(object sender, EventArgs e)
{ Response.Write("<p>HiddenField の ValueChanged イベントがトリガーされ、トリガー時間は次のとおりです: " + DateTime.Now.ToString()) ; }
</スクリプト>
</head>
<body>
<form id="form1" runat="server">
<div> <asp:HiddenField ID="HiddenField1" runat="server" OnValueChanged="HiddenField1_ValueChanged" />
</div> <asp :Label ID="Label1" runat="server" Text="Label"></asp:Label>
<br /> <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="ボタン" />
</form></body>
</html>
この例では、ユーザーがボタンをクリックすると、ボタンの Button1_Click イベントによって HiddenField1 の値が変更され、HiddenField1 の HiddenField1_ValueChanged イベントがトリガーされるという結果が得られます。
上記のコードを実行して結果を取得すると、ボタンがクリックされるたびに HiddenField の値が変更されますが、HiddenField1_ValueChanged で定義した出力は実行されません。この問題を理解するには、ページの宣言サイクル中に、コントロール プロパティが Page_Init で読み取られるか初期化されてから、コントロール イベントが発生することも理解する必要があります。
ここでのイベントは次のことを意味します。 Page_Init イベントでは、Web ページはユーザーから返されたデータを受け入れます。たとえば、ID Label1 の Text 属性に <span id="Label1">Label</span> を割り当て、<input> を割り当てます。 type ="hidden" name="HiddenField1" id="HiddenField1" value="0" /> の値が HiddenField1 の Value プロパティに割り当てられます。すべての初期化が完了すると、ページはコントロール イベント Button1_Click の実行を開始し、Button イベントの HiddenField の値を変更します。ここで Value が変更されているのに、ValueChanged イベントが実行されないのはなぜでしょうか。
このとき、ここではValueの値が変更されていますが、Page_Initに保存されています。これは、Buttonボタンをクリックすると、HiddenFieldは変更されますが、ページの応答も再度トリガーされるためです。前回の HiddenValue 値は 0 で、今回の値は 1 に変更されます。ただし、ページがポストバックされた後、ViewState は最後のインストール (ここでは 1) を保存するため、Page_Init では HiddenField の初期値が考慮されます。が 1 になり、今回は時間が 1 のままであるため、データが変更されていないように感じられます。そのため、ValueChanged イベントはまだトリガーされません。
もちろん、HiddenField の処理を無効にすることも、ValueChanged を実行することもできます。イベントが発生しますが、実際には、ViewState を無効にすると、ページは ViewState の値を保存しなくなります。そのため、ページは、次のコードのように、HiddenField に対する各リクエストが新しいものであると認識します。
Hiddenfield 値を変更していないにもかかわらず、毎回実行されます。
<%@ ページ EnableViewState="false" %>
<頭>
<script runat="server" language="c#">
protected void Page_Load(object sender, EventArgs e)
{
if (HiddenField1.Value == String.Empty)
HiddenField1.Value = "111"
;
protected void Button1_Click(object sender, EventArgs e)
{ // HiddenField1.Value = (Convert.ToInt32(HiddenField1.Value) + 1).ToString();
Label1.Text = TextBox1.Text; }
protected void HiddenField1_ValueChanged(object sender, EventArgs e)
{ Response.Write("Changed." + DateTime.Now.ToString());
Response.Write(HiddenField1.Value);
Response.Write(TextBox1.Text) }
</script>
</head>
<body>
<form id="form1" runat="server"> <div>
<asp:HiddenField ID="HiddenField1" runat="server" OnValueChanged="HiddenField1_ValueChanged" />
</div>
<asp:Label ID= "Label1" runat="server" Text="Label"></asp:Label>
<br />
<asp:TextBox runat=server ID=TextBox1></asp:TextBox>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
</form>
</body >
</html>
HiddenFile と ASP.NET2.0 が提供する「Cross Page」ページを組み合わせることで、ページ データの転送を実現できます。
登録ページでは、ユーザーは備考欄に大量のデータを入力する必要があるため、FreeTextBox と同様のコントロールを新しいウィンドウで使用して、入力後にテキストをフォーマットできます。完了したら、元の登録ページに戻ります。この様子については、また後ほどご紹介させていただきます