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

الانتقال من صفحة إلى أخرى

مغلق
بدأه جوليا في 20 أبريل 2007 · 22 رد · 6,342 مشاهدة · في ASP.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

سلام ..

هذه المره ليست هنالك مشكلة ... :lol:

و لكني لدي سؤال ...

عندما أضع button في صفحة ويب ..

وظيفته : الانتقال من صفحة لأخرى .

استطيع استخدام طريقتين ، هما:

1. باستخدام الحدث Click ، عن طريقة الأمر Response.Redirect.

2 باستخدام الخاصية postBackUrl.

السؤال : ما هو الفرق في استخدام هاتين الطريقتين ؟؟ ( مع اني ارى النتيجة نفسها في النهاية ) .. أي سؤالي يتعلق بكيفية عمل كلا منهما ، مميزاته ، سلبياته ؟

في الانتظار.

، تحياتي.

#2

الفرق انه في الاولى بتقدري تحطي كود ايش ما بدك متلا if else

متلا وانه اذا هيك الشرط روح على هده الصفحة اذا لأ روح على وحده تانيه

اما الامر التاني

ما بروح الا على صفحة

#3

سلامين .. ..

في الحقيقة أن ال postBackUrl أقرب ل Server.Transfer منها إلى Response.Redirect و الأولى

لها القدرة على التعامل مع محتويات ال ViewState و حتى مع الكائنات الموجودة في الصفحة يعني الأدوات

ال Response.Redirect هي أبسط طريقة للإنتقال لصفحة أخرى و ال Action من نوع Get وليس Post يعني

من غير الممكن إرسال بيانات للصفحة الاخرى كما الحال في ال PostBackUrl

يعني بإختصار .. لو عملنا نموذج لتسجيل بيانات معينة في قاعدة بيانات .. يفضل ان نستخدم Response.Redirect

بعد الإنتهاء من عملية التخزين للبيانات في داخل الحدث Btn_OnClick حتى نمنع تكرار تسجيل البيانات مرة أخرى في حال تحديث

الصفحة ..

على فكرة !!! هناك ميزة جميلة في النسخة الثانية من الدوت نت .. أقصد ال ASP.NET و هي

Cross-Page postpack

الفكرة هي السماح لبيانات موجودة داخل صفحة معينة تسمى ال Source Page بالتنقل لأكثر من صفحة أخرى والتي يطلق عليها

اسم Target Pages

و أي صفحة Target تستطيع إستقبال أي بيانات تم إرسالها من قبل عن طريق صفحة ال Source

طبعا ما ذكرته جوليا عن ال PostBackUrl هو نفس النقطة التي ذكرتها انا حالا : Cross-Page Postback

You can fly while you can touch the sky

#4

العضو الكريم / eve

رائع جدا ، اضافة جيدة ...

أنت توضح الفرق من الناحية البرمجية .

، شكرا لك.

، تحياتي.

#5

الخبير / محمد خليل أبو صلاح .

حسنا،عندما قرأت تعقيبك لأول مرة قد سبب لي بعض التشويش!.

لنستوضح الأمور قليلا ،

لقد فهمت من تعقيبك التالي: -

1/ PostBackUrl تشابه في عملها الـ Server.Transfer.

2/ الـ Response.Redirect لها قدرة على التعامل مع الـ viewState و الأدوات الموجودة بالصفحة .

3/ Response.Redirect تستخدم ( Action= Get ).

4/ Cross-Page postpack هي ميزة تستطيع منها الوصول لمكونات الصفحة السابقة ( بحسب ما قرات عنه، مثل استخدام PreviousPage).

اقتباس
على فكرة !!! هناك ميزة جميلة في النسخة الثانية من الدوت نت .. أقصد ال ASP.NET و هي

Cross-Page postpack

الفكرة هي السماح لبيانات موجودة داخل صفحة معينة تسمى ال Source Page بالتنقل لأكثر من صفحة أخرى والتي يطلق عليها

اسم Target Pages

و أي صفحة Target تستطيع إستقبال أي بيانات تم إرسالها من قبل عن طريق صفحة ال Source

* لم استوعب هذه النقطة أعذرني.

، ختاما بالنسبة للزوار المطلعين على هذا الموضوع ، قد يكون مفيدا قراءة المعلومات الواردة في هذه الوصلة :

http://msdn2.microsoft.com/en-us/library/x3x8t37x.aspx

و هي تحتوي على طرق التنقل ما بن الصفحات و مزايا و إمكانيات كل طريقة .

، تحياتي لك.

#6

:) جوليا ..

كلامك صحيح نوعا ما ولكن ..

