تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
الدرس السادس والسبعون - ASP.net - الجزء الثالث
#1
كاتب الموضوع : أحمد جمال

بسم الله الرحمن الرحيم .
السلام عليكم ورحمة الله وبركاته .


State Management :

لعلك ومن خلال تجاربك في تطوير Stand alone Application تدرك انك وقت تعريفك لمتغير ما فسيظل هذا المتغير محتفظاً بقيمته حتى انهاء البرنامج أو الخروج خارج ال Scope الخاص بهذا المتغير ، إلا أن هذا الوضع مختلف تماماً في ASP.net حيث ستضيع قيم المتغيرات مع أول تعديل ، لذا كان من اللازم عليك أن تقوم بتخزين متغيراتك وقيم بحيث يمكنك استرجاعها ، وهو ما سنتعرف على بعض تقنياته في هذا الدرس .

يمكنك تخزين القيم بواحدة من ستة طرق اساسية :

- View state .
- Control state .
- Application-Level Variables
- Cache .
- Session .
- Cookies .


وسنتعرف عليها خلال هذا الدرس إن شاء الله .
}}}
تم الشكر بواسطة:
#2
Control state :

هي الطريقة الأسهل للاحتفاظ بالبيانات ، كل ما عليك هو تغيير القيمة EnableViewState لأي أداة حتى ولو للصفحة ككل ، في هذه الحالة القيم الموجودة في أي من أدواتك لن تتأثر وستظل محتفظة بقيمتها حتى اغلاق الصفحة .

لو فتحت ال HTML الناتج عن المتصفح لصفحة تستخدم View State ستجد الجزء التالي حيث يحتفظ ال ViewState بقيمته .

كود :
[color=#ff8000]<input type=[COLOR=#0000ff]"hidden"[/color] name=[color=#0000ff]"__VIEWSTATE"[/color] id=[color=#0000ff]"__VIEWSTATE"[/color] value=[color=#0000ff]"/wEPDwUKMTIxNDIyOTM0Mg9kFgICAw9kFgICAQ8PFgIeBFRleHQFBWFobWVkZGRkCq8FGqyXBP0pBDpvdnycvM5zSQE="[/color] />[/COLOR]
خطأ شائع :
أحياناً ما تحتاج لإن تقوم بملء محتويات قائمة لديك في حدث ال Form_Load ، اغلب الناس تستخدم الاسلوب التالي :
C#:

كود :
ListBox1.Items.Add("Ahmed");
ListBox1.Items.Add("Mohammed");
ListBox1.Items.Add("Ali");
vb.net:

كود :
ListBox1.Items.Add("Ahmed")
ListBox1.Items.Add("Mohammed")
ListBox1.Items.Add("Ali")
في الواقع هذه الطريقة متعبة جداً ، خصوصاً لو كان ملء القائمة يتم من خلال قاعدة البيانات !!!

الحل البديل ، هو الاعتماد على خاصية EnableViewState ، واستخدام الخاصية IsPostBack للتأكد من أننا نقوم بملأها في المرة الأولى فقط بالشكل التالي :

C#:

كود :
if (!IsPostBack)
{
ListBox1.Items.Add("Ahmed");
ListBox1.Items.Add("Mohammed");
ListBox1.Items.Add("Ali");
}
vb.net:

كود :
If Not IsPostBack Then
ListBox1.Items.Add("Ahmed")
ListBox1.Items.Add("Mohammed")
ListBox1.Items.Add("Ali")
End If
}}}
تم الشكر بواسطة:
#3
View state :

طريقة أخرى تعتمد على نفس المفهوم ولكن بعيداً عن الأدوات ، حيث يمكنك مثلاً كتابة الكود التالي لتخزين قيمة ما بنفس الطريقة :
C#:

كود :
ViewState["CustomViewStateItem"] = "Ahmed";
vb.net:

كود :
ViewState("CustomViewStateItem") = "Ahmed"
ولاستعادته :
C#:

كود :
Label1.Text = (string)ViewState["CustomViewStateItem"];
vb.net:

كود :
Label1.Text = DirectCast(ViewState("CustomViewStateItem"), String)
}}}
تم الشكر بواسطة:
#4
Session :
طريقة سهلة التعامل جداً ، وبنفس طريقة View State السابقة مع اختلاف التكنيك فقط ، للكتابة :

C#:

كود :
Session["mySession"] = "Ahmed";
vb.net:

كود :
Session("mySession") = "Ahmed"
والاستعادة :
C#:

كود :
string name = (string) Session["mySession"];
vb.net:

كود :
Dim name As String = DirectCast(Session("mySession"), String)
يمكنك عمل Remove لأي Session بالشكل التالي :
C#:

كود :
Session.Remove["mySession"];
vb.net:

كود :
Session.Remove("mySession")
كما أن هناك خاصية Timeout والتي تحدد فترة احتفاظ ال Session بقيمته بالدقائق ، وافتراضياً هي 20 دقيقة :


كود :
Session.Timeout = 5
}}}
تم الشكر بواسطة:
#5
Cookies :

طريقة أخرى من وسائل الاحتفاظ بالقيم ولكن عند جهاز العميل ، حيث يتم الاحتفاظ بهذه القيم في ملفات نصية ( في اغلب الاحيان ) ولكن ينبغي مراعاة ان يكون متصفح العميل يسمح بمثل هذه العملية ، وهي الطريقة الأكثر شهرة في الاحتفاظ بمعلومات الدخول والتسجيل في المواقع المختلفة .
وهي مشتقة من الفئة System.Web.HttpCookie .

سنجرب الآن مثالاً على الكوكيز ، حيث سنقوم بتسجيل اختيار المستخدم من الألوان - اللون الاخضر أو الأحمر مثلاً -، ومع كل تشغيل للموقع في حالة وجود كوكيز يتم استخدام اللون المفضل ، وإلا يتم اللجوء للون الافتراضي وهو الأصفر مثلاً .

سنقوم برسم الصفحة اولاً باللون الافتراضي الأصفر :


الكود الخاص بها :

كود :
[color=#000080]<asp:Panel ID=[COLOR=#0000ff]"Panel1"[/color] runat=[color=#0000ff]"server"[/color] Height=[color=#0000ff]"134px"[/color] Width=[color=#0000ff]"446px"[/color] BackColor=[color=#0000ff]"Yellow"[/color]>[/COLOR]
قم باختيار اللون المطلوب :[color=#000080]<br />[/color]
[color=#000080]<br />[/color]
[color=#000080]<asp:RadioButton ID=[COLOR=#0000ff]"RadioButton1"[/color] runat=[color=#0000ff]"server"[/color] Text=[color=#0000ff]"أخضر"[/color] GroupName=[color=#0000ff]"colors"[/color] />[/COLOR]
[color=#000080]<br />[/color]
[color=#000080]<asp:RadioButton ID=[COLOR=#0000ff]"RadioButton2"[/color] runat=[color=#0000ff]"server"[/color]
oncheckedchanged=[color=#0000ff]"RadioButton2_CheckedChanged"[/color] Text=[color=#0000ff]"أحمر"[/color] GroupName=[color=#0000ff]"colors"[/color]/>[/COLOR]
[color=#000080]<br />[/color]
[color=#000080]<br />[/color]
[color=#000080]<asp:Button ID=[COLOR=#0000ff]"Button1"[/color] runat=[color=#0000ff]"server"[/color] Text=[color=#0000ff]"تطبيق"[/color] onclick=[color=#0000ff]"Button1_Click1"[/color] />[/COLOR]
[color=#000080]</asp:Panel>[/color]
والآن ، سنقوم بانشاء كوكيز نخزن فيه اللون المختار حالياً بالشكل التالي في حدث الضغط على زر ( تطبيق ) ، وسنعطي هذا الكوكيز تاريخاً للانتهاء :
C#:

كود :
string color;
if (RadioButton1.Checked)
{
color = "Green";
Panel1.BackColor = System.Drawing.Color.Green;
}
else if (RadioButton2.Checked)
{
color = "Red";
Panel1.BackColor = System.Drawing.Color.Red;
}
else
color = "";
HttpCookie Cookie = new HttpCookie("myColor", color);
Cookie.Expires = DateTime.Parse("01/01/2009");
Response.Cookies.Add(Cookie);
vb.net:

كود :
Dim color As String
If RadioButton1.Checked Then
color = "Green"
Panel1.BackColor = System.Drawing.Color.Green
ElseIf RadioButton2.Checked Then
color = "Red"
Panel1.BackColor = System.Drawing.Color.Red
Else
color = ""
End If
Dim Cookie As New HttpCookie("myColor", color)
Cookie.Expires = DateTime.Parse("01/01/2009")
Response.Cookies.Add(Cookie)
والآن في حدث ال Form_Load للتشغيل ، سنقوم بقراءة الكوكيز ، وفي حالة وجود myColor فسيتم معرفة قيمته :

C#:

كود :
if (Request.Cookies["myColor"]!=null)
{
string color = Request.Cookies["myColor"].Value;
if (color=="Green")
Panel1.BackColor = System.Drawing.Color.Green;
else if (color=="Red")
Panel1.BackColor = System.Drawing.Color.Red;
}
vb.net:

كود :
If Request.Cookies("myColor") IsNot Nothing Then
Dim color As String = Request.Cookies("myColor").Value
If color = "Green" Then
Panel1.BackColor = System.Drawing.Color.Green
ElseIf color = "Red" Then
Panel1.BackColor = System.Drawing.Color.Red
End If
End If
}}}
تم الشكر بواسطة:
#6
Application .
طريقة أخرى مشتقة من HttpApplicationState ، ولكن من خلالها لا يتم تخزين البيانات لعميل واحد ، بل يتم تخزين بيانات يمكن ان تصل لجميع العملاء ، ابسط مثال لها هو عدد الزوار والذي ينبغي ان يكون مؤثراً عند جميع العملاء وليس عميل واحد فقط .
تحتوي هذه الفئة على الدوال والخصائص التالية :

Add() : اضافة عنصر جديد باسم جديد للقائمة .
AllKeys : استعراض جميع العناصر الموجودة .
Count : معرفة عدد العناصر الموجودة .
Lock(), Unlock() : السماح او عدم السماح بتعديل المجموعة .
RemoveAll(), Remove(), RemoveAt() : تستخدم لحذف عنصر في نقطة معينة ، أو باسم معين ، أو حذف الكل وذلك على الترتيب .


يمكنك اضافة Application جديد بالشكل التالي :
C#:

كود :
Application["Visitors"] = 1;
vb.net:

كود :
Application("Visitors") = 1
ويمكن استعادتها في مربع عنوان مثلاً :
C#:

كود :
labelVistor.Text=(string)Application["Visitors"];
vb.net:

كود :
labelVistor.Text = DirectCast(Application("Visitors"), String)
ولتعديل قيمة مثلاً :
C#:

كود :
Application["Visitor"]= ((int)Application["Visitor"])+1;
vb.net:

كود :
Application("Visitor") = CInt(Application("Visitor")) + 1
*** لاتنس ان محتويات ال Application قد لا تكون نص فقط ، بل قد تكون مصفوفة من الفئات مثلاً ...
}}}
تم الشكر بواسطة:
#7
Cache :
تقنية أخرى مختصة بالتطبيق عند جميع أجهزة العملاء ، ولكن يمكنك تحديد فترة معينة فقط لها ، لانشاءها نستخدم الأمر التالي مثلاً :
C#:

كود :
Context.Cache["myCache"] = "hii, my first cache";
vb.net:

كود :
Context.Cache("myCache") = "hii, my first cache"
وللاستعادة :
C#:

كود :
string myCache = (string)Context.Cache["myCache"];
vb.net:

كود :
Dim myCache As String = DirectCast(Context.Cache("myCache"), String)
}}}
تم الشكر بواسطة:
#8
Global.asax :آخر جزئية لدينا في درس اليوم هي استخدام ملف Global.asax لتخزين متغيرات Global ودوال يمكن الوصول إليها من اي صفحة ، قم باضافة عنصر جديد وقم باختيارها بالشكل التالي :
بعد اضافتك لهذه الصفحة ، ستجد بها افتراضياً الأكواد التالية :وكما لاحظت ، تحوي هذه الصفحة على تعريفات لدوال رئيسية خاصة بالتعامل مع كافة انواع ال State Management ، اضافة لحالة حدوث الأخطاء Application_Error وغيرها من دوال تفيد في ادارة كامل صفحات المشروع ، ويمكنك الاستفادة منها في جميع استخداماتك لعناصر State Management المختلفة التي تعرفنا عليها في هذا الدرس .
والله الموفق ...والسلام عليكم ورحمة الله وبركاته .
}}}
تم الشكر بواسطة: darsh_mrm , darsh_mrm



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم