الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

فهم postback

بدأه بـلـبل في 11 أغسطس 2010 · 11 رد · 9,245 مشاهدة · في ASP.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

سأقوم في موضوعي هذا بتوضيح فكرة ال postback وأين ذهبت ال post و ال get وهل فعلا يوجد بالوب بشكل عام ما يسمى postback . كيف ان ما يكروسوفت قد اخفت طريقة التعامل مع ال post and get ولم تنهي تعاملها معها , ولكن كان اسلوبا ذكيا ممن طور اسلوب البرمجة بالـ Asp.net تجاه هذا الاسلوب نحو اخفاء التعامل مع ال post and get مع بقائها على التعامل معها بشكل اساسي وقطعي . طبعا ساتحدث عن الـ viewstate لما لها علاقة مع ال viewstate بشكل اساسي بالحفاظ على حالة العناصر والبيانات المدخلة من قبل الزبون , كذلك سأتحدث لم لجأت الى هذا الاسلوب من عمل ال postback ولم لم تبق على الاسلوب القديم من ال post and get .

كان سابقا يتم طلب صفحة من خلال الpost او ال get كما في المثال التالي :

<form method="get او post" action="الصفحة الهدف">
<input type="text" name="a" />
<input type="submit" name="r" /> 
</form>

حاليا ومع حل مايكروسوفت بالتعامل مع ال asp.net التي تكون بالتعاون مع لغة برمجة اما c# or vb وبما ان اللغتين غرضيتي التوجه ونريد ان نتعامل مع توابع عند تنفيذ الاحداث فما هو الحل ونحن لا نملك الا طريقة واحدة لنقل البيانات الى السيرفر الا وهي ال

<input type="submit" name="r" />

سؤال مستقطع : ماذا لو تصفحنا الاحداث على عنصر من عناصر ما يكروسوفت ما ؟ سنجد انه يملك اكثر من حدث كيف يتم ذلك وبالوب لا يوجد حدث نقل بيانات الى السرفر سوى ال submit كان حلا بسيط لانشاء احداث الا وهي ال postback اكيد من مجرد قولي لتلك الكلمة لن يتم التوضيح التوضيح كان كالاتي .

ماهو ال postback : لو اتينا اليه لوجدنا له تعريفين تعريف برمجي وتعريف استخدام

تعريف الاستخدام : هي عملية ارسال بيانات من المستعرض الى السيرفر بعد الاستدعاء الاول للصفحة وهنا يوجد عناصر تدعمه بشكل مباشر وعناصر لا تدعمه بشكل مباشر يجب تفعيل تلك الخاصية .

ماهو التعريف البرمجي : هو تغليف لعملية submit بتابع javascript وارسال تلك البيانات الى السيرفر

كيف تتم العملية بشكل كامل لنقوم بتوضيح العملية :

باستخدام ال get and post عندما نقوم بتعبئة حقل مثلا ببيانات معينة وعمل submit سنلاحظ ان البيانات التي كانت موجودة ضمن الحقول قد اختفت بعد تنفيذ حدث الsubmit . السبب ان الوب statless . اي يتم تنفيذ الحدث ومن ثم يتم قطع الاتصال بشكل كامل مع السيرفر

اذا عند استخدام ال html control يتم ارسال طلب الى السيرفر وتتم معالجة الطلب على السيرفر ومن ثم يعيد الطلب الى الزبون بصفحة جديدة كليا ومختلفة كليا عن الصفحة القديمة .

ملا حظة : السيرفر لا يقوم بخبء اي من بيانات الصفحة وانما بعد انشاء الصفحة يقوم بتحرير الذاكرة بشكل كامل من تلك الصفحة .

من هنا كانت فائدة ال postback

1- المحافظة على حالات العناصر من الاستدعاءات المتكررة للصفحة .

2- تنفيذ احداث غير حدث ال submit .

3- تنفيذ احداث نقل بيانات الى المخدم على عناصر اخرى غير الازرار كقوائم الاختيار .