النقطة رقم 2 غلط .. مع ال Redirect تختفي البيانات و يبقى أمامك حل و هو إستخدام ال

Session أو ال Cache ولكن بعد نقل البيانات وقتها تأكدي من تفريغك للذاكرة حتى لا تؤثر على ال Performance

بخصوص الاقتباس الذي لم يكن واضحا معك ..

في الدوت نت الاصدارة الثانية أصبح من الممكن إرسال البيانات عن طريق ال PostBack لأكثر من صفحة عن طريق مفهوم يسمى Cross Page Postbacks

و ليست هذه الميزة موجودة في الاصدارة ASP.NET1.X

بالأول كان المبرمجين يعانون من صداع استخدام Response.Form للمرور على محتويات الادوات في الصفحة و لكن الان أصبح من السهل جدا باستخدام الطريقة الجديدة

وهي نفسها التي كنتي تعاني من مشاكل فيها أن تقومي بتمرير البيانات من ال Source Page إلى Target Pages

هنا مقال سيفيدك

http://www.codeproject.com/aspnet/PostToAnotherPage.asp

و هذا ايضا سيفيدك من أجل نقل البيانات

http://msdn2.microsoft.com/en-us/library/6c3yckfw.aspx

عموما هذا المفهوم يطلق عليه State MAnagement

You can fly while you can touch the sky

#7

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

قياسا بالمنتديات و المواقع المتخصصة وال Blogs

ولا شك الكتب الورقية ...

You can fly while you can touch the sky

#8

سلام...

الأستاذ / محمد خليل أبو صلاح

مجهود جميل و رائع

شكرا لك على هذه المعلومات ..

لقد اتضح الآن لدي مفهوم الـ " Cross Page Postbacks" ، والطرق المختلفه لـ كيفية الحصول على البيانات من الصفحات السابقة .

، تحياتي لك.

#9

موضوع فاتح للشهية بصراحة

#10

سلام ..

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

قياسا بالمنتديات و المواقع المتخصصة وال Blogs

ولا شك الكتب الورقية ...

لا تقلق ،فأنا اقراء كل ما يقع تحت ناظري ..!

شكرا لاهتمامك بتطويري.

، تحياتي.

#11

هنا مثال عن كيفية ارسال بيانات من صفحة لأخرى من دون كتابة ولا سطر برمجي واحد للارسال

معتمدا على خاصية PostbackUrl في عنصر الزر

والبيانات تعرض مباشرة في الصفحة الهدف.

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

برمجة المثال : C#2.0 في ASP.NET 2.0

ملفات المثال:

PageFrom.aspx صفحة مصدر البيانات

PageFrom.aspx.cs : ملف كود الصفحة السابقة

PageTo.aspx : الصفحة الهدف حيث يتم عرض البيانات

PageTo.aspx.cs: كود الصفحة السابقة

أرجو أن يكون المثال واضح

PostPack.zip

#12

بصراحة اود ان اشكر الجميع على هذا الموضوع الهام جدا جدا حيث ان متابعة الحالة هي من اكبر مشاكل تطبيقات الويب وقد اوجدت ASP.NET حلولا ذكية لها

وسؤالي للاخ محمد خليل أبو صلاح حيث كتب :

اقتباس
الفكرة هي السماح لبيانات موجودة داخل صفحة معينة تسمى ال Source Page بالتنقل لأكثر من صفحة أخرى والتي يطلق عليها

اسم Target Pages

ماذا تقصد لأكثر من صفحة ؟ هل تقصد انه بالامكان الوصول مثلا الى عناصر اول صفحة بعد ان اكون قد استدعيت عدة صفحات اخرى ؟

#13

نعم ولكن الموضوع يختلف عن ما ذكرت

نعم نستطيع الحصول على بيانات الصفحة السابقة اذا تمت العملية بشكل PostBack

وفقط للصفحة السابقة فقط

أرجو أن تكون الفكرة قد وصلت من خلال الملف المرفق السابق

#14

سلام ..

المبرمج / Arwany

لقد اطلعت على المثال المرفق، فهو يشرح المفهوم بأبسط طريقة ممكنة.

لكَ نشاط رائع بالمنتدى .

شكرا لك.

، تحياتي.

#15

سلام ..

العضو الكريم /القرش1

دعني اتطفل عليك و أجيب على سؤالك ،

بما اني المفروض فهمت الدرس جيدا ،،

المقصود بذلك هو ببساطة أنه يمكن أن نصل لصفحة محددة من أكثر من صفحة .

مثلا :

من صفحة a نستطيع الوصول الى صفحة 1

من صفحة b نستطيع الوصول الى صفحة 1

