روب هوارد
عندما كنت طفلاً، كنت أقضي بضعة أسابيع كل عام في التسكع مع عائلتي الكبيرة. عندما كنت صبيًا أمريكيًا، كنت مفتونًا بالقطارات الكهربائية الهولندية، وهو شيء لم أره من قبل في مدينتي دالاس، تكساس. لقد رافقني أبناء عمومتي في رحلة على متن قاربهم لمشاهدة قطار يمر. عند الجلوس على الماء بالقرب من المسار، يمكنك سماع القطار يقترب، مثل صفارة لطيفة عبر المسار، حتى يصل إلى ذروة بطيئة عندما يمر القطار. لا يسعني إلا أن أتذكر هذا عند التفكير في ASP.NET 2.0. إن ASP.NET 2.0 قريب جدًا ويتوقع معظمنا إصداره قريبًا بفارغ الصبر لدرجة أننا نسمع "نصيحة" مفادها أن الإصدار يستمر في الارتفاع بصوت أعلى وأعلى. ثم ستتغير الطريقة التي نكتب بها البرامج مرة أخرى.
هدف Microsoft ASP.NET 2.0 هو تزويد المطورين بأداء يصل إلى 50%. ومع ذلك، يبدو أن تحسينات الأداء الفعلية تتجاوز التوقعات. تعمل ميزات التخصيص والعضوية وإدارة الأدوار الجديدة على تخفيف العبء عن المطورين، في حين تم أيضًا تبسيط الميزات الأخرى، مثل ربط البيانات. على سبيل المثال، بناء الجملة المألوف والذي لا يزال مدعومًا:
<%# DataBinder.Eval (Container.DataItem, "FirstName") %>
في ASP.NET 2.0 يمكن تبسيط الأمر إلى:
<%# Eval("FirstName") %>
لا يقتصر الأمر على وجود الكثير من الميزات الجديدة الرائعة فحسب، بل يوجد أيضًا الكثير من عناصر التحكم المفيدة في الخادم. سيصبح نموذج برمجة ASP.NET أكثر قوة في ASP.NET 2.0 بسبب تكامل العضوية مع عناصر تحكم الخادم مثل عنصر التحكم <ASP:login> وعناصر التحكم الجديدة في مصدر البيانات والتحكم في البيانات.
لقد تضاعف تقريبًا عدد مكتبات فئات System.Web في ASP.NET 2.0 - مما أدى إلى تغطية كبيرة لدرجة أنها تتطلب عمودًا في مجلة. لفهم مدى هذه التغييرات حقًا، ستحتاج إلى كتاب ASP.NET 2.0 جديد. أخطط لكتابة بعض الأعمدة هنا لتسليط الضوء على بعض الميزات الجديدة الأكثر أهمية لـ ASP.NET 2.0. سأركز هذا الشهر على التنقل وتدفق الصفحة، بدءًا من الميزة المرغوبة كثيرًا - وهي القدرة على الإرسال إلى صفحات أخرى.
التسليم عبر الصفحات
أكبر شكوى أسمعها من المطورين الذين ينتقلون إلى ASP.NET هي أن نموذج إعادة النشر للصفحة يمكن أن يحتوي على <نموذج> واحد ويمكنه فقط إعادة النشر عبر HTTP إلى أنفسهم، لذلك سيتم تشغيل كل العمليات المنطقية. هذه الصفحة.
العديد من المطورين، وخاصة أولئك الذين هم على دراية بـ ASP ويرغبون في التحكم في عنصر <form>، سيعرفون أنه في ASP يمكنك إرشاد <form> أين وكيف يتم إرسال بيانات محتواه (HTTP Post أو HTTP Get)، و نفس الصفحة كمية <النموذج>. ولكن بالمقارنة مع ASP، فإن ASP.NET يسمح فقط للصفحة بأن تحتوي على <form runat=server> واحد فقط، ولا يمكن نشرها إلا مرة أخرى إلى نفسها. يمكن أن يكون هذا محبطًا للغاية فيما يلي مثال لما يتم إرساله إلى الصفحات الأخرى في ASP.NET 2.0:
<%@ Page MasterPageFile="~/Site.master" Language="C#"
ملف الكود = "Source.aspx.cs"
يرث = "المصدر" %>
<ASP:معرف المحتوى = "المحتوى الرئيسي"
ContentPlaceHolderID = "الرئيسي" Runat = "الخادم">
أدخل اسمك:
<ASP:TextBox ID="NameBox" Runat="server"></ASP:TextBox>
<ASP:Button ID = "Button1" Runat = "server" Text = "إرسال" />
</ASP:المحتوى>
يتم استخدام الصفحات الرئيسية للتحكم في تخطيط الصفحة، مع كتلة <ASP:content> وبعض عناصر تحكم الخادم لقبول إدخال المستخدم.
إذا كنت تخطط لتمرير المحتوى إلى صفحة أخرى، فيمكنك استخدام رمز الخادم المشابه لما يلي:
Response.Redirect("Target.aspx?Name= " +
HttpUtility.UrlEncode(NameBox.Text));
المشكلة في هذه التقنية هي أنه عندما ينقر المستخدم على الزر للإرسال، يقبل الخادم الطلب ويرسل استجابة لإعادة توجيه المتصفح إلى Target.aspx. لقد بذلت مثل هذه المشكلة البسيطة الكثير من العمل!
هل يمكن تبسيط العمل؟ في ASP.NET 2.0 الجواب هو نعم. بعد ذلك، قم بشرح التعليمات البرمجية المحسنة:
<%@ Page MasterPageFile="~/Site.master" Language="C#"
ملف الكود = "Source.aspx.cs"
يرث = "المصدر" %>
<ASP:معرف المحتوى = "المحتوى الرئيسي"
ContentPlaceHolderID = "الرئيسي" Runat = "الخادم">
أدخل اسمك:
<ASP:TextBox ID="NameBox" Runat="server"></ASP:TextBox>
<ASP:معرف الزر = "Button1" Runat = "الخادم" النص = "إرسال"
PostBackUrl="~/Target.aspx" />
</ASP:المحتوى>
لاحظ سمة PostBackUrl في <ASP:Button>. تخبر هذه السمة الزر بعدم إجراء إعادة النشر الافتراضية ولكن بإرسال البيانات مباشرة إلى Target.aspx،
ربما تتساءل عن كيفية عمل ذلك، خاصة إذا كنت معتادًا على ASP.NET ViewState هدف. ولكن هذا خارج نطاق هذه المقالة، فعند استخدام ميزة التسليم عبر الصفحات، سيتم إضافة حقل مخفي جديد إلى الصفحة:
<input type="hidden" name="__PREVIOUSPAGE" id="__PREVIOUSPAGE"
القيمة = "p1-dFHlCpgH2alr1vkr3G21UIR7jOuzn074led6lbGf1KQ47_F25GwG0" />
إنها تشبه إلى حد ما حالة العرض التي تم إنشاؤها بواسطة شجرة التحكم، ولكنها جزء من حالة العرض التي تتحقق من صحة الصفحة للتسليم عبر الصفحات. كما تعلم، عندما يتم النشر المتبادل لصفحة إلى صفحة أخرى، يجب أن تكون الصفحة المتلقية قادرة على الوصول إلى مثيل صفحة النشر. في هذه الحالة، فهذا يعني أن Target.ASP يمكنه الوصول إلى تفاصيل Source.aspx. في الواقع، هناك أسلوب أكثر فعالية وهو الوصول إلى واجهة برمجة التطبيقات (API) من Source.aspx إلى Target.aspx من خلال مدير مكتوب بقوة. من أجل الوصول إلى صفحة التسليم (الصفحة السابقة)، يوفر ASP.NET2.0 سمة صفحة للتسليم عبر الصفحات: الصفحة السابقة.
تقوم PreviousPage بإرجاع مثيل صفحة التسليم، وهناك أيضًا خاصية تُستخدم للتحقق مما إذا كان يتم التسليم عبر الصفحات: IsCrossPagePostBack. تشبه هذه الخاصية خاصية IsPostBack الموجودة ولكنها تُرجع صحيحًا فقط في حالة حدوث منشور عبر الصفحات.
يمكن أن تتصرف خاصية الصفحة السابقة بشكل مختلف. تقوم القيمة الافتراضية ببساطة بإرجاع مثيل للصفحة السابقة كنوع صفحة، ومع ذلك، باستخدام توجيه جديد، يمكنك جعل خاصية الصفحة السابقة ترجع مثيلًا مكتوبًا بقوة للوصول إلى الأعضاء العامين في الصفحة. على سبيل المثال، قم بإضافة التعليمة البرمجية التالية إلى Target.aspx:
<%@ PreviousPageType VirtualPath="~/Source.aspx" %>
يمكنك الآن استخدام خاصية PreviousPage على Target.aspx للوصول إلى بيانات Source.aspx. ومع ذلك، للوصول إلى عنصر تحكم الخادم، مثل NameBox على Source.aspx، تحتاج أيضًا إلى كتابة التعليمات البرمجية التالية:
TextBox nameBox = PreviousPage.FindControl("NameBox") as TextBox
وبعبارة أخرى، يجب عليك استخدام FindControl الوصول إلى شجرة التحكم لماذا؟ يتحكم الخادم بشكل افتراضي في متغيرات الأعضاء المحمية لكي يكون لديك وصول بسيط إلى عناصر الصفحة السابقة، تحتاج إلى كشف الخاصية أو الأسلوب على Source.aspx كعام، ثم ستعمل التعليمات البرمجية التالية: TextBox nameBox. = PreviousPage.NameBox;
يعد التسليم عبر الصفحات ميزة رائعة في ASP.NET. هناك بعض المقالات التي تناقش التفاصيل الفنية للتسليم عبر الصفحات بشكل متعمق، إذا كنت مهتمًا بكيفية عمل التسليم عبر الصفحات، فيمكنك التحقق من ذلك خارج قطع دينو إسبوزيتو في عدد سبتمبر من عمود حافة مجلة MSDN (يرجى الاطلاع على ترجمتي: نموذج ASP.NET (ترجمة)). من المحتمل أيضًا أن تجد أنه إذا كنت ماهرًا في ASP.NET، فسوف تستمر في استخدام نموذج إعادة النشر القياسي للصفحة في معظم الأوقات. (المترجم: المعنى الضمني هو أنه إذا كنت خبيرًا، فسوف تزدري هذه الميزة)
يمكنلعنصر تحكم المعالج
بسهولة إنشاء وظيفة تنقل معقدة للتطبيق من خلال التسليم عبر الصفحات. ومع ذلك، فإن هذه الميزة لا تسهل إنشاء واجهات مستخدم بنمط المعالج. غالبًا ما يتم تصميم واجهات المستخدم ذات نمط المعالج، سواء كانت خطية أو غير خطية، لإنجاز المهام. فهو يوفر للمستخدمين النهائيين طريقة سهلة الاستخدام لإكمال سلسلة معقدة من الخطوات، كل واحدة منها مقسمة إلى أجزاء.
في ASP.NET 1.x، غالبًا ما يتم تنفيذ المعالجات باستخدام بعض الحيل: وضع عناصر تحكم خادم <ASP:panel> متعددة في نفس الصفحة وتبديل الرؤية بناءً على موقع المستخدم. إن كتابة المعالج في ASP.NET ليست مهمة سهلة، حيث يتخلى العديد من المصممين عن المعالج، كما أن إدارة عملية الخطوة مربكة أيضًا.
يمكن استخدام إمكانات التسليم عبر الصفحات الجديدة في ASP.NET لحل مشكلة المعالج، ولكنها تمثل أيضًا تحديًا عندما يكون التنقل غير الخطي مطلوبًا. على سبيل المثال، الخطوة 1، الخطوة 2، تخطي الخطوات 3-5، الخطوة 6، الخطوة 3، الخطوة 2، الخطوة 6، عنصر تحكم معالج ASP.NET 2.0 يحل معظم هذه المشكلات. بالإضافة إلى ذلك، يمكن الوصول بشكل مستمر إلى جميع عناصر الإدخال الخاصة بمعالج التسليم عبر الصفحات من خلال نموذج إعادة النشر للصفحة.
وظيفة التحكم في المعالج قريبة جدًا من طريقة إخفاء اللوحات في ASP.NET 1.1. ومع ذلك، يعرض عنصر تحكم المعالج سلسلة من <ASP:WizardStep>، والتي يمكن أن تحتوي على أي عدد من عناصر التحكم التابعة، ومع ذلك، يحتاج كل <ASP:WizardStep> إلى معرف فريد خاص به، راجع الشكل 1. تدير صفحة التحكم في المعالج كل التنقل، وتدعم التنقل الخطي وغير الخطي، وتتمتع بدعم كامل في وقت التصميم. يوضح الشكل 2 تحكم المعالج، الجانب الأيسر هو التنقل غير الخطي المستند إلى الارتباط، والجانب الأيمن السفلي هو التنقل الخطي بالزر. من قائمة المهام التي يتم فتحها، لا يمكنك رؤية مهمة شائعة فحسب، بل يمكنك أيضًا رؤية قائمة من الخطوات التي تسمح بالتبديل بين الخطوات في وقت التصميم.
الشكل 2: المعالج في Visual Studio
كافة العناصر المرئية لعنصر تحكم المعالج قابلة للتكوين. يمكن استبدال الارتباطات غير الخطية بأزرار أو حذف الإدخالات، ويمكن أيضًا تغيير عناصر التنقل الخطي السابقة والتالية والمكتملة إلى أزرار صور أو روابط. في الواقع، يمكن تكوين جميع جوانب التحكم من خلال القوالب.
كانت إحدى الصعوبات في كتابة عناصر تحكم المعالج في ASP.NET 1.1 هي إدارة المكان الذي يجب أن يتواجد فيه المستخدم. يعمل عنصر تحكم المعالج على تبسيط هذه المهمة عن طريق الكشف عن خاصية ActiveStep. يمكن لخاصية ActiveStep الاستعلام وتحديد الخطوة النشطة حاليًا. سيستمر التدفق الطبيعي للمعالج كما هو معلن بواسطة التنفيذ، ويمكن تغيير التدفق في أي وقت من خلال أسلوب MoveTo. من خلال MoveTo، يمكن تعيين أي خطوة كـ ActiveStep للمساعدة في التنقل والمعالجة، يتم توفير العديد من الأحداث أيضًا، انظر الشكل 3.
يعد عنصر تحكم المعالج الجديد مفيدًا جدًا عند جمع معلومات المستخدم، فأنت لا ترغب في كتابة كافة الهياكل الأساسية في ASP.NET 1.1، وقد قام ASP.NET بكل العمل نيابةً عنك. يعد عنصر تحكم المعالج مفيدًا جدًا لدرجة أن فريق ast.net يستخدمه كفئة أساسية لعنصر التحكم CreateUserWizard، والذي يُستخدم لإنشاء مستخدمين كجزء من وظيفة العضوية.
يمنحقسم
النشر عبر الصفحات وعنصر التحكم <ASP:Wizard> لمطوري ASP.NET العديد من الخيارات الجديدة للتحكم في تدفق التنقل في تطبيقاتهم. يعد التسليم عبر الصفحات مفيدًا في المواقف التي تحتاج فيها حاليًا إلى استخدام Response.Redirect أو Server.Transfer. تعتبر عناصر تحكم المعالج رائعة لإنشاء مجموعات بيانات معقدة تتطلب جمع بيانات خطية وغير خطية.
-------------------------------------------------- ------
الشكل 1: خطوات المعالج
<ASP:Wizard runat="server">
<خطوات المعالج>
<ASP:WizardStep ID="Step1">
مرحباً!
</ASP:WizardStep>
<ASP:WizardStep ID="Step2">
ما هو اسمك: [TextBox1]
[زر1]
</ASP:WizardStep>
<ASP:WizardStep ID="Step3">
شكرا لك، [TextBox1.Text]!
</ASP:WizardStep>
</معالج الخطوات>
</ASP:Wizard>
-------------------------------------------- --- ----------
الشكل 3 أحداث التنقل
وصف | الحدث |
---|---|
ActiveStepChanged | عند تعيين ActiveStep إلى WizardStep جديد |
CancelButtonClick | Raised عند النقر فوق الزر المحدد كزر Cancel |
FinishButtonClick | Raised عند النقر فوق الزر المحدد كزر Finish |
NextButtonClick | Raised عندما يتم تحديد الزر على أنه Next يتم النقر فوق الزر |
السابق | ،انقر فوق الزر المرفوع عند النقر فوق الزر المحدد على أنه الزر السابق، |
SideBarButtonClick | مرفوع عند النقر فوق أحد روابط أو أزرار الشريط الجانبي |