4- تنفيذ ال post على نفس الصفحة دون تضمين ذلك بال action .

الان لناتي الى فتح كود ال javascript الناتج بعد تنفيذ صفحة بها زر معيين

	<form id="form1" runat="server">

	<div>  <asp:Button ID="Button1" runat="server" Text="Button" />

    	</div>  </form>

هل بهذا الكود نلاحظ وجود شيىء يدل على ال postback . لا لا يوجد شيىء اذن اين تتم عمل ال postback .

لننفذ هذا الكود ونرى المصدر الخاص الناتج ك html

	<form name="form1" method="post" action="Default.aspx" id="form1">

<div>

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

</div>

 <div>

 <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWAgL2nv+aCwKM54rGBnE47iHkV4MKrLNyETwVAoqowaHu" />

</div><div> <input type="submit" name="Button1" value="Button" id="Button1" /> 	</div>	</form>

ما هذا نجد ان العملية تحولت الى

<form name="form1" method="post" action="Default.aspx" id="form1">

بمعرف محدد وتوجيه الى صفحة محدد وخاصية post وباسم محدد ساقوم بالمقابلة بين النمطين asp.net web form , the result as html

post-223709-089124300 1281553721_thumb.j

ماذا لو اردنا تنفيذ حدث submit على عناصر الاختيار . لا يوجد بشكل مباشر الحل مع عناصر الاي اس بي حاول ادراج قائمة منسدلة وفعّل خاصية ال autopostback AutoPostBack="True" وتشغيل الصفحة .

   <form id="form1" runat="server">

	<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True">

    	<asp:ListItem Value="1">asp.net</asp:ListItem>

    	<asp:ListItem Value="2">html</asp:ListItem>

    	<asp:ListItem Value="3">css</asp:ListItem>

	</asp:DropDownList>

	</form>

اين ال post واين ال submit السر يكمن في الخرج لنرى خرج هذا .

الحل كان بانشاء تابع جافا سكريبت __doPostBack واستقبال قيمتين لهذا التابع العنصر المنفذ ومعلومات اخرى كلغة برمجة بالc# or vb

	<form name="form1" method="post" action="Default.aspx" id="form1">
<div>
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__LASTFOCUS" id="__LASTFOCUS" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUINTEwNDE4MTBkZCW1b9pq4+q/0gU6TOqtw1yA3c/u" />
</div>

<script type="text/javascript"> 
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
	theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
	if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
    	theForm.__EVENTTARGET.value = eventTarget;
    	theForm.__EVENTARGUMENT.value = eventArgument;
    	theForm.submit();
	}
}
//]]>
</script>


<div>

<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWBQKbh5XIDQKd5I/lCgKSi6WLBgKTi6WLBgKQi6WLBkon+FiUUURv8zwl5epTRHyfYCIE" />
</div>
	<select name="DropDownList1" onchange="javascript:setTimeout('__doPostBack(\'DropDownList1\',\'\')', 0)" id="DropDownList1">
<option value="1">asp.net</option>
<option value="2">html</option>
<option selected="selected" value="3">css</option>
</select>
</form>

يتم استقبال فيمتي للتابع

1- الغرض object sender

2- الحدث eventargs

سير العملية :

كوب عادي اي التعامل من جهة الزبون التعامل كخرج يتم اختيار عنصر من القائمة هذا الاختيار يولد حدث onchange في حدث ال onchange يتم تفعيل تابع زمني setTimeout يتم من خلاله تنفيذ تابع ال postback (__doPostBack) من هذا التابع يستقبل العنصر المحدد ومعلومات عن الحدث .

التابع :

ساضع هنا سطرين لن اتحدث عنهما :

post-223709-036945900 1281553754_thumb.j

وبذلك نكون قد حصلنا على ارسال بيانات الى المخدم طبعا لو نظرنا الى الform سنجد ان بياناته كما في بيانات الزر اي post وارسال الى نفس الصفحة طبعا لم اتحدث عن ال get لانها مازالت موجود في ال url اي عند وضع عنوان

<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="~/1.aspx?id=10" >HyperLink</asp:HyperLink>

هنا ال get يتم استقبال البيانات من خلال id وهنا عملية get نظامية لا غير .

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

رمضان كريم

يتبع ...

المرفقات
1.jpg2.jpg
2

In bad state

#2

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

يعلم الله اني من المتابعين لك

بشكل مستمر ومن اشد المعجبين

بمواضيعك واصل يابطل ولك جزيل الشكر

وتقبل مروري

اللي يبي مشروع تخرج asp.net

يرسل لي رسالة خاصة

#3

بارك الله فيك اخي xfile

#4

سوال : ماذا تقصد بالاستدعاء الاول للصفحة ... هل تقصد اول مره افتح فيه الصفحة . اما ماذا .. ياليت توضح لي الفكره اكثر

اقتباس

تعريف الاستخدام : هي عملية ارسال بيانات من المستعرض الى السيرفر بعد الاستدعاء الاول للصفحة وهنا يوجد عناصر تدعمه بشكل مباشر وعناصر لا تدعمه بشكل مباشر يجب تفعيل تلك الخاصية .

الف شكر لك على الموضوع

صراحه موضوع اكثر من رائع

جزاك الله عنه الف خير

وانتظر القادم بفارغ الصبر ... الى الامام يا اخي

#5
lak3yoni كتب:

سوال : ماذا تقصد بالاستدعاء الاول للصفحة ... هل تقصد اول مره افتح فيه الصفحة . اما ماذا .. ياليت توضح لي الفكره اكثر

الف شكر لك على الموضوع

صراحه موضوع اكثر من رائع

جزاك الله عنه الف خير

وانتظر القادم بفارغ الصبر ... الى الامام يا اخي

السلام عليكم ورحمة الله

إسمح لى أخى أكتب لك رداً على سؤالك , وذلك لإثراء الموضوع

عند طلب الصفحة لأول مرة من خلال المستخدم ككتابته http://www.sitename.com /default.aspx فهنا يتم طلب الصفحة بإستخدام HTTP GET . وبه القيم الإبتدائية للصفحة وأدواتها . ومن ثم الطلبات الأخرى لنفس المستخدم تكون Postback ومعناها كما ذكر بالسابق العودة بإرسال بيانات إلى الخادم مع بيانات الحدث المتسبب فى ذلك الإرسال وكذلك الأداة المتسببة فى ذلك . مع العلم أن هذة العملية تتم بالرجوع إلى نفس الصفحة او إلى صفحة أخرى وسيتم التوضيح بعد قليل . وبالطبع هذة العودة تكون ببيانات يتم تحديث الصفحة بناءاً عليها . ونجد ان هذة البيانات المرسلة إلى الـServer لا تكون متاحة فى مرحلة Page initialization وأحداثها اى لا يمكن إستخدام هذة البيانات المرسلة فى هذة المرحلة ولكن يمكن فحص ما إذا كان هذا الطلب هو PostBack ام لا . ويمكن إستخدام هذة البيانات إبتداءً من مرحلة Load .

انواع PostBack ?

النوع الأول هو إرسال Postback للصفحة نفسها والنوع الأخر هو إرسال PostBack إلى صفحة أخرى ويسمى CrossPostBack. مع العلم انه فى حالة CrossPostBack نستقبل البيانات المرسلة فى الصفحة الأخرى بـالخاصية PreviousPage وكذلك إستخدام PreviousPage@ ومعها FindControl للبحث عن الأدوات فى الصفحة السابقة . أو إستخدام كل الخصائص والدوال الخاصة من نوع Public بالصفحة الأولى من خلال إستخدام Reference @ وإلإشارة إلى الصفحة السابقة . والوصول إلى هذة الدوال والخصائص من خلال PreviousPage.PropertyName .

ففى الحالتين يتم إرسال بيانات الصفحة واداوتها إلى المسار الذى يحدد PostBack مع العلم انه يمكن التحكم فى هذا التوجية برمجياً من خلال إنشاء Object من PostBackOption .

فكيف لنا ان نعرف إن كان هذا الطلب للصفحة هو اول طلب لها اى Http Get أو Http Post ؟

يمكن فحص ذلك بإستخدام الخصائص التابعة للصفحةPage وهم على التوالى Page.IsPostBack , Page.IsCrossPostBack .

وكثيراً ما نحتاج إن ننفذ كود مرة واحدة فقط وذلك عند اول طلب للصفحة فعندها يمكن كتابة هذا الكود داخل الكود التالى :

if (!IsPostBack)
           {
               // Do something at first Time The Page Requested 
           }

ويقع حدث ControlEventPostBack بعد حدث Page_Load وكذلك هناك من الدوال التى تنفذ فى حالة PostBack سواء الخاصة بالاداة المتسببة فى حدوث PostBack او الخاصة بالصفحة نفسها مثال على ذلك التحقق من Validation فنجد دالة Page.Validate تنفذ عند إستداعاء أحداث الأدوات وعليه يمكن إختبار الخاصية IsValid . وكذلك دالة LoadViewState إبتداء من الصفحة ككل ومن ثم الأداة ويتم هذا قبل حدث PreLoad . وغير ذلك.............

فى أمان الله .

1

Ahmed Moosa

Microsoft Community Contributor | MCC

Microsoft Certified Professional Developer | MCPD

Microsoft Certified Technology Specialist | MCTS

Senior .NET Developer

.Net Trainer

English blog : http://weblogs.asp.net/ahmedmoosa/

مدونة عربى : http://ahmedmoosa.wordpress.com/

#6

السلام عليكم

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

جواب شافي اخي احمد فعلا مشاركتك اثرت الموضوع

اكمالا لما سبق دعونا نتفحص استخدام ال vaidation مع اي عنصر , عند ربط اي عنصر مع validation كواجهة استخدام هي تحقيق شرط معيين على عنصر معيين قبل عملية ارسال البيانات الى السيرفر .

مثال :

لو اردنا ان نضع حقل نصي و RequiredFieldValidator حيث كان الشرط على الحقل النصي بان لا يكون فارغا واتوقع هذا شيىء مفروغ منه

<form id="form1" runat="server" method="post">
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" 
	ErrorMessage="RequiredFieldValidator" ControlToValidate="TextBox1"></asp:RequiredFieldValidator>
<br />
<asp:Button ID="Button1" runat="server" Text="Button" />
<br />
</form>

الان دعونا ناخذ مصدر الصفحة سنجد انه قد اصبح على الزر button حدث ضغط يقوم بالتاكد من ذلك وبعدها ارسال البيانات الى المخدم.

صراحة كنت ناوي نزل شرح مفصل عن العملية ولكن لم اجد لها علاقة ربما اتحدث لذلك ان شاء الله بنزلها بموضوع آخر . اي ا نال validation ماهي الا تابع javascript على حدث ضغط الزر وموجود هذا التابع بملف WebResource.axd

الان سنخوض بعملية الارسال والاستقبال :

عند دخول الزبون الى موقع ما وطلب صفحة معينة فانه وقيامه بعمليات معينة له تسلسل عمليات بعضها من طرف المخدم وبعضها من طرف الزبون .

وكما ذكرت ان هناك نوعين للاستدعاءات

الاستدعاء الاول :

1- يطلب المستخدم صفحة ما

2- يقوم المخدم بانشاء الصفحة

3- يقوم المخدم بتهيئة العناصر ووضعها ب viewstate

4- يقوم المخدم بتحويل الخرج الى html

5- يقوم المخدم بارساله الى الزبون

6- يقوم المخدم بتحرير الصفحة من ذاكرة المخدم اي حذف الصفحة من ذاكرة المخدم وهذا تم ذكره بالاعلى

