قدمت المقالة السابقة المفاهيم الأساسية لتنفيذ أحداث التحكم المخصصة بالخادم. تشرح هذه المقالة كيفية التقاط أحداث رد الاتصال من خلال الأمثلة النموذجية.
1. تنفيذ التقاط أحداث إعادة النشر
إذا كان عنصر تحكم الخادم يحتاج إلى التقاط أحداث إعادة النشر من العميل ويريد تخصيص منطق معالجة الأحداث من جانب الخادم لأحداث إعادة النشر، فيجب على عنصر التحكم تنفيذ واجهة System.Web.UI.IPostBackEventHandler. تعريف الواجهة مدرج أدناه.
الواجهة العامة IPostBackEventHandler
{
void RaisePostBackEvent(string eventsArgument);
}
كما هو موضح في الكود أعلاه، تتضمن واجهة IPostBackEventHandler طريقة عضو واحدة فقط هي RaisePostBackEvent. تتيح هذه الطريقة لتحكم الخادم التعامل مع الأحداث التي يتم رفعها عند إرسال النموذج إلى الخادم. تمثل المعلمة الخاصة به eventsArgument معلمات الحدث الاختيارية التي سيتم تمريرها إلى معالج الحدث. يمكن للمطورين تنفيذ المنطق الذي يتم تنفيذه أثناء عملية إعادة النشر للتحكم في الخادم في طريقة RaisePostBackEvent. عادةً ما يقوم الأسلوب RaisePostBackEvent برفع حدث واحد أو أكثر من جانب الخادم. يعرض مقتطف التعليمات البرمجية التالي تطبيق RaisePostBackEvent الذي يرفع حدث Click على الخادم.
الفراغ العام RaisePostBackEvent (سلسلة الأحداث)
{
OnClick(EventArgs.Empty);
}
لتحقيق أحداث إعادة النشر، لا يكفي فقط جعل فئة التحكم في الخادم تنفذ واجهة IPostBackEventHandler وتنفذ أساليب الأعضاء في هذه الواجهة. يحتاج المطورون أيضًا إلى الاهتمام بتنفيذ أشياء أخرى. فيما يلي ثلاث نقاط رئيسية في عملية التقاط أحداث إعادة النشر.
أولاً، والأهم من ذلك، يجب أن تقوم فئة التحكم المخصصة بالخادم بتنفيذ واجهة IPostBackEventHandler وتنفيذ أسلوب RaisePostBackEvent لعضو الواجهة. لقد تم وصف هذه العملية أعلاه.
ثانياً، قم بتعيين UniqueID لعنصر التحكم.
يعد تحديد قيمة سمة الاسم لعنصر التحكم الذي يتسبب في أن يكون حدث إعادة النشر UniqueID أحد مفاتيح تنفيذ أسلوب RaisePostBackEvent بشكل صحيح. عند تشغيل إعادة النشر، يبحث إطار عمل الصفحة عن المحتوى الذي يتم إرساله ويحدد ما إذا كان اسم كائن الإرسال يتوافق مع UniqueID لعنصر تحكم الخادم الذي يطبق IPostBackEventHandler. إذا كان ذلك متطابقًا، فسيقوم إطار عمل الصفحة باستدعاء أسلوب RaisePostBackEvent في عنصر التحكم. النقطة الأساسية هنا هي أن المطورين بحاجة إلى تعيين UniqueID لسمة اسم عنصر التحكم في منطق العرض. يتم سرد مثال رمز بسيط أدناه.
تجاوز محمي عرض باطلة (إخراج HtmlTextWriter)
{
Output.Write("");
}
كما هو موضح في الكود أعلاه، في طريقة عرض التحكم، يتم تقديم زر، قيمة سمة اسمه هي UniqueID. فقط عندما يتم تعيين UniqueID لسمة اسم عنصر التحكم الذي يتسبب في إعادة النشر، يمكن التقاط حدث إعادة النشر بشكل صحيح.
ثالثًا، قم بتنفيذ بنية سمة الحدث.
تعد بنية سمة الحدث طريقة محسنة لتنفيذ الأحداث. قبل التقديم، دعونا نلقي نظرة أولاً على طرق تنفيذ حدث التحكم المشترك. الكود المحدد هو كما يلي.
...
الفئة العامة WebCustomControl:WebControl,IPostBackEventHandler{
// قم بتعريف الحدث العام لمفوض حدث النقر EventHandler Click;
// تنفيذ طريقة RaisePostBackEvent void IPostBackEventHandler.RaisePostBackEvent(string eventsArgument) {
OnClick(EventArgs.Empty);
}
// تحديد معالج حدث OnClick protected virtual void OnClick(EventArgs e) {
إذا (انقر! = فارغ) { انقر (هذا، e })؛
}
...
}
في الكود أعلاه، يتم تضمين ثلاثة محتويات رئيسية تتعلق بتعريف الحدث: 1. تحديد مفوض حدث النقر؛ 2. تنفذ فئة التحكم واجهة IPostBackEventHandler، حيث يتم تعريف معالج الحدث OnClick عند تنفيذ طريقة عضو الواجهة RaisePostBackEvent. ;3. تنفيذ معالج الأحداث OnClick. طريقة التنفيذ المذكورة أعلاه بسيطة وسهلة الاستخدام، ولكن بها عيبًا، وهو انخفاض كفاءة التنفيذ. خاصة عندما يتم تشغيل أحداث متعددة في الفصل الدراسي، فسيؤدي ذلك إلى زيادة الحمل، وإهدار الكثير من موارد الخادم، ويؤدي في النهاية إلى انخفاض كفاءة التشغيل.
من أجل حل المشكلات المذكورة أعلاه، تم تقديم بنية سمة الحدث لأسلوب تنفيذ الحدث الأمثل أدناه. تستخدم هذه البنية فئة System.ComponentModel.EventHandlerList، والتي توفر قائمة مفوضين بسيطة. باستخدام الأساليب ذات الصلة التي توفرها هذه الفئة، يمكن للمطورين معالجة قائمة تفويض معالج الأحداث الخاصة بعنصر التحكم بمرونة. على سبيل المثال، يستخدم حدث Click في عنصر التحكم بنية سمة الحدث كما يلي:
كائن ثابت محمي للقراءة فقط EventClick = new object();
حدث عام EventHandler انقر {
يضيف {
Events.AddHandler(EventClick,value);
}
يزيل {
Events.RemoveHandler(EventClick,value);
}
}
قبل تحديد بنية سمة الحدث، تحتاج أولاً إلى تعريف كائن مفوض حدث النقر. نظرًا لأنه يتم إنشاء كل حدث مرة واحدة فقط، فيجب تعريفه بأنه ثابت وقابل للقراءة فقط. ثم قم بتشغيل قائمة تفويض معالج الأحداث من خلال أساليب AddHandler وRemoveHandler في بنية الخاصية. عندما تستدعي الصفحة الحدث Click، فإنها تضيف أو تزيل المعالجات من مجموعة EventHandlerList الخاصة بعنصر التحكم. نظرًا لأن طريقة التنفيذ هذه أكثر كفاءة من طريقة التنفيذ العادية في عملية الإعلان عن أحداث متعددة، فهي طريقة موصى بها للغاية.
بالإضافة إلى ذلك، أثناء تنفيذ طريقة OnClick، عند استخدام سمة حدث، يجب استرداد المفوض من EventHandlerList وتحويله إلى نوع EventHandler.
الفراغ الظاهري المحمي OnClick(EventArgs e){
EventHandler clickHandler = (EventHandler)Events[EventClick];
إذا(clickHandler != null) {
clickHandler(this,e);
}
}
يرجى ملاحظة للقراء: بنية سمة الحدث لا تنطبق على لغة VB.NET ولا يمكن تطبيقها إلا بلغات مثل C#.
2. التطبيقات النموذجية
لنكون صادقين، من الصعب إلى حد ما فهم المقدمة النظرية المذكورة أعلاه لالتقاط أحداث إعادة النشر للقراء الذين لم ينفذوا مطلقًا أحداث التحكم في الخادم. ولتحقيق هذه الغاية، يستخدم هذا القسم مثالًا نموذجيًا لتوضيح طريقة تنفيذ التقاط أحداث الإرجاع على وجه التحديد.
يطبق هذا المثال عنصر تحكم خادم مخصص WebCustomControl. على الرغم من أن عنصر التحكم هذا يظهر كزر، إلا أنه لا يرث من فئة Button. عند النقر فوق الزر، سيؤدي عنصر التحكم إلى إعادة النشر، وسيقوم الخادم تلقائيًا بالتقاط حدث النقر الذي تم إرجاعه، وتشغيل حدث النقر، وتنفيذ معالج الحدث المقابل. فيما يلي الكود المصدري لتطبيق التحكم بالخادم:
باستخدام النظام؛ باستخدام System.Collections.Generic؛ باستخدام System.ComponentModel؛ باستخدام System.Text؛ باستخدام System.Web؛ باستخدام System.Web.UI؛ باستخدام System.Web.UI.WebControls؛ مساحة الاسم WebControlLibrary { [DefaultEvent("Click")] [ToolboxData("<{0}:WebCustomControl runat=server>{0}:WebCustomControl>")] فئة عامة WebCustomControl : WebControl، IPostBackEventHandler { // تحديد كائن تفويض حدث النقر كائن ثابت خاص للقراءة فقط EventClick = new object(); // تنفيذ خصائص حدث النقر [الوصف("انقر فوق خصائص الحدث"), الفئة("الإجراء") ] حدث عام EventHandler انقر { يضيف { Events.AddHandler(EventClick, value); } يزيل { Events.RemoveHandler(EventClick, value); } } // تجاوز طريقة عرض التحكم RenderContents تجاوز محمي RenderContents (إخراج HtmlTextWriter) { Output.Write(""); } // تنفيذ طريقة الحدث protected virtual void OnClick(EventArgs e) { EventHandler clickHandler = (EventHandler)Events[EventClick]; إذا (clickHandler != null) { clickHandler(this, e); } } // تنفيذ عضو واجهة IPostBackEventHandler void IPostBackEventHandler.RaisePostBackEvent(string eventsArgument) { OnClick(EventArgs.Empty); } } } |
<%@ لغة الصفحة = "C#" AutoEventWireup = "true" CodeFile = "Default.aspx.cs" يرث = "_Default" %> <%@ تسجيل TagPrefix="cc" Namespace="WebControlLibrary" Assembly="WebControlLibrary" %> <رئيس التشغيل = "الخادم"> الرأس> <الجسم> <معرف النموذج = "form1" runat = "الخادم"> <المركز> مركز> النموذج> الجسم> |
الشكل 1 عروض تهيئة الصفحة الشكل 2 التأثيرات بعد النقر فوق الزر |
// تحديد السمة AutoPostBack المنطق العام AutoPostBack{ تعيين { this._autoPostBack = value; } يحصل { إرجاع this._autoPostBack; } } // أضف طريقة Page.GetPostBackEventReference () في طريقة العرض تجاوز محمي عرض باطلة (إخراج HtmlTextWriter) { ... إذا (هذا.AutoPostBack) { الكاتب.WriteAttribute("ontextchanged"،javascript:" + Page.GetPostBackEventReference(this)); } ... } |