عنصر التحكم HiddenField، كما يوحي اسمه، هو عنصر تحكم الخادم الذي يخفي مربعات الإدخال، فهو يسمح لك بحفظ البيانات التي لا تحتاج إلى عرضها على الصفحة ولا تتطلب إجراءات أمنية مشددة. ربما يجب أن يكون هناك سؤال في هذا الوقت، لماذا لا نزال بحاجة إلى استخدام HiddenField عندما يكون لدينا آليات حفظ الحالة مثل ViewState وSession وCookie؟
الغرض من إضافة HiddenField هو جعل تطبيق آلية إدارة الحالة بأكملها أكثر شمولاً. لأنه سواء كان ViewState أو ملف تعريف الارتباط أو الجلسة، سيكون هناك وقت تنتهي فيه صلاحيته، على سبيل المثال، يحتاج المستخدم إلى ضبط ViewState على false بسبب احتياجات معينة، أو أن الظروف البيئية تقيد استخدام ملف تعريف الارتباط، أو أن المستخدم كان غير نشط. لفترة طويلة مما يتسبب في انتهاء صلاحية الجلسة، وما إلى ذلك. في هذا الوقت، يعد HiddenField بلا شك الخيار الأفضل.
وظيفة التحكم HiddenField هي ببساطة تخزين القيم التي يجب الحفاظ عليها بين الإرسال إلى الخادم. يتم تقديمه كعنصر <input type="hidden"/>، ويمكن تحويله إلى عنصر تحكم خادم HTML قياسي عن طريق إضافة runat="server". فيما يلي قائمة بالخصائص والأحداث المتاحة لعنصر تحكم خادم الويب ASP.NET HiddenField.
<asp:المخفي
EnableTheming = "صحيح | خطأ"
إنابليفيوستات = "صحيح|خطأ"
معرف = "سلسلة"
OnDataBinding = "معالج حدث DataBinding"
OnDispose = "معالج الحدث الذي تم التخلص منه"
OnInit = "معالج الأحداث الأولية"
OnLoad = "تحميل معالج الحدث"
OnPreRender="معالج الأحداث PreRender"
OnUnload = "إلغاء تحميل معالج الأحداث"
OnValueChanged = "معالج الأحداث ValueChanged"
رونات = "الخادم"
معرف الجلد = "سلسلة"
القيمة = "سلسلة"
مرئي = "صحيح|خطأ"
/>
نظرًا لأن قيمة HiddenField سيتم عرضها في متصفح العميل، فهي غير مناسبة لتخزين القيم الحساسة للأمان. لتحديد قيمة لعنصر التحكم HiddenField، استخدم خاصية القيمة. لاحظ أنها قيمة وليست نصًا. في الواقع، لا يحتوي HiddenField على خاصية نص، وهو ما يتوافق مع خاصية تسمية الأزرار القياسية مثل DropDownList وCheckBoxList. في طريقة تسمية الخاصية القياسية، يتم تقديم قيمة النص للمستخدم، بينما يتم التحكم في قيمة القيمة من خلال الكود. على سبيل المثال، يمكنك جعل خاصية النص الخاصة بـ DropDownList تعرض اسم المستخدم وتخزن قيمتها رقم المستخدم.
يوضح الكود أدناه الاستخدام الأساسي لعنصر التحكم.
<أتش تي أم أل>
<الرأس>
<لغة البرمجة = "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;
}
</script>
</الرأس>
<الجسم>
<h3><fontface="Verdana">الحقل المخفي</font></h3>
<نموذج تشغيل = الخادم>
<asp:HiddenField id=HiddenField1 runat=Server />
<asp:Button id=Button1 Text="انقر على الزر" onclick="Button1_Click" runat="server" />
تم النقر فوق <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" طريقة = "post" action = "Default.aspx" id = "Form1">
وذلك لأن HiddenField ينقل البيانات عبر بروتوكول HTTP، لذا إذا قمت بفتح صفحة نموذج جديدة من خلال "method="get" أو رابط، فلن يكون HiddenField متاحًا.
بالإضافة إلى ذلك، لا يحل HiddenField محل الجلسة للحفاظ على الحالة. في المثال أعلاه، على الرغم من النقر فوق الزر مرة واحدة لعرض عدد النقرات، إلا أن هذا لا يعني أنه يمكنه تسجيل معلومات الحالة الخاصة بك. إذا قمت بإعادة فتح المتصفح، فستظل ترى 0 هنا بدلاً من 3.
حدث "الحقل المخفي".
إن HiddenField الأكثر استخدامًا هو حدث ValueChanged، والذي يتم تشغيله عندما تتغير القيمة. ومع ذلك، في الاستخدام الفعلي، يجب أن تعرف ترتيب تسجيل الصفحة. أثناء عملية إعادة النشر للصفحة، يمكنك التحقق من دورة الصفحة المحددة على موقع الويب التالي
http://msdn2.microsoft.com/zh-cn/library/ms178472.aspx
يوضح المثال التالي هذه المشكلة
<head>
<script runat="server" language="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(object sender, EventArgs e)
{ Response.Write("<p>تم تشغيل حدث ValueChanged لـ HiddenField، ووقت التشغيل هو: " + DateTime.Now.ToString()) }
</script>
</head>
<body>
<form id="form1" runat="server">
<div> <asp:HiddenField ID="HiddenField1" runat="server" OnValueChanged="HiddenField1_ValueChanged" />
</div> <asp :معرف التسمية = "Label1" runat = "server" Text = "التسمية" ></asp:Label>
<br /> <asp:Button ID = "Button1" runat = "server" OnClick = "Button1_Click" Text = " الزر" />
</form></body>
</html>
في هذا المثال، النتيجة التي نريدها هي: عندما ينقر المستخدم على الزر، يتم تغيير قيمة HiddenField1 من خلال حدث Button1_Click للزر، ثم يتم تشغيل حدث HiddenField1_ValueChanged لـ HiddenField1. ومع ذلك، هل هذا هو الحال بالفعل؟
قم بتشغيل الكود أعلاه واحصل على النتيجة، كما ترون، يقوم الزر بتغيير قيمة HiddenField في كل مرة يتم النقر عليها، ولكن لا يتم تنفيذ الإخراج الذي حددناه في HiddenField1_ValueChanged حدث ValueChanged لفهم هذه المشكلة، تحتاج أيضًا إلى فهم دورة الإعلان الخاصة بالصفحة، أثناء دورة الصفحة، يمكنك أن ترى أن خصائص التحكم تمت قراءتها أو تهيئتها في Page_Init، ثم أحداث التحكم.
الحدث هنا يعني: في حدث Page_Init، ستقبل صفحة الويب البيانات التي يعرضها المستخدم، على سبيل المثال، قم بتعيين <span id="Label1">تسمية</span> إلى سمة النص ذات معرف Label1، و<input اكتب قيمة = "hidden" name = "HiddenField1" id = "HiddenField1" value = "0" /> تم تعيينها لخاصية القيمة HiddenField1. بعد اكتمال عملية التهيئة، تبدأ الصفحة في تنفيذ حدث التحكم - Button1_Click، وتغيير قيمة HiddenField في حدث الزر. إذن بما أن القيمة قد تغيرت هنا، فلماذا لم يتم تنفيذ حدث ValueChanged؟
في هذا الوقت، على الرغم من تغيير قيمة القيمة هنا، يتم حفظها في Page_Init. وذلك لأنه عند النقر على زر الزر، على الرغم من تغيير HiddenField، يتم أيضًا تشغيل رد الصفحة مرة أخرى، أي على الرغم من أن القيمة المخفية السابقة هي 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);
TextBox1.Text
);
</الرأس>
<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 مع صفحة "Cross Page" التي يوفرها ASP.NET2.0 إلى نقل بيانات الصفحة. هذا الموقف ينطبق على هذا الحل:
في صفحة التسجيل، يحتاج المستخدم إلى إدخال البيانات نظرًا لاحتمال وجود الكثير من البيانات في عمود الملاحظات، يمكن استخدام عنصر تحكم مشابه لـ FreeTextBox في نافذة جديدة للسماح للمستخدم بتنسيق النص، وبعد الإدخال. اكتمل، قم بالعودة إلى صفحة التسجيل الأصلية. وفيما يتعلق بهذا الوضع، سوف نقدمه لاحقا