post-223709-072452800 1281651110_thumb.j

لاستعاء الثاني وما بعد

يتم عمل ال postback اما من خلال العناصر التي تدعمه مباشرة كاال button او من خلال حدث يقوم بتوليد _dopostback

1- يتم ارسال حالة العناصر ال viewstate + البيانات المدخلة من قبل المستخدم

2- سيقوم المخدم باعادة تفكيك ال view state القديمة وانشاء ال view state الجديدة

3- انشاء وتهيئة العناصر

4- تنفيذ الاحداث التي ارسلت الى السيرفر

5- انشاء ال viewstate المنشاءة عن طريق الكود او الناتجة الكلية

6- تحويل الخرج البرمجي الى html and css and javascript

7- ارساله الى الزبون

8- يقوم بتحرير الصفحة من ذاكرة المخدم اي حذف الصفحة من ذاكرة المخدم

post-223709-005510200 1281651197_thumb.j

لذلك كما قال اخي احمد احيانا انا اريد تنفيذ كود فقط في التحميل الاول للصفحة اي تنفيذه مرة واحدة فاستخدم

if (!IsPostBack) 
   		{ 
   			// Do something at first Time The Page Requested  
   		}

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

ان شاء الله يتبع

واذا في خطا بتمنى توجيهي الى الصواب

المرفقات
1.jpg2.jpg

In bad state

#7

السلام عليكم ورحمة الله

إسمح لى أن أقدم تفسير بسيط وهو :

تفسير علاقة اداوات ASP.Net Validation وهى Server Control بعملية الـ Postback والـ JavaScript وهى client Side :

فى البداية هى اداوت Server-side أى يتم عملها على الخادم"Server" . فلماذا تم توليد هذا الكود لفحص عملية الـValidation فى جانب Client Side , يأتى الجواب فى معرفة طريقة عمل هذة الأدوات .

هذة الأدوات تكرر نفسها أو تكرر عملها مرتين وتقوم بدورين ويمكن إلغاء احدهما :

Client-Side Validation , Server-Side Validation

فبمجرد عرض هذة الأدوات للمرة الأولى يتم توليد كود JavaScript بشكل تلقائياً ليقوم بعملية الـ Validation فى جانب Client اولاً ثم العودة من خلال PostBack ثم الفحص فى جانب Server .

ويتم تنفيذ الكود الخاص بـ Client -Side بمجرد الإنتقال من الحقل إلى غيره او الضغط فى أى مكان آخر فى الصفحة .وعند الضغط على الأداة التى تقوم بعمل PostBack يتم تنفبذ نفس الأمر وتكراره ولكن هذة المرة على Server . وكما تم الذكر مسبقاً لا يتم تنفيذ دالة Page.Validate إلا فى حالة PostBack .

وكما قلنا أنه يمكن إلغاء أحد الأمرين وهو Client -Side : فنجد الخاصية EnableClientScript حيث القيمة الإفتراضية لها بـ True وهو ما جعل كود JavaScript ينتج عند العرض للصفحة وعند إعطائه القيمة False لا ينتج هذا الكود . ونلغى هذة العملية فى جانب Client -Side .

فى أمان الله

تم تعديل هذه المشاركة بواسطة Ahmed Moosa في 13 أغسطس 2010 في 02:29

Ahmed Moosa

Microsoft Community Contributor | MCC

Microsoft Certified Professional Developer | MCPD

Microsoft Certified Technology Specialist | MCTS

Senior .NET Developer

.Net Trainer

English blog : http://weblogs.asp.net/ahmedmoosa/

مدونة عربى : http://ahmedmoosa.wordpress.com/

#8
Ahmed Moosa كتب:

السلام عليكم ورحمة الله

إسمح لى أن أقدم تفسير بسيط وهو :

تفسير علاقة اداوات ASP.Net Validation وهى Server Control بعملية الـ Postback والـ JavaScript وهى client Side :

فى البداية هى اداوت Server-side أى يتم عملها على الخادم"Server" . فلماذا تم توليد هذا الكود لفحص عملية الـValidation فى جانب Client Side , يأتى الجواب فى معرفة طريقة عمل هذة الأدوات .

هذة الأدوات تكرر نفسها أو تكرر عملها مرتين وتقوم بدورين ويمكن إلغاء احدهما :

Client-Side Validation , Server-Side Validation

فبمجرد عرض هذة الأدوات للمرة الأولى يتم توليد كود JavaScript بشكل تلقائياً ليقوم بعملية الـ Validation فى جانب Client اولاً ثم العودة من خلال PostBack ثم الفحص فى جانب Server .

ويتم تنفيذ الكود الخاص بـ Client -Side بمجرد الإنتقال من الحقل إلى غيره او الضغط فى أى مكان آخر فى الصفحة .وعند الضغط على الأداة التى تقوم بعمل PostBack يتم تنفبذ نفس الأمر وتكراره ولكن هذة المرة على Server . وكما تم الذكر مسبقاً لا يتم تنفيذ دالة Page.Validate إلا فى حالة PostBack .

وكما قلنا أنه يمكن إلغاء أحد الأمرين وهو Client -Side : فنجد الخاصية EnableClientScript حيث القيمة الإفتراضية لها بـ True وهو ما جعل كود JavaScript ينتج عند العرض للصفحة وعند إعطائه القيمة False لا ينتج هذا الكود . ونلغى هذة العملية فى جانب Client -Side .

فى أمان الله

تمام كلام صحيح اخي احمد

كنت قد شرحت فقط فكرة التحقق على العنصر من طرف الزبون

شكرا لك

In bad state

#9

يعطيكم العافيه ياشباب وبيض الله وجيهكم

عرفت متى استخدم IsPostBack والفائده منها

لكن متى استخدم Page.IsCrossPostBack وماهي الفائده منها

#10
lak3yoni كتب:

لكن متى استخدم Page.IsCrossPostBack وماهي الفائده منها

السلام عليكم ورحمة الله

CrossPostBack تستخدم لنقل بيانات إلى الخادم مثلها مثل PostBack ولكن تختلف مع PostBack فى انها تحمل البيانات عبر الصفحات "أى من صفحة لأخرى " ويتم الكشف عنها عند تنفيذ كود مثلاً فى حدث Page_Load أريد ان أحصل على قيمة TextBox فى الصفحة السابقة او أريد أن احصل على قيمة Property فإن قمنا بطلبها هكذا PreviousPage.PropertyName سيرجع بخطأ فى حالة ان الصفحة أول طلب لها وهو Get أو فى حالة انها PostBack لذلك وجب علينا أن نفحص عن التالى :

if (PreviousPage != null)
        {
            if (PreviousPage.IsCrossPagePostBack)
            {

}

}

فسنجد ان هذا الكود لن ينفذ إلا فى حالة ان الصفحة CrossPostBack .

ولإنشاء CrossPostBack يتم إنشاء أداة Button وإعطاء الخاصية PostBackUrl إلى الصفحة المقصود الذهاب إليها : وإليك مثال قم بتحمليه من هنا

فى امان الله

تم تعديل هذه المشاركة بواسطة Ahmed Moosa في 14 أغسطس 2010 في 02:51

1

Ahmed Moosa

Microsoft Community Contributor | MCC

Microsoft Certified Professional Developer | MCPD

Microsoft Certified Technology Specialist | MCTS

Senior .NET Developer

.Net Trainer

English blog : http://weblogs.asp.net/ahmedmoosa/

مدونة عربى : http://ahmedmoosa.wordpress.com/

#11

بيض الله وجهك اخوي احمد موسى

عز الله انك كفيت و وفيت

الف شكر لك اخوي

وبعد الرد سوف اتجاه الى موضوعك المفضل لدي امثله واكواد من منتديات ASP

#12

مجهود رائع

مواضيع مشابهة