บทความก่อนหน้านี้แนะนำแนวคิดพื้นฐานของการนำเหตุการณ์การควบคุมเซิร์ฟเวอร์แบบกำหนดเองไปใช้ บทความนี้จะอธิบายวิธีการบันทึกเหตุการณ์การติดต่อกลับผ่านตัวอย่างทั่วไป
1. ใช้การจับภาพเหตุการณ์ postback
หากตัวควบคุมเซิร์ฟเวอร์จำเป็นต้องจับภาพเหตุการณ์ postback จากไคลเอ็นต์และต้องการปรับแต่งตรรกะการประมวลผลเหตุการณ์ฝั่งเซิร์ฟเวอร์สำหรับเหตุการณ์ postback ตัวควบคุมจะต้องใช้อินเทอร์เฟซ System.Web.UI.IPostBackEventHandler คำจำกัดความของอินเทอร์เฟซแสดงอยู่ด้านล่าง
อินเทอร์เฟซสาธารณะ IPostBackEventHandler
-
เป็นโมฆะ RaisePostBackEvent (สตริง eventArgument);
}
ดังที่แสดงในโค้ดด้านบน อินเทอร์เฟซ IPostBackEventHandler มีเมธอดสมาชิก RaisePostBackEvent เพียงวิธีเดียวเท่านั้น วิธีการนี้ช่วยให้การควบคุมเซิร์ฟเวอร์สามารถจัดการเหตุการณ์ที่เกิดขึ้นเมื่อมีการส่งแบบฟอร์มไปยังเซิร์ฟเวอร์ พารามิเตอร์ eventArgument แสดงถึงพารามิเตอร์เหตุการณ์ทางเลือกที่จะส่งผ่านไปยังตัวจัดการเหตุการณ์ นักพัฒนาสามารถใช้ตรรกะที่ดำเนินการในระหว่างกระบวนการ postback ควบคุมเซิร์ฟเวอร์ในวิธี RaisePostBackEvent โดยทั่วไปแล้ว วิธีการ RaisePostBackEvent จะทำให้เกิดเหตุการณ์ฝั่งเซิร์ฟเวอร์อย่างน้อยหนึ่งเหตุการณ์ ข้อมูลโค้ดต่อไปนี้แสดงการใช้งาน RaisePostBackEvent ที่ทำให้เกิดเหตุการณ์การคลิกบนเซิร์ฟเวอร์
โมฆะสาธารณะ RaisePostBackEvent (String eventArgument)
-
OnClick(EventArgs.ว่าง);
}
เพื่อให้บรรลุการจับเหตุการณ์ postback การทำให้คลาสควบคุมเซิร์ฟเวอร์ใช้อินเทอร์เฟซ IPostBackEventHandler และใช้วิธีสมาชิกของอินเทอร์เฟซนี้ไม่เพียงพอ นักพัฒนายังต้องใส่ใจกับการนำสิ่งอื่นๆ ไปใช้ด้วย รายการด้านล่างคือประเด็นสำคัญสามประการในกระบวนการบันทึกเหตุการณ์ Postback
อันดับแรก และที่สำคัญที่สุด คลาสการควบคุมเซิร์ฟเวอร์แบบกำหนดเองต้องใช้อินเทอร์เฟซ IPostBackEventHandler และใช้เมธอด RaisePostBackEvent ของสมาชิกอินเทอร์เฟซ กระบวนการนี้ได้ถูกอธิบายไว้ข้างต้น
ประการที่สอง กำหนด UniqueID ให้กับตัวควบคุม
การกำหนดค่าแอตทริบิวต์ชื่อของตัวควบคุมที่ทำให้เหตุการณ์ postback เป็น UniqueID เป็นหนึ่งในกุญแจสำคัญในการใช้วิธี RaisePostBackEvent อย่างถูกต้อง เมื่อมีการทริกเกอร์ postback กรอบงานเพจจะค้นหาเนื้อหาที่ถูกส่ง และกำหนดว่าชื่อของวัตถุที่ส่งสอดคล้องกับ UniqueID ของตัวควบคุมเซิร์ฟเวอร์ที่ใช้ IPostBackEventHandler หรือไม่ หากสอดคล้องกัน กรอบหน้าจะเรียกเมธอด RaisePostBackEvent บนตัวควบคุม จุดสำคัญที่นี่คือ นักพัฒนาจำเป็นต้องกำหนด UniqueID ให้กับแอตทริบิวต์ชื่อของตัวควบคุมในตรรกะในการแสดงผล ตัวอย่างโค้ดอย่างง่ายแสดงอยู่ด้านล่าง
ป้องกันแทนที่เป็นโมฆะ Render (เอาต์พุต HtmlTextWriter)
-
output.Write("<INPUT TYPE=submit name="+this.UniqueID+"Value='คลิกฉัน' />");
}
ดังที่แสดงในโค้ดด้านบน ในวิธีการควบคุมการแสดงผล Render ปุ่มจะถูกนำเสนอ ซึ่งมีค่าแอตทริบิวต์ของชื่อเป็น UniqueID เฉพาะเมื่อแอตทริบิวต์ชื่อของตัวควบคุมที่ทำให้เกิดการ postback ได้รับมอบหมาย UniqueID เท่านั้นที่สามารถจับภาพเหตุการณ์ postback ได้อย่างถูกต้อง
ประการที่สาม ใช้โครงสร้างคุณลักษณะของเหตุการณ์
โครงสร้างแอตทริบิวต์ของเหตุการณ์เป็นวิธีที่เหมาะสมที่สุดในการดำเนินกิจกรรม ก่อนที่จะแนะนำ ก่อนอื่นเรามาดูวิธีการใช้เหตุการณ์การควบคุมทั่วไปกันก่อน รหัสเฉพาะมีดังนี้
-
WebCustomControl ระดับสาธารณะ: WebControl, IPostBackEventHandler {
//ประกาศเหตุการณ์คลิก มอบหมายเหตุการณ์สาธารณะ EventHandler คลิก;
// ใช้วิธีการ RaisePostBackEvent เป็นโมฆะ IPostBackEventHandler.RaisePostBackEvent (สตริง eventArgument) {
OnClick(EventArgs.ว่าง);
-
//กำหนดตัวจัดการเหตุการณ์ OnClick ที่ได้รับการป้องกันเป็นโมฆะเสมือน OnClick (EventArgs e) {
ถ้า (คลิก != null) { คลิก (นี้,e); }
-
-
}
ในโค้ดข้างต้น มีเนื้อหาสำคัญสามประการที่เกี่ยวข้องกับคำจำกัดความของเหตุการณ์: 1. กำหนดผู้รับมอบสิทธิ์เหตุการณ์ Click; 2. คลาสควบคุมใช้อินเทอร์เฟซ IPostBackEventHandler ซึ่งตัวจัดการเหตุการณ์ OnClick ถูกกำหนดไว้เมื่อใช้เมธอดสมาชิกอินเทอร์เฟซ RaisePostBackEvent ;3. ใช้ตัวจัดการเหตุการณ์ OnClick วิธีการนำไปใช้ข้างต้นนั้นเรียบง่ายและใช้งานง่าย แต่มีข้อบกพร่องนั่นคือประสิทธิภาพการดำเนินการต่ำ โดยเฉพาะอย่างยิ่งเมื่อมีการทริกเกอร์หลายเหตุการณ์ในคลาส จะเพิ่มโอเวอร์เฮด เปลืองทรัพยากรเซิร์ฟเวอร์จำนวนมาก และส่งผลให้ประสิทธิภาพการดำเนินงานลดลงในที่สุด
เพื่อที่จะแก้ไขปัญหาข้างต้น จึงได้มีการแนะนำโครงสร้างแอตทริบิวต์เหตุการณ์วิธีการดำเนินเหตุการณ์ที่ได้รับการปรับปรุงให้เหมาะสมด้านล่างนี้ โครงสร้างนี้ใช้คลาส System.ComponentModel.EventHandlerList ซึ่งมีรายชื่อผู้รับมอบสิทธิ์แบบธรรมดา โดยใช้วิธีการที่เกี่ยวข้องโดยคลาสนี้ นักพัฒนาสามารถจัดการรายชื่อผู้รับมอบสิทธิ์ตัวจัดการเหตุการณ์ของตัวควบคุมได้อย่างยืดหยุ่น ตัวอย่างเช่น เหตุการณ์คลิกในตัวควบคุมใช้โครงสร้างแอตทริบิวต์ของเหตุการณ์ดังนี้:
วัตถุแบบอ่านอย่างเดียวคงที่ที่ได้รับการป้องกัน EventClick = วัตถุใหม่();
กิจกรรมสาธารณะ EventHandler คลิก{
เพิ่ม {
Events.AddHandler(EventClick ค่า);
-
ลบ {
Events.RemoveHandler (EventClick, ค่า);
-
}
ก่อนที่จะกำหนดโครงสร้างแอ็ตทริบิวต์เหตุการณ์ คุณต้องกำหนดออบเจ็กต์ผู้รับมอบสิทธิ์เหตุการณ์ Click ก่อน เนื่องจากแต่ละเหตุการณ์ถูกสร้างขึ้นเพียงครั้งเดียว จึงต้องประกาศแบบคงที่และอ่านอย่างเดียว จากนั้น ดำเนินการรายการผู้รับมอบสิทธิ์ตัวจัดการเหตุการณ์โดยใช้วิธี AddHandler และ RemoveHandler ในโครงสร้างคุณสมบัติ เมื่อเพจเรียกเหตุการณ์คลิก จะเพิ่มหรือลบตัวจัดการออกจากคอลเลกชัน EventHandlerList ของตัวควบคุม เนื่องจากวิธีการนำไปใช้นี้มีประสิทธิภาพมากกว่าวิธีการนำไปใช้ทั่วไปในกระบวนการประกาศของหลายเหตุการณ์ จึงเป็นวิธีที่แนะนำเป็นอย่างยิ่ง
นอกจากนี้ ในระหว่างการนำเมธอด OnClick ไปใช้ เมื่อใช้แอตทริบิวต์เหตุการณ์ จะต้องดึงข้อมูลผู้รับมอบสิทธิ์จาก EventHandlerList และแปลงเป็นประเภท EventHandler
โมฆะเสมือนที่ได้รับการป้องกัน OnClick (EventArgs e) {
EventHandler clickHandler = (EventHandler) เหตุการณ์ [EventClick];
ถ้า (clickHandler != null) {
คลิกHandler(นี้,e);
-
}
โปรดทราบถึงผู้อ่าน: โครงสร้างแอตทริบิวต์เหตุการณ์ไม่สามารถใช้ได้กับภาษา VB.NET และสามารถใช้ได้เฉพาะในภาษาเช่น C# เท่านั้น
2. การใช้งานทั่วไป
พูดตามตรง การแนะนำทางทฤษฎีข้างต้นเกี่ยวกับการจับเหตุการณ์ postback นั้นค่อนข้างยากที่จะเข้าใจสำหรับผู้อ่านที่ไม่เคยใช้งานเหตุการณ์การควบคุมเซิร์ฟเวอร์ ด้วยเหตุนี้ ส่วนนี้จึงใช้ตัวอย่างทั่วไปเพื่ออธิบายวิธีการนำไปใช้ในการจับเหตุการณ์การส่งคืนโดยเฉพาะ
ตัวอย่างนี้ใช้การควบคุมเซิร์ฟเวอร์แบบกำหนดเอง WebCustomControl แม้ว่าการควบคุมนี้จะปรากฏเป็นปุ่ม แต่ก็ไม่ได้สืบทอดมาจากคลาสปุ่ม เมื่อคลิกปุ่ม การควบคุมจะทำให้เกิดการย้อนกลับ และเซิร์ฟเวอร์จะบันทึกเหตุการณ์การคลิกที่ส่งคืนโดยอัตโนมัติ ทริกเกอร์เหตุการณ์การคลิก และดำเนินการตัวจัดการเหตุการณ์ที่เกี่ยวข้อง ต่อไปนี้เป็นซอร์สโค้ดของการดำเนินการควบคุมเซิร์ฟเวอร์:
ใช้ระบบ; ใช้ System.Collections.Generic; โดยใช้ System.ComponentModel; ใช้ System.Text; ใช้ System.Web; โดยใช้ System.Web.UI; ใช้ System.Web.UI.WebControls; เนมสเปซ WebControlLibrary { [DefaultEvent ("คลิก")] [ToolboxData("<{0}:WebCustomControl runat=server></{0}:WebCustomControl>")] WebCustomControl ระดับสาธารณะ: WebControl, IPostBackEventHandler { //กำหนดวัตถุการมอบหมายเหตุการณ์คลิก วัตถุแบบอ่านอย่างเดียวแบบคงที่ส่วนตัว EventClick = วัตถุใหม่ (); //ใช้คุณสมบัติเหตุการณ์คลิก [คำอธิบาย("คุณสมบัติเหตุการณ์คลิก"), หมวดหมู่("การกระทำ") ] กิจกรรมสาธารณะ EventHandler คลิก { เพิ่ม { Events.AddHandler (EventClick, ค่า); - ลบ { Events.RemoveHandler (EventClick, ค่า); - - // แทนที่วิธีการเรนเดอร์การควบคุม RenderContents การป้องกันการแทนที่เป็นโมฆะ RenderContents (เอาต์พุต HtmlTextWriter) { output.Write("<input type='submit' name=" + this.UniqueID + " value=กรุณาคลิก/>"); - // ใช้วิธีการเหตุการณ์ที่ได้รับการป้องกันโมฆะเสมือน OnClick (EventArgs e) { EventHandler clickHandler = (EventHandler) เหตุการณ์ [EventClick]; ถ้า (clickHandler != null) { clickHandler(นี่,e); - - // ใช้สมาชิกอินเทอร์เฟซ IPostBackEventHandler เป็นโมฆะ IPostBackEventHandler.RaisePostBackEvent (สตริง eventArgument) { OnClick(EventArgs.ว่าง); - - - |
<%@ ภาษาเพจ = "C#" AutoEventWireup = "true" CodeFile = "Default.aspx.cs" สืบทอด = "_Default" %> <%@ ลงทะเบียน TagPrefix = "cc" Namespace = "WebControlLibrary" Assembly = "WebControlLibrary" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="เซิร์ฟเวอร์"> เป็นโมฆะ wcc1_Click (ผู้ส่งวัตถุ EventArgs e) { message.Text = "คุณเพิ่งคลิกปุ่มด้านบน"; - </สคริปต์> <html xmlns="http://www.w3.org/1999/xhtml"> <หัว runat="เซิร์ฟเวอร์"> <title>บันทึกเหตุการณ์ postback</title> </หัว> <ร่างกาย> <form id="form1" runat="server"> <ศูนย์> <cc:WebCustomControl ID="wcc1" runat="เซิร์ฟเวอร์" OnClick="wcc1_Click" /> <br /> <br /> <asp:Label ID="ข้อความ" runat="server"></asp:Label> </ศูนย์> </แบบฟอร์ม> </ร่างกาย> </html> |
รูปที่ 1 การแสดงการเริ่มต้นเพจ รูปที่ 2 ผลหลังจากคลิกปุ่ม |
//กำหนดแอตทริบิวต์ AutoPostBack บูลสาธารณะ AutoPostBack{ ชุด { this._autoPostBack = ค่า; - รับ { ส่งคืนสิ่งนี้._autoPostBack; - - //เพิ่มวิธี Page.GetPostBackEventReference() ในวิธี Render ป้องกันแทนที่เป็นโมฆะ Render (เอาต์พุต HtmlTextWriter) { - ถ้า (this.AutoPostBack) { writer.WriteAttribute("ontextchanged","javascript:" + Page.GetPostBackEventReference(นี้)); - - - |