من صفحة c نستطيع الوصول الى صفحة 1

و بالطبع كما قال الأخ Arwany سوف تكون هنالك Previous Page واحده فقط ، أي مسار واحد للوصول للصفحة 1.

أرجو انني افدتك بشيء ما .

، تحياتي.

#16

شكرا لكم ولكن لعل سؤالي لم يتضح تماما ولنوضحه بالمثال التالي :

لنفرض ان لدي صفحة A انتقلت منها الى الصفحة B ثم من الصفحة B انتقلت الى صفحة ثالثة C

الان هل استطيع الوصول لبيانات الصفحة A من خلال الصفحة C ؟

#17

عفوا لم انتبه لكلمة ( مسار واحد ) وهذا يعني ان الحالة التي ذكرتها في المثال غير ممكنه ...

#18

سلام ...

العضو الكريم / القرش 1

انها لفكرة جميلة !

حسنا ما رأيك بالتالي :

PreviousPage.Page.PreviousPage.FindControl("xxx")

، و أعتقد أنه من الأفضل ، أن نحدد اسم الصفحة السابقة لكل صفحة عن طريق :

<%@ PreviousPageType VirtualPath="~/PreviousPageName.aspx" %>

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

حسنا ، الآن دورك لتجرب الكود، و تخبرني إن كان ممكن عمل ذلك بمثال عملي .

، تحياتي.

تم تعديل هذه المشاركة بواسطة جوليا في 28 يونيو 2007 في 10:16

#19

يا شباب الطريقة التي قمت بوضعها في المثال المرفق سابقا هي محدودة فقط بين صفحة وسابقتها

ولكن هنالك عدة طرق لنقل البيانات بين الصفحات حسب نوعية البيانات.

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

Session

بينما لحفظ بيانات غير مهمة مثل الاسم والعنوان وغيرها علينا أن نستخدم

Cookie

وننتبه إلى أن الطريقة السهلة لنقل البيانات بين الصفحات (منعدمة الحماية) هي ال QueryString

وهكذا نجد أنفسنا عند مفترق طرق تائهين ... أين سنحفظ البيانات المؤقتة لمشاركتها بين الصفحات ؟؟؟

هنا سنجد أننا ببساطة علينا تحديد نوع الحمايه + السرعة + الامكانية

الحماية: لا ينبغي تخزين بيانات الدخول في Cookie فهي قابلة للقراءة

السرعة: لا يمكننا تخزين بيانات كبيرة الحجم (أكثر من 100 كيلوبايت) في ال Session فهي محدودة المساحة

الامكانية : لا يمكننا تخزين البيانات في Session اذا كان السيرفر لا يدعمها (الهوسترات المجانية)

لا يجب تخزين البيانات المهمة داخل QueryString فهي مرئية

يجب تخزين البيانات العادية ضمن مناطقها الصحيحة

فمثلا لفتح موضوع (من جدول مواضيع برقم فريد) يجب تمرير هذا الرقم من صفحة إلى أخرى عن طريق الرابط لأن الرقم غير مهم

يرجى الانتباه لهذا الموضوع

#20

سلام ..

شكرا Arwany...

معلومات مهمة ...

لكن لدي سؤال :

ما هو الفرق بين الـ Session و الـ Cash ؟

، تحياتي.

#21

الأخت الكريمة : جوليا

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

مارأيكم أن نكمل نقاشنا في هذا الموضوع المهم وكل منا يذكر الطريقة التي يفضلها لنقل البيانات ولماذا وسأبدأ معكم بذلك

في أغلب المشاريع التي قمت بها استخدم الطرق التالية لادارة الحالات :

1- على مستوى الصفحة الواحدة

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

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

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

2- على مستوى الجلسة :

استخدم طبعا Session وبصراحة اعتمد عليها كثيرا في الاحتفاظ بالبيانات الهامة وهي افضل طريقة لنقل البيانات بين الصفحات ويمكن ان نخزن بها جميع انواع البيانات بما في ذلك الكائنات ومميزاتها كثيرة ولكن عيبها الضغط على السيرفر ولكن هذا نادرا ما يحدث وله حل ايضا بان يتم الاحتفاظ بها في قاعدة البيانات بدلا من الذاكرة ولكن ستكون ابطأ وعموما احد الأنظمة التي عملتها سابقا يستخدمها ما يزيد عن 1000 شخص دون مشاكل واعتمد فيها بكثرة على Session

3- على مستوى التطبيق بالكامل :

استخدم طبعا Application ونادرا جدا ما اقوم باستخدامه وأشهر مثال له عداد الزوار ...

واخيرا اتساءل ايضا مع الاخت جوليا حول الفرق بين Session و Cash فالذي اعرفه عن Cash انها تستخدم لحفظ اجزاء من الصفحة او كل الصفحة بدلا من اعادة انشاءها من جديد ويمكن تحديثها بشروط معينه ... وبصراحة اتمنى فعلا ان نعرف الفائدة منها وطرقة استخدامها

وشكرا ...

تم تعديل هذه المشاركة بواسطة القرش1 في 29 يونيو 2007 في 01:46

#22

بالنسبة لجوليا:

الفرق بين ال Cash و Session فرق جوهري:

فال Cash هو مكان تخزين له نوعان:

output caching

Fragment Caching

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

وأما ال Session فهو مكان تخزين المتحولات المتعلقة بالجلسة.

أي أن أي شخص دخل على موقعك فله Session بمعرف (SessionId) لا تتكرر (سلسلة نصية فريدة)

فبإمكاننا تخزين بيانات الدخول (اسم مستخدم , كلمة السر) أو بيانات سلة المشتريات (Shopping Cart) وغيرها من المتحولات التي تتحرر من ذاكرة السيرفر حالما يغلق المستخدم الموقع

أو عندما يخمل نشاطه في الموقع لمدة (محددة في ملف الاعدادات web.config)

الأخ القرش1

على مستوى الزبون (Browser) هنالك العديد من الأماكن التي يمكننا تخزين البيانات فيها:

1- Cookie وهي من أسرع الأماكن عند المستعرض وهي قابلة للقراءة من قبل بعض المستخدمين الخبراء

2- ViewState وهي عبارة عن HiddenField وهي جدا مفيدة في تخزين البيانات فهي تخزن بشكل مشفر في متصفح الزبون (يمكن للخبراء المتوسطين الخبرة قراءتها ببعض البرامج الخاصة)

3-HiddenField وأنا شخصيا لا أحبذ التخزين فيها مع أنها مكان رائع للتخزين ولكن ...

ماذا لو أوقف الزبون استعراض الصفحة فجأة ولم يكن الموقع قد أرسلها له فما الذي سوف يحدث في الطلب التالي للصفحة (حدث معين يعتمد على قيمتها)؟

فعلينا أن نأخذ بعين الاعتبار أن المستخدم قد يكون عنده خط ذو سرعة 2 ميغا أو 56 كيلوبايت (هل أنا محق)

ستقول لي وما الذي يدعوك للتخزين في ال ViewState وهي أصلا HiddenField

أخبرك بكل بساطة أن السيرفر يرسلها للمستعرض قبل أي شيء آخر

فهي اذا لاحظة دائما موجودة قبل كل شيء في الصفحة (تأكد من ذلك: شغل أي صفحة ASP.NET وانظر للمصدر الخاص بها وستفهم قصدي)

بالنسبة لل QueryString فهي مكان رائع لارسال الصفحات للمستعرض ولكن توقف قليلا؟

ماذا لو قام المستخدم بكتابتها بيده (مستخدم مبتدئ) فماذا سيحصل للصفحة وخصوصا اذا كنت بالأصل معتمدا عليها؟

بالنسبة لل Session ماذا لو ذهب المستخدم لشرب فنجان من القهوة وعاد للصفحة فالبيانات لن تعود صالحة بعد ...

صحيح بالنسبة لل Cash فبإمكانك تخزين قسم من الصفحة فيها وبإمكانك تخزين كامل الصفحة

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

تم تعديل هذه المشاركة بواسطة Arwany في 29 يونيو 2007 في 17:38

#23

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

بالنسبة لل cookies فمشكلتها انها قد تكون معطلة لدى المستخدم

بالنسبة لل query string فمن المؤكد سهولة استغلالها من قبل المستخدم وعادة ما يتم عملها حتى يتمكن المستخدم فعلا من استخدامها وهي الطريقة الوحيدة لجعل المستخدم يصل الى بيانات محددة من خارج النظام خذ مثلا هذا المنتدى عندما نريد ارسال رسالة بالبريد الالكتروني لشخص ما لقراءة هذا الموضوع فاننا نستخدم QueryString حتى نصل تحديدا لبيانات معينه

بالنسبة لل ViewState فهي مستخدمة اصلا من قبل الصفحة نفسها ومن قبل الادوات التي عليها لحفظ حالتها وهي تزيد من حجم الصفحة بشكل كبير اذا كانت مفعله لكل الادوات ومع انه يمكن فعلا استخدامها لتخزين اي بيانات اخرى ولكن هي في الاخير كما ذكرت HiddenField

هذا الموضوع مغلق.

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