بسم الله الرحمن الرحيم
سأقوم في موضوعي هذا بتوضيح فكرة ال 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
ماذا لو اردنا تنفيذ حدث 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) من هذا التابع يستقبل العنصر المحدد ومعلومات عن الحدث .
التابع :
ساضع هنا سطرين لن اتحدث عنهما :
وبذلك نكون قد حصلنا على ارسال بيانات الى المخدم طبعا لو نظرنا الى الform سنجد ان بياناته كما في بيانات الزر اي post وارسال الى نفس الصفحة طبعا لم اتحدث عن ال get لانها مازالت موجود في ال url اي عند وضع عنوان
<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="~/1.aspx?id=10" >HyperLink</asp:HyperLink>
هنا ال get يتم استقبال البيانات من خلال id وهنا عملية get نظامية لا غير .
جزاكم الله كل خير
رمضان كريم
يتبع ...