في تطبيقات ASP.NET، توجد طرق عديدة للتنقل بين نماذج الويب: استخدام الارتباطات التشعبية، أو استخدام Response.Redirect، أو استخدام Server.Transfer، أو استخدام Server.Execute. ستحلل هذه المقالة أوجه التشابه والاختلاف والمزايا والعيوب بين طرق التنقل الأربعة هذه لمساعدتك في اختيار أفضل طريقة للتنقل.
1. الارتباط التشعبي
إن أبسط طريقة لإدخال نموذج آخر من نموذج واحد هي استخدام عنصر تحكم الارتباط التشعبي بتنسيق HTML. في نموذج ويب، استخدم فئة تعليمات HTML البرمجية للارتباطات التشعبية مثل:
<a href="WebForm2.aspx">Enter Form 2</a>
عندما ينقر المستخدم على الارتباط التشعبي، يتم تنفيذ WebForm2.aspx ويتم إرسال النتيجة إلى المتصفح. يمكن استخدام التنقل عبر الارتباط التشعبي في أي مكان تقريبًا، بما في ذلك صفحات HTML وصفحات ASP العادية. يوفر ASP.NET أيضًا طريقة بديلة أخرى، وهي عنصر تحكم خادم HyperLink:
<form id="Form1" Method="post" runat="server">
<asp:HyperLink id="HyperLink1" runat=" server"
NavigateUrl="WebForm2" .aspx">أدخل النموذج 2</asp:HyperLink>
</form>
نتيجة تشغيل تعليمة HTML البرمجية أعلاه هي نفس المثال الأول، لأن ASP.NET يتعامل مع عنصر تحكم خادم HyperLink Web كعنصر تحكم HTML super Link. ولكن هناك فرق واحد مهم بين الاثنين. يمكن برمجة عناصر تحكم خادم الويب HyperLink على جانب الخادم. على وجه التحديد، يمكن تغيير خاصية NavigateUrl الخاصة بها في كود البرنامج، مما يسمح بإنشاء ارتباطات تشعبية يمكن أن تتغير أهدافها المحددة ديناميكيًا بناءً على الحالة الحالية للتطبيق، على سبيل المثال:
Private Sub Button1_Click( _
ByVal sender As System.Object, _
ByVal e كـ System.EventArgs) _
يعالج Button1.Click
HyperLink1.NavigateUrl = "WebForm3.aspx"
End Sub
بعد تنفيذ هذا الرمز، إذا قام المستخدم بالنقر فوق الارتباط، فسوف يرى WebForm3.aspx بدلاً من WebForm2.aspx.
2. استخدم البرنامج للتحكم في إعادة التوجيه
على الرغم من أن الارتباطات التشعبية يمكنها التنقل من صفحة إلى أخرى، إلا أن طريقة التنقل هذه يتم التحكم فيها بالكامل من قبل المستخدم. في بعض الأحيان، قد نحتاج إلى استخدام التعليمات البرمجية للتحكم في عملية التنقل بأكملها، بما في ذلك وقت الانتقال إلى صفحة أخرى. في هذه المواقف، يكون لدى ASP.NET ثلاث طرق مختلفة لتحقيق أغراض مماثلة: استدعاء أسلوب إعادة التوجيه لكائن الاستجابة، واستدعاء أسلوب النقل أو التنفيذ لكائن الخادم. إن سلوك طرق التنقل الثلاث هذه متشابه بشكل أساسي، ولكن هناك اختلافات.
2.1 Response.Redirect
تؤدي طريقة Response.Redirect إلى ربط المتصفح بعنوان URL محدد. عندما يتم استدعاء الأسلوب Response.Redirect()، فإنه يقوم بإنشاء استجابة برمز الحالة 302 (يشير إلى أن الهدف قد تغير) وعنوان URL الهدف الجديد في رؤوس الاستجابة. يتلقى المتصفح الاستجابة من الخادم ويستخدم المعلومات الموجودة في رأس الاستجابة لإصدار طلب لعنوان URL الجديد.
وهذا يعني أنه عند استخدام طريقة Response.Redirect، تحدث عملية إعادة التوجيه من جانب العميل وتتضمن اتصالين إجمالاً مع الخادم (رحلتان ذهابًا وإيابًا): الأولى هي طلب للصفحة الأصلية، والتي تحصل على الرد 302، والمرة الثانية هي طلب الصفحة الجديدة المعلن عنها في الرد 302 والحصول على الصفحة بعد إعادة التوجيه.
2.2 Server.Transfer
تقوم طريقة Server.Transfer بنقل تدفق التنفيذ من ملف ASPX الحالي إلى صفحة ASPX أخرى على نفس الخادم. عند استدعاء Server.Transfer، يتم إنهاء تنفيذ صفحة ASPX الحالية ويتم نقل تدفق التنفيذ إلى صفحة ASPX أخرى، لكن صفحة ASPX الجديدة لا تزال تستخدم دفق الاستجابة الذي تم إنشاؤه بواسطة صفحة ASPX السابقة.
إذا كنت تستخدم طريقة Server.Transfer للتنقل بين الصفحات، فلن يتغير عنوان URL في المتصفح، لأن إعادة التوجيه تتم بالكامل من جانب الخادم، ولا يعرف المتصفح أن الخادم قد أجرى تغييرًا في الصفحة.
افتراضيًا، لا تقوم طريقة Server.Transfer بتمرير بيانات النموذج أو سلاسل الاستعلام من صفحة إلى أخرى، ولكن طالما تم تعيين المعلمة الثانية للطريقة على True، يمكن الحفاظ على بيانات النموذج الخاصة بالصفحة الأولى والاستعلام عنها خيط.
في الوقت نفسه، يجب ملاحظة شيء واحد عند استخدام Server.Transfer: ستستخدم الصفحة المستهدفة تدفق الاستجابة الذي أنشأته الصفحة الأصلية، مما يجعل فحص مصادقة الجهاز (MAC) الخاص بـ ASP.NET يعتقد أن حالة العرض للصفحة الجديدة تم العبث بها. لذلك، إذا كنت تريد الاحتفاظ ببيانات النموذج ومجموعة سلسلة الاستعلام الخاصة بالصفحة الأصلية، فيجب عليك تعيين خاصية EnableViewStateMac لتوجيه الصفحة للصفحة المستهدفة إلى False.
2.3 Server.Execute
يسمح أسلوب Server.Execute لصفحة ASPX الحالية بتنفيذ صفحة ASPX محددة على نفس خادم الويب. عند تنفيذ صفحة ASPX المحددة، يعود تدفق التحكم إلى الموقع الذي أصدرت فيه الصفحة الأصلية Server.Execute يتصل.
تشبه طريقة التنقل في الصفحة هذه استدعاء دالة لصفحة ASPX. يمكن للصفحة المطلوبة الوصول إلى بيانات النموذج ومجموعة سلاسل الاستعلام الخاصة بالصفحة المستدعية، لذلك يجب تعيين خاصية EnableViewStateMac لأمر الصفحة للصفحة المطلوبة على False.
افتراضيًا، يتم إلحاق مخرجات الصفحة المطلوبة بتدفق الاستجابة الحالي. ومع ذلك، فإن الأسلوب Server.Execute لديه أسلوب محمّل بشكل زائد يسمح بالحصول على إخراج الصفحة المطلوبة من خلال كائن TextWriter (أو كائنه الفرعي، مثل كائن StringWriter)، بدلاً من إلحاقه مباشرة بتدفق الإخراج، لذلك أنه في الصفحة الأصلية يمكنك بسهولة ضبط موقع نتائج الإخراج للصفحة المطلوبة.
لتوضيح عملية العمل، فلنقم بإنشاء نموذج ويب، ووضع عنصر تحكم في الزر (Button1) وعنصر تحكم في النص (Literal1)، والتبديل إلى عرض التعليمات البرمجية في واجهة التصميم، وإضافة عبارة Imports لمساحة الاسم System.IO، و ثم قم بإضافة التعليمات البرمجية التي تم تنفيذها عندما ينقر المستخدم على الزر:
Private Sub Button1_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click
Dim sw As StringWriter = New StringWriter()
Server.Execute( "WebForm2.aspx"، sw)
Literal1.Text = sw.ToString()
End Sub
ثم قم بإنشاء صفحة ثانية WebForm2.aspx لنفس تطبيق الويب. انتقل إلى عرض HTML للصفحة وقم بتعديل توجيه الصفحة الخاص بها لتعطيل التحقق من حالة العرض:
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm2.aspx.vb"
Inherits="Navigate.WebForm2" EnableViewStateMac= "false "%>
انتقل إلى عرض التصميم مرة أخرى وأضف بعض عناصر التحكم إلى الصفحة الثانية. بعد ذلك، قم بتعيين الصفحة الأولى كصفحة افتراضية وابدأ التطبيق. انقر فوق الزر، وسيتم عرض عنصر التحكم في WebForm2 حيث تم وضع الزر الحرفي في WebForm1، كما هو موضح في الشكل 1. لاحظ أن عنوان الصفحة وعنوان URL لا يزالان يعرضان الصفحة الأصلية WebForm1.
الشكل 1: استخدم Server.Execute لدمج ملفين مصدريين
عند استخدام أسلوب Server.Transfer أو Server.Execute لتنفيذ التنقل، هناك شيء واحد يجب ملاحظته: قد لا تكون الصفحة الأخيرة صفحة HTML قانونية، لأن الصفحة عادت في النهاية إلى قد يحتوي العميل على علامات <HTML> و<BODY> متعددة. يبدو أن Internet Explorer يتسامح مع هذا الموقف ويتعامل معه بشكل صحيح، ولكن إذا كنت تريد استخدام متصفح آخر، فمن الأفضل أن تختبره بعناية.
3. المقارنة والاختيار
نظرًا لوجود العديد من الطرق للتنقل من صفحة إلى أخرى، فكيف يمكنك اختيار أفضل طريقة للتنقل؟ فيما يلي بعض العوامل التي يجب وضعها في الاعتبار:
· تعتبر الارتباطات التشعبية هي الأفضل إذا كنت تريد أن يقرر المستخدمون متى يقومون بتبديل الصفحات والصفحة التي سينتقلون إليها.
·إذا كنت تريد استخدام برنامج للتحكم في هدف التحويل، ولكن يتم تحديد توقيت التحويل بواسطة المستخدم، فاستخدم عنصر تحكم HyperLink الخاص بخادم الويب لتعيين خاصية NavigateUrl الخاصة به ديناميكيًا.
·إذا كنت تريد توصيل المستخدم بمورد على خادم آخر، فاستخدم Response.Redirect.
· استخدم Response.Redirect لتوصيل المستخدمين بموارد غير تابعة لـ ASPX، مثل صفحات HTML.
· إذا كنت تريد الاحتفاظ بسلسلة الاستعلام كجزء من عنوان URL، فاستخدم Response.Redirect.
·إذا كنت تريد نقل عملية التنفيذ إلى صفحة ASPX أخرى على نفس خادم الويب، فيجب عليك استخدام Server.Transfer بدلاً من Response.Redirect، لأن Server.Transfer يمكنه تجنب اتصالات الشبكة غير الضرورية، وبالتالي الحصول على أداء وتأثيرات تصفح أفضل.
· إذا كنت تريد التقاط نتائج الإخراج لصفحة ASPX واحدة ثم إدراج النتائج في صفحة ASPX أخرى في موقع محدد، فاستخدم Server.Execute.
·إذا كنت تريد التأكد من أن مخرجات HTML قانونية، فيرجى استخدام Response.Redirect، ولا تستخدم أسلوب Server.Transfer أو Server.Execute.
تمت ترجمة هذه المقالة من: http://www.ondotnet.com/pub/a/dotnet/2003/04/07/aspnetnav.html