بروتوكول نقل النص التشعبي (HTTP) هو بروتوكول عديم الحالة. عندما ينقطع اتصال العميل بالخادم، يتجاهل محرك ASP.NET كائن الصفحة. بهذه الطريقة، يمكن لكل تطبيق ويب التوسع لخدمة عدد كبير من الطلبات في وقت واحد دون استنفاد ذاكرة الخادم.
ومع ذلك، هناك حاجة إلى بعض التقنيات لتخزين المعلومات بين الطلبات واسترجاعها عند الحاجة. تسمى هذه المعلومات بالحالة، وهي القيم الحالية لجميع عناصر التحكم والمتغيرات التي يستخدمها المستخدم الحالي في الجلسة الحالية.
يدير ASP.NET أربع حالات:
عرض الحالة
حالة السيطرة
حالة الجلسة
حالة التطبيق
حالة العرض هي حالة الصفحة وجميع عناصر التحكم فيها. ويظل دون تغيير من خلال ملاحظات إطار عمل ASP.NET.
عند إرسال صفحة مرة أخرى إلى العميل، يتم تحديد خصائص وعناصر التحكم الخاصة بتغييرات الصفحة هذه وتخزينها في قيمة حقل إدخال مخفي يسمى _VIEWSTATE. عند إعادة نشر الصفحة مرة أخرى، يتم إرسال حقل _VIEWSTATE إلى الخادم مع طلب HTTP.
يمكن تمكين حالة العرض أو تعطيلها من أجل:
التطبيق بالكامل : قم بتعيين خاصية EnableViewState للقسم في ملف web.config.
صفحة : قم بتعيين خاصية EnableViewState لأمر الصفحة على <%@ Page Language="C#" EnableViewState="false" %>
عنصر تحكم : قم بتعيين خاصية control.EnableViewState.
يقوم بذلك عن طريق استخدام كائن حالة العرض، والذي يتم تعريفه بواسطة فئة StateBag المحددة بواسطة مجموعة من عناصر حالة العرض. StateBag عبارة عن بنية بيانات تحتوي على أزواج قيمة الخاصية ويتم تخزينها كسلسلة مرتبطة بكائن.
تحتوي فئة StateBag على الخصائص التالية:
ملكية | يصف |
---|---|
العنصر (الاسم) | قيمة حالة العرض بالاسم المحدد، وهي الخاصية الافتراضية لـ StateBag. |
عدد | اسم العنصر في مجموعة الحالة. |
مفاتيح | مجموعة من المفاتيح لجميع العناصر الموجودة في المجموعة. |
قيم | مجموعة القيم لجميع العناصر الموجودة في المجموعة. |
تحتوي فئة StateBag على الطرق التالية:
طريقة | يصف |
---|---|
إضافة (الاسم، القيمة) | إضافة عنصر إلى مجموعة حالة العرض، وتحديث العناصر الموجودة. |
واضح | يزيل كافة العناصر من المجموعة. |
يساوي (كائن) | تحديد ما إذا كان الكائن المحدد يساوي الكائن الحالي. |
وضع اللمسات الأخيرة | يسمح بتحرير الموارد وتنفيذ عمليات التنظيف الأخرى. |
GetEnumerator | تُرجع عدادًا لأزواج المفاتيح/القيمات لكائنات StateItem المكررة المخزنة في كائن StateBag. |
GetType | احصل على نوع المثيل الحالي. |
IsItemDirty | تحقق من الكائن المخزن في StateBag للتأكد مما إذا كان قد تم تعديله أم لا. |
إزالة (الاسم) | إزالة العناصر المخصصة. |
SetDirty | يضبط حالة كائن StateBag والخاصية Dirty لكل كائن StateItem موجود. |
SetItemDirty | يقوم بتعيين الخاصية Dirty لكائن StateItem المحدد في كائن StateBag. |
ToString | تقوم بإرجاع سلسلة تمثل كائن حزمة الحالة. |
يوضح المثال التالي مفهوم السلاسل التي تخزن حالة العرض.
لنحتفظ بعداد يمكن زيادته في كل مرة يتم فيها استدعاء الصفحة مرة أخرى عن طريق النقر على زر في الصفحة. يعرض عنصر التحكم في التسمية قيمة العداد.
يبدو رمز ملف العلامة كما يلي:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="statedemo._Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Untitled Page </title> </head> <body> <form id="form1" runat="server"> <div> <h3>View State demo</h3> Page Counter: <asp:Label ID="lblCounter" runat="server" /> <asp:Button ID="btnIncrement" runat="server" Text="Add Count" onclick="btnIncrement_Click" /> </div> </form> </body></html>
يبدو ملف الكود الخلفي لهذا المثيل كما يلي:
public partial class _Default : System.Web.UI.Page{ public int counter { get { if (ViewState["pcounter"] != null) { return ((int)ViewState["pcounter"]); } else { return 0; } } set { ViewState["pcounter"] = value; } } protected void Page_Load(object sender, EventArgs e) { lblCounter.Text = counter.ToString(); counter++; }}
وسوف تنتج النتائج التالية:
لا يمكن تعديل حالة التحكم أو الوصول إليها أو تعطيلها بشكل مباشر.
عندما يتصل مستخدم بموقع ويب ASP.NET، يتم إنشاء كائن جلسة جديد. عند تمكين حالة الجلسة، يتم إنشاء حالة جلسة جديدة لكل طلب جديد. يصبح كائن حالة الجلسة هذا جزءًا من بيئة وقت التشغيل ويكون متاحًا من خلال الصفحة.
تُستخدم حالة الجلسة عادةً لتخزين بيانات التطبيق مثل المخزون أو قوائم الموردين أو سجلات العملاء أو عربات التسوق. يمكنه تخزين معلومات المستخدم ومعلومات تفضيلاته، وحفظ مسارات المستخدم المترددة.
يتم تحديد الجلسات وتتبعها بواسطة معرف جلسة 120 بت، ويتم تمريره من العميل إلى الخادم ويتم إرجاعه كملف تعريف ارتباط أو عنوان URL معدل. معرف الجلسة فريد وعشوائي عالميًا.
يتم إنشاء كائنات حالة الجلسة بواسطة فئة HttpSessionState، والتي تحدد مجموعة من عناصر حالة الجلسة.
تحتوي فئة HttpSessionState على الخصائص التالية:
ملكية | يصف |
---|---|
معرف الجلسة | معرف الجلسة الفريد |
العنصر (الاسم) | قيمة عنصر حالة الجلسة بالاسم المحدد، وهي الخاصية الافتراضية لفئة HttpSessionState. |
عدد | عدد العناصر الموجودة في مجموعة حالة الجلسة. |
نفذ الوقت | الحصول على مقدار الوقت المسموح به بين الطلبات وتعيينه، بالدقائق، قبل أن يوقف الموفر حالة الجلسة. |
تحتوي فئة HttpSessionState على الطرق التالية:
طريقة | يصف |
---|---|
إضافة (الاسم، القيمة) | يضيف عناصر جديدة إلى مجموعة حالة الجلسة. |
واضح | إزالة كافة العناصر من مجموعة حالة الجلسة. |
إزالة (الاسم) | إزالة العنصر المحدد من مجموعة حالة الجلسة. |
إزالة الكل | يزيل كافة المفاتيح والقيم من مجموعة حالة الجلسة. |
إزالة في | إزالة العنصر الموجود في الفهرس المحدد من مجموعة حالة الجلسة. |
كائن حالة الجلسة هو زوج من الاسم والقيمة يمكنه تخزين واسترجاع المعلومات من كائن حالة الجلسة. وبالمثل، يمكنك استخدام الكود التالي:
void StoreSessionInfo(){ String fromuser = TextBox1.Text; Session["fromuser"] = fromuser;}void RetrieveSessionInfo(){ String fromuser = Session["fromuser"]; Label1.Text = fromuser;}
يقوم الكود أعلاه بتخزين السلاسل فقط في كائن قاموس الجلسة، ومع ذلك، يمكنه تخزين جميع أنواع البيانات الأولية والمصفوفات المكونة من أنواع البيانات الأولية، وكائنات DataSet، وDataTable، وHashTable، وImage، بالإضافة إلى أي كائنات محددة من قبل المستخدم ترث من كائنات قابلة للتسلسل.
يوضح المثال التالي مفهوم تخزين حالة الجلسة. يوجد زرين على الصفحة: زر مربع نص لإدخال سلسلة وزر تسمية لعرض النص المخزن من الجلسة الأخيرة. يبدو رمز ملف العلامة كما يلي:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Untitled Page </title> </head> <body> <form id="form1" runat="server"> <div> <table> <tr> <td> <asp:Label ID="lblstr" runat="server" Text="Enter a String" > </asp:Label> </td> <td> <asp:TextBox ID="txtstr" runat="server"> </asp:TextBox> </td> </tr> <tr> <td> </td> <td> </td> </tr> <tr> <td> <asp:Button ID="btnnrm" runat="server" Text="No action button" /> </td> <td> <asp:Button ID="btnstr" runat="server" OnClick="btnstr_Click" Text="Submit the String" /> </td> </tr> <tr> <td> </td> <td> </td> </tr> <tr> <td> <asp:Label ID="lblsession" runat="server" > </asp:Label> </td> <td> </td> </tr> <tr> <td> <asp:Label ID="lblshstr" runat="server"> </asp:Label> </td> <td> </td> </tr> </table> </div> </form> </body></html>
يجب أن يبدو هكذا في عرض التصميم:
رمز الخلفية هو كما يلي:
public partial class _Default : System.Web.UI.Page { String mystr; protected void Page_Load(object sender, EventArgs e) { this.lblshstr.Text = this.mystr; this.lblsession.Text = (String)this.Session["str"]; } protected void btnstr_Click(object sender, EventArgs e) { this.mystr = this.txtstr.Text; this.Session["str"] = this.txtstr.Text; this.lblshstr.Text = this.mystr; this.lblsession.Text = (String)this.Session["str"]; }}
قم بتشغيل الملف وشاهد كيف يعمل:
تطبيق ASP.NET عبارة عن مجموعة من كافة صفحات الويب والتعليمات البرمجية والملفات الأخرى في دليل ظاهري واحد على خادم ويب. عندما يتم تخزين المعلومات في حالة التطبيق، تكون متاحة لجميع المستخدمين.
لتوفير استخدام حالة التطبيق، يقوم ASP.NET بإنشاء كائن حالة تطبيق لكل تطبيق من فئة HttpApplicationState ويخزن الكائن في ذاكرة الخادم. يتم تمثيل هذا الكائن بواسطة ملف الفئة global.asax.
تُستخدم حالة التطبيق بشكل أساسي لتخزين العدادات والإحصائيات الأخرى وكافة بيانات التطبيق مثل معدلات الضرائب ومعدلات الخصم، ولتخزين مسار المستخدم إلى موقع الويب.
تحتوي فئة HttpApplicationState على الخصائص التالية:
ملكية | يصف |
---|---|
العنصر (الاسم) | قيمة إدخال التطبيق بالاسم المحدد، وهي الخاصية الافتراضية لـ HttpApplicationState. |
عدد | عدد العناصر في مجموعة حالة التطبيق. |
تحتوي فئة HttpApplicationState على الطرق التالية:
طريقة | يصف |
---|---|
إضافة (الاسم، القيمة) | يضيف عناصر جديدة إلى مجموعة حالة التطبيق. |
واضح | يزيل كافة العناصر من مجموعة حالة التطبيق. |
إزالة (الاسم) | إزالة العنصر المحدد من مجموعة حالة التطبيق. |
إزالة الكل | إزالة كافة الكائنات الموجودة في مجموعة HttpApplicationState. |
إزالة في | إزالة كائن HttpApplicationState من المجموعة التي عثر عليها بواسطة الفهرس. |
قفل() | قم بقفل مجموعة حالة التطبيق بحيث يتمكن المستخدم الحالي فقط من الوصول إليها. |
فتح() | قم بإلغاء قفل مجموعة حالة التطبيق حتى يتمكن جميع المستخدمين من الوصول إليها. |
عادةً ما يتم الاحتفاظ ببيانات حالة التطبيق بواسطة معالجات مكتوبة للأحداث:
يفتح التطبيق
ينتهي التطبيق
خطأ في التطبيق
تبدأ الجلسة
انتهت الجلسة
يعرض مقتطف التعليمات البرمجية التالي البنية الأساسية لتخزين معلومات حالة التطبيق:
Void Application_Start(object sender, EventArgs e){ Application["startMessage"] = "The application has started.";}Void Application_End(object sender, EventArgs e){ Application["endtMessage"] = "The application has ended.";}