ตัวควบคุม HiddenField ตามชื่อคือตัวควบคุมเซิร์ฟเวอร์ที่ซ่อนกล่องอินพุต ช่วยให้คุณสามารถบันทึกข้อมูลที่ไม่จำเป็นต้องแสดงบนเพจและไม่ต้องการความปลอดภัยสูง บางทีตอนนี้อาจจะมีคำถามว่าทำไมเรายังต้องใช้ HiddenField ในเมื่อเรามีกลไกการบันทึกสถานะ เช่น ViewState, Session และ Cookie?
วัตถุประสงค์ของการเพิ่ม HiddenField คือการทำให้การประยุกต์ใช้กลไกการจัดการสถานะทั้งหมดมีความครอบคลุมมากขึ้น เพราะไม่ว่าจะเป็น ViewState, Cookie หรือ Session ก็จะมีช่วงเวลาที่หมดอายุ เช่น ผู้ใช้ต้องตั้งค่า ViewState เป็น false เนื่องจากความต้องการบางอย่าง หรือสภาพแวดล้อมที่จำกัดการใช้ Cookie หรือผู้ใช้ไม่ได้ใช้งาน เป็นเวลานานทำให้เซสชันหมดอายุ ฯลฯ ในเวลานี้ HiddenField เป็นตัวเลือกที่ดีที่สุดอย่างไม่ต้องสงสัย
ฟังก์ชั่นของตัวควบคุม HiddenField เป็นเพียงการเก็บค่าที่ต้องรักษาไว้ระหว่างการส่งไปยังเซิร์ฟเวอร์ มันถูกแสดงผลเป็นองค์ประกอบ <input type="hidden"/> และสามารถทำให้เป็นตัวควบคุมเซิร์ฟเวอร์ HTML มาตรฐานโดยการเพิ่ม runat="server" รายการด้านล่างนี้คือคุณสมบัติและเหตุการณ์ที่พร้อมใช้งานสำหรับการควบคุมเซิร์ฟเวอร์เว็บ ASP.NET HiddenField
<asp:HiddenField
EnableTheming = "จริง|เท็จ"
EnableViewState = "จริง|เท็จ"
รหัส = "สตริง"
OnDataBinding = "ตัวจัดการเหตุการณ์ DataBinding"
OnDisposed = "ตัวจัดการเหตุการณ์ที่ถูกกำจัด"
OnInit = "ตัวจัดการเหตุการณ์ Init"
OnLoad = "ตัวจัดการเหตุการณ์โหลด"
OnPreRender="ตัวจัดการเหตุการณ์ PreRender"
OnUnload = "ยกเลิกการโหลดตัวจัดการเหตุการณ์"
OnValueChanged = "ตัวจัดการเหตุการณ์ ValueChanged"
runat = "เซิร์ฟเวอร์"
SkinID="สตริง"
ค่า = "สตริง"
มองเห็นได้ = "จริง|เท็จ"
/>
เนื่องจากค่าของ HiddenField จะถูกเรนเดอร์ไปยังเบราว์เซอร์ไคลเอ็นต์ จึงไม่เหมาะสำหรับการจัดเก็บค่าที่ละเอียดอ่อนด้านความปลอดภัย เมื่อต้องการระบุค่าสำหรับตัวควบคุม HiddenField ให้ใช้คุณสมบัติ Value โปรดทราบว่าเป็นค่า ไม่ใช่ Text ในความเป็นจริง HiddenField ไม่มีคุณสมบัติ Text ซึ่งสอดคล้องกับการตั้งชื่อคุณสมบัติของปุ่มมาตรฐาน เช่น DropDownList และ CheckBoxList ในวิธีการตั้งชื่อคุณสมบัติมาตรฐาน ค่าของ Text จะถูกนำเสนอต่อผู้ใช้ ในขณะที่ค่าของ Value จะถูกควบคุมผ่านโค้ด ตัวอย่างเช่น คุณสามารถให้คุณสมบัติข้อความของ DropDownList แสดงชื่อผู้ใช้และค่าของคุณสมบัติจะเก็บหมายเลขของผู้ใช้
รหัสด้านล่างแสดงการใช้งานพื้นฐานของการควบคุม
<html>
<หัว>
<ภาษาสคริปต์ = "C #" runat = "เซิร์ฟเวอร์">
เป็นโมฆะ Button1_Click (ผู้ส่งวัตถุ EventArgs e)
-
ถ้า (HiddenField1.Value == String.Empty)
HiddenField1.Value = "0";
HiddenField1.Value = (Convert.ToInt32(HiddenField1.Value)+1).ToString();
Label1.Text = HiddenField1.Value;
-
</สคริปต์>
</หัว>
<ร่างกาย>
<h3><font face="Verdana">HiddenField</font></h3>
<ฟอร์ม runat=เซิร์ฟเวอร์>
<asp:HiddenField id=HiddenField1 runat=เซิร์ฟเวอร์ />
<asp:Button id=Button1 Text="คลิกปุ่ม" onclick="Button1_Click" runat="เซิร์ฟเวอร์" />
คลิก <asp:Label id=Label1 Text="0" runat=server /> ครั้ง
</แบบฟอร์ม>
</ร่างกาย>
</html>
ในโค้ดด้านบน <asp:HiddenField id=HiddenField1 runat=Server /> กำหนดการควบคุมที่ซ่อนอยู่ซึ่งนับจำนวนการคลิกของผู้ใช้ในเหตุการณ์การคลิกของปุ่ม และกำหนดจำนวนการเปลี่ยนแปลงให้กับ Label1
คุณสามารถเปลี่ยน <asp:HiddenField id=HiddenField1 runat=Server /> ในโค้ดด้านบนเป็น <input type=hidden id=HiddenField1 runat=Server> ได้
หากคุณดูแหล่งที่มาจาก เบราว์เซอร์ รหัสจะได้รับข้อมูลต่อไปนี้:
<ชื่อฟอร์ม = "Form1" method = "โพสต์" action = "Default.aspx" id = "Form1">
เนื่องจาก HiddenField ส่งข้อมูลผ่านโปรโตคอล HTTP ดังนั้นหากคุณเปิดหน้าแบบฟอร์มใหม่ผ่าน "method="get" หรือลิงก์ HiddenField จะไม่สามารถใช้งานได้
นอกจากนี้ HiddenField ไม่ได้แทนที่เซสชันเพื่อรักษาสถานะ ในตัวอย่างข้างต้น แม้ว่าคุณจะคลิกปุ่มหนึ่งครั้งเพื่อแสดงจำนวนคลิก แต่ก็ไม่ได้หมายความว่าจะสามารถบันทึกข้อมูลสถานะของคุณได้ หากคุณเปิดเบราว์เซอร์อีกครั้ง คุณจะยังคงเห็น 0 ที่นี่แทนที่จะเป็น 3
เหตุการณ์ HiddenField
HiddenField ที่ใช้กันทั่วไปมากกว่าคือเหตุการณ์ ValueChanged ซึ่งจะถูกทริกเกอร์เมื่อค่าเปลี่ยนแปลง แต่ในการใช้งานจริงต้องรู้ลำดับการบันทึกหน้าด้วย ในระหว่างกระบวนการ postback ของเพจ คุณสามารถตรวจสอบรอบของเพจที่ต้องการได้บนเว็บไซต์ต่อไปนี้
http://msdn2.microsoft.com/zh-cn/library/ms178472.aspx
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงปัญหานี้
<head>
<สคริปต์ runat = "เซิร์ฟเวอร์" ภาษา = "c #">
โมฆะที่ได้รับการป้องกัน Page_Load (ผู้ส่งวัตถุ EventArgs e)
{ Response.Write("<p>เหตุการณ์ Page_Load ของเพจถูกทริกเกอร์ และเวลาทริกเกอร์คือ: " + DateTime.Now.ToString());
ถ้า (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(ผู้ส่งอ็อบเจ็กต์, EventArgs e)
{ Response.Write("<p>HiddenField's ValueChanged event is triggered and the trigger time is: " + 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>
ในตัวอย่างนี้ ผลลัพธ์ที่เราต้องการคือ: เมื่อผู้ใช้คลิกปุ่ม ค่าของ HiddenField1 จะถูกเปลี่ยนผ่านเหตุการณ์ Button1_Click ของปุ่ม จากนั้นเหตุการณ์ HiddenField1_ValueChanged ของ HiddenField1 จะถูกทริกเกอร์ อย่างไรก็ตาม เป็นกรณีนี้จริงๆ หรือไม่
เรียกใช้โค้ดด้านบนและรับผลลัพธ์ อย่างที่คุณเห็น Button จะเปลี่ยนค่าของ HiddenField ทุกครั้งที่มีการคลิก แต่เอาต์พุตที่เรากำหนดไว้ใน HiddenField1_ValueChanged จะไม่ถูกดำเนินการ กล่าวอีกนัยหนึ่ง เพจจะไม่ดำเนินการ เหตุการณ์ ValueChanged เพื่อให้เข้าใจถึงปัญหานี้ คุณยังต้องเข้าใจรอบการประกาศของเพจอีกด้วย ในระหว่างรอบเพจ คุณจะเห็นว่าคุณสมบัติการควบคุมถูกอ่านหรือเตรียมใช้งานใน Page_Init แล้วตามด้วยเหตุการณ์การควบคุม
เหตุการณ์ในที่นี้หมายถึง: ในเหตุการณ์ Page_Init หน้าเว็บจะยอมรับข้อมูลที่ผู้ใช้ส่งคืน เช่น กำหนด <span id="Label1">Label</span> ให้กับแอตทริบิวต์ Text ด้วย ID Label1 และ <input type ค่าของ ="hidden" name="HiddenField1" id="HiddenField1" value="0" /> ถูกกำหนดให้กับคุณสมบัติ Value ของ HiddenField1 หลังจากการกำหนดค่าเริ่มต้นทั้งหมดเสร็จสิ้น เพจจะเริ่มดำเนินการเหตุการณ์การควบคุม - Button1_Click และเปลี่ยนค่าของ 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 = "เซิร์ฟเวอร์" language = "c #">
โมฆะที่ได้รับการป้องกัน Page_Load (ผู้ส่งวัตถุ EventArgs e)
{
ถ้า (HiddenField1.Value == String.Empty)
HiddenField1.Value = "111"
;
โมฆะที่ได้รับการป้องกัน Button1_Click (ผู้ส่งวัตถุ EventArgs e)
{ // HiddenField1.Value = (Convert.ToInt32 (HiddenField1.Value) + 1).ToString ();
Label1.Text = TextBox1.Text; }
โมฆะที่ได้รับการป้องกัน HiddenField1_ValueChanged (ผู้ส่งวัตถุ EventArgs e)
{ Response.Write ("เปลี่ยน" + DateTime.Now.ToString ());
Response.Write (HiddenField1.Value);
Response.Write(TextBox1.Text); }
</script>
</หัว>
<body>
<form id="form1" runat="server"> <div>
<asp:HiddenField ID="HiddenField1" runat="server" OnValueChanged="HiddenField1_ValueChanged" />
</div>
<asp:Label ID= "Label1" runat="เซิร์ฟเวอร์" 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 ร่วมกับเพจ "Cross Page" ที่ได้รับจาก ASP.NET2.0 สามารถรับรู้ถึงการถ่ายโอนข้อมูลเพจ สถานการณ์นี้มีไว้สำหรับวิธีแก้ปัญหาดังกล่าว:
ในหน้าการลงทะเบียน ผู้ใช้จำเป็นต้องป้อนข้อมูล เนื่องจากอาจมีข้อมูลจำนวนมากในคอลัมน์หมายเหตุ จึงสามารถใช้ตัวควบคุมที่คล้ายกับ FreeTextBox ในหน้าต่างใหม่เพื่อให้ผู้ใช้สามารถจัดรูปแบบข้อความและหลังการป้อนข้อมูลได้ เสร็จแล้วกลับสู่หน้าลงทะเบียนเดิม เกี่ยวกับสถานการณ์นี้เราจะแนะนำในภายหลัง