المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : الدرس السادس والسبعون : ASP.net - الجزء الثالث - دورة .net 2008


khaledbelal
03-11-2010, 07:05 PM
بسم الله الرحمن الرحيم .
السلام عليكم ورحمة الله وبركاته .

State Management :

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

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

- View state .
- Control state .
- Application-Level Variables
- Cache .
- Session .
- ******s .

وسنتعرف عليها خلال هذا الدرس إن شاء الله .

Control state :

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

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

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTIxNDIyOTM0Mg9kFgICAw9kFgICAQ8PFgIeBFRleHQ FBWFobWVkZGRkCq8FGqyXBP0pBDpvdnycvM5zSQE=" />

خطأ شائع :
أحياناً ما تحتاج لإن تقوم بملء محتويات قائمة لديك في حدث ال 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

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)

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

******s :

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

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

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

http://vb4arab.com/vb/uploaded/3/01219876795.jpg

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

<asp:Panel ID="Panel1" runat="server" Height="134px" Width="446px" BackColor="Yellow">
قم باختيار اللون المطلوب :<br />
<br />
<asp:RadioButton ID="RadioButton1" runat="server" Text="أخضر" GroupName="colors" />
<br />
<asp:RadioButton ID="RadioButton2" runat="server"
oncheckedchanged="RadioButton2_CheckedChanged" Text="أحمر" GroupName="colors"/>
<br />
<br />
<asp:Button ID="Button1" runat="server" Text="تطبيق" onclick="Button1_Click1" />
</asp:Panel>

والآن ، سنقوم بانشاء ****ز نخزن فيه اللون المختار حالياً بالشكل التالي في حدث الضغط على زر ( تطبيق ) ، وسنعطي هذا ال****ز تاريخاً للانتهاء :
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 = "";
Http****** ****** = new Http******("myColor", color);
******.Expires = DateTime.Parse("01/01/2009");
Response.******s.Add(******);

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 ****** As New Http******("myColor", color)
******.Expires = DateTime.Parse("01/01/2009")
Response.******s.Add(******)

والآن في حدث ال Form_Load للتشغيل ، سنقوم بقراءة ال****ز ، وفي حالة وجود myColor فسيتم معرفة قيمته :

C#:

if (Request.******s["myColor"]!=null)
{
string color = Request.******s["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.******s("myColor") IsNot Nothing Then
Dim color As String = Request.******s("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

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 قد لا تكون نص فقط ، بل قد تكون مصفوفة من الفئات مثلاً ...

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)

Global.asax :

آخر جزئية لدينا في درس اليوم هي استخدام ملف Global.asax لتخزين متغيرات Global ودوال يمكن الوصول إليها من اي صفحة ، قم باضافة عنصر جديد وقم باختيارها بالشكل التالي :

http://vb4arab.com/vb/uploaded/3/01219879119.jpg

بعد اضافتك لهذه الصفحة ، ستجد بها افتراضياً الأكواد التالية :

<%@ Application ********="C#" %>
<****** runat="server">
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
}

void Application_End(object sender, EventArgs e)
{
// Code that runs on application shutdown
}

void Application_Error(object sender, EventArgs e)
{
// Code that runs when an unhandled error occurs
}
void Session_Start(object sender, EventArgs e)
{
// Code that runs when a new session is started
}
void Session_End(object sender, EventArgs e)
{
// Code that runs when a session ends.
// Note: The Session_End event is raised only when the sessionstate mode
// is set to InProc in the Web.config file. If session mode is set to StateServer
// or SQLServer, the event is not raised.
}

</******>

وكما لاحظت ، تحوي هذه الصفحة على تعريفات لدوال رئيسية خاصة بالتعامل مع كافة انواع ال State Management ، اضافة لحالة حدوث الأخطاء Application_Error وغيرها من دوال تفيد في ادارة كامل صفحات المشروع ، ويمكنك الاستفادة منها في جميع استخداماتك لعناصر State Management المختلفة التي تعرفنا عليها في هذا الدرس .

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

tdi4
04-12-2010, 06:37 AM
جزاك الله خيرا اخي الكريم

khaledbelal
04-12-2010, 03:52 PM
جزانا واياك وهلا بك بيننا

tdi4
04-12-2010, 04:16 PM
أخي خالد عندي إستفسار حول كيفية إرجاع المنيو إلى العربي
يعني ال Separator يرجع شمال مو يمين
عايز أرفق صورة بس ماعندي صلاحية
وشكرااا

khaledbelal
04-12-2010, 04:21 PM
أخي خالد عندي إستفسار حول كيفية إرجاع المنيو إلى العربي
يعني ال Separator يرجع شمال مو يمين
عايز أرفق صورة بس ماعندي صلاحية
وشكرااا

يمكنك اخي رفع الصورة على هذا الموقع ومن ثم اعطائنا الرابط هنا في المنتدى

http://www.islamup.com

وجزاك الله خيرا

tdi4
04-12-2010, 04:27 PM
http://www.islamup.com/download.php?img=87524

khaledbelal
04-12-2010, 04:30 PM
أخي خالد عندي إستفسار حول كيفية إرجاع المنيو إلى العربي
يعني ال separator يرجع شمال مو يمين
عايز أرفق صورة بس ماعندي صلاحية
وشكرااا

هل تقصد ارجاعه الى الانجليزية ؟؟؟

tdi4
04-12-2010, 05:58 PM
لا هو أصله إنجليزي
شوف الصورة دي انا عملت لها توضيح
http://www.islamup.com/download.php?img=87531

tdi4
04-12-2010, 06:09 PM
إدا كان ممكن ارجعها عربي
بس ادا كانت عندك فكرة
وأستسمح على الإزعاج أخي الفاضل.

khaledbelal
04-13-2010, 01:26 AM
إدا كان ممكن ارجعها عربي
بس ادا كانت عندك فكرة
وأستسمح على الإزعاج أخي الفاضل.

اسف اخي الكريم بحثت عنها ولم اجدها

فان وجدتها باذن الله ساخبرك بها

وجزاكم الله خيرا

tdi4
04-20-2010, 02:25 PM
شكراا على المجهود