การโทรกลับโดยไม่รีเฟรชซึ่งสนับสนุนโดยเทคโนโลยี AJAX จำเป็นต้องเขียนโค้ด JavaScript จำนวนมากหรือใช้เฟรมเวิร์ก AJAX บางตัวในเทคโนโลยีดั้งเดิม ซึ่งจะลดประสิทธิภาพการพัฒนาและการบำรุงรักษาลงอย่างมาก ในความเป็นจริง ASP.NET2.0 ได้จัดเตรียมอินเทอร์เฟซดังกล่าวไว้แล้ว ซึ่งก็คือ ICallbackEventHandler
มีบทความมากมายเกี่ยวกับ ICallbackEventHandler บนอินเทอร์เน็ตแล้ว และบทความนี้มีส่วนเพิ่มเติมในเรื่องราวนี้จริงๆ
ICallbackEventHandler มีอยู่ใน System.Web.UI มาลองใช้ตัวอย่างง่ายๆ กัน
ขั้นตอนแรกคือการสร้างหน้าต่างเว็บใหม่ใน VS2005
ขั้นตอนที่สองคือการใส่โค้ด HTML (ด้านล่าง) ลงใน ASPX:
1<ร่างกาย>
2 <form id="form1" runat="server">
3 <ดิวิชั่น>
4 <ปุ่ม onclick="CallServer()">เซิร์ฟเวอร์การโทร</button>
5 </div>
6 </แบบฟอร์ม>
7</body>
ขั้นตอนที่สามคือการใส่สคริปต์ JavaScript ใน <HEAD></HEAD>:
1 <script type="text/javascript">
2 ฟังก์ชั่น CallServer()
3 {
4 var product = "ทดสอบ";
5 <%= ClientScript.GetCallbackEventReference(นี่, "ผลิตภัณฑ์", "ReceiveServerData",null)%>;
6}
7
8 ฟังก์ชั่นReceiveServerData(rValue)
9 {
10 การแจ้งเตือน (rValue);
11 }
12 </สคริปต์>
ขั้นตอนที่สี่คือการสืบทอดอินเทอร์เฟซ ICallbackEventHandler ในโค้ด CS พื้นหลังของ ASPX และใช้ทั้งสองวิธีในอินเทอร์เฟซ:
ICallbackEventHandler.GetCallbackResult()
และ
ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)
ขั้นตอนที่ห้าคือการเพิ่มตัวแปร CallBackValue และแก้ไขสองวิธีของอินเทอร์เฟซดังนี้:
1 สตริงส่วนตัว CallBackValue = string.Empty;
2
3 สตริง ICallbackEventHandler.GetCallbackResult()
4 {
5 กลับ CallBackValue + ", ตกลง";
6}
7
8 โมฆะ ICallbackEventHandler.RaiseCallbackEvent (เหตุการณ์สตริงอาร์กิวเมนต์)
9 {
10 this.CallBackValue = eventArgument;
11 }
12
ขั้นตอนที่หกคือการรัน ปุ่มจะปรากฏขึ้นบนอินเทอร์เฟซ หลังจากคลิก สตริง "ทดสอบ" จะถูกส่งไปยังพื้นหลัง รหัส C# จะเพิ่ม ", ตกลง" ให้กับสตริงและส่งกลับไปยัง JavaScript ของไคลเอ็นต์ รหัสและแสดงผล
เมื่อปฏิบัติตามหกขั้นตอนข้างต้น คุณจะสามารถโทรกลับได้โดยไม่ต้องรีเฟรช ตอนนี้เรามาวิเคราะห์โค้ดบางส่วนกัน
ก่อนอื่นมาดูโค้ด JavaScript ในขั้นตอนที่สาม มีการเรียกกลับในเมธอด CallServer()
<%= ClientScript.GetCallbackEventReference(นี่, "ผลิตภัณฑ์", "ReceiveServerData",null)%>;
พารามิเตอร์ที่สองจากสี่พารามิเตอร์ระบุว่าตัวแปรสตริงใน JavaScript ของผลิตภัณฑ์จะถูกส่งกลับไปยังพื้นหลัง และพารามิเตอร์ที่สามระบุเมธอด JavaScript ReceiverServerData(string Value) ที่ได้รับข้อมูลที่ส่งคืนเมื่อส่งคืนจากพื้นหลัง
ในขั้นตอนที่ห้า มีสองวิธีในเบื้องหลัง วิธีหนึ่งคือ ICallbackEventHandler.RaiseCallbackEvent(string eventArgument) ใช้ในการรับตัวแปรสตริงที่ส่งผ่านใน JavaScript เบื้องหน้าและกำหนดให้กับตัวแปรภายใน this.CallBackValue ICallbackEventHandler.GetCallbackResult() จะเปลี่ยนตัวแปรภายใน this.CallBackValue จะถูกส่งกลับไปยังเมธอด JavaScript เบื้องหน้า ReceiverServerData(string Value)
ลำดับการโทรคือ: (ส่วนหน้า)CallServer() --> (แบ็กเอนด์)ICallbackEventHandler.RaiseCallbackEvent(string eventArgument) --> (แบ็กเอนด์)ICallbackEventHandler.GetCallbackResult() --> (ส่วนหน้า)ReceiveServerData(ค่าสตริง)
กระบวนการโทรทั้งหมดนั้นง่ายมาก และขั้นตอนที่สำคัญที่สุดคือขั้นตอนที่สาม
<%= ClientScript.GetCallbackEventReference(นี่, "ผลิตภัณฑ์", "ReceiveServerData",null)%>;
สำหรับวิธีนี้ ต่อไปนี้เป็นข้อมูลบางส่วนที่พบในอินเทอร์เน็ต คุณสามารถดูได้
GetCallbackEventReference ทำให้วิธีการของไคลเอนต์ที่จะรีไซเคิลเมื่อสิ้นสุดการร้องขอของไคลเอนต์ นอกจากนี้ยังช่วยให้ CallBackManager กำหนดวิธีการโทรกลับที่จะสร้าง วิธีการโอเวอร์โหลดที่ใช้ในตัวอย่างนี้คือ:
สตริงสาธารณะ GetCallbackEventReference(
เป้าหมายสตริง อาร์กิวเมนต์สตริง
สตริง clientCallback บริบทสตริง
สตริงไคลเอ็นต์ErrorCallback)
ตารางที่ 1. คำอธิบายพารามิเตอร์สำหรับเมธอด GetCallBackEventReference
พารามิเตอร์ คำอธิบาย ID เป้าหมายของหน้าที่จัดการการเรียกกลับ สำหรับข้อมูลเพิ่มเติม โปรดดูตัวเลือกที่โอเวอร์โหลดอื่นๆ ที่มีอยู่ในส่วนถัดไปทันที ในตัวอย่าง "นี่" ของเราคือค่าอาร์กิวเมนต์ เนื่องจากการเรียกกลับได้รับการจัดการในหน้าเดียวกัน เป็นคำจำกัดความของพารามิเตอร์ที่ใช้ในการส่งค่าไปยังเซิร์ฟเวอร์ ค่านี้ได้รับโดยพารามิเตอร์ "eventArgument" ที่ฝั่งเซิร์ฟเวอร์โดยใช้เหตุการณ์ RaiseCallbackEvent "arg" กลายเป็นชื่อพารามิเตอร์แรกในตัวอย่างของเรา ไคลเอนต์ ชื่อเมธอด clientCallback ของการโทรกลับที่ถูกเรียกใช้หลังจากการเรียกเซิร์ฟเวอร์สำเร็จ ระบุบริบทของการโทร คุณจะเข้าใจสิ่งนี้ดีขึ้นจากการใช้งานตัวอย่าง ในตัวอย่าง "ctx" เป็นเพียงคำจำกัดความพารามิเตอร์อื่นที่ใช้ ค่าสำหรับสิ่งนี้ถูกส่งผ่านจากไคลเอนต์ ชื่อของวิธีการที่ถูกเรียกจาก CallBackManager ในกรณีที่มีข้อผิดพลาด
สตริงที่ส่งคืนจากวิธีนี้คือ:
__doCallback('__เพจ',หาเรื่อง,CallBackHandler,ctx, ErrorCallBack)
วิธีการโอเวอร์โหลดอีกวิธีหนึ่งคือ:
สตริงสาธารณะ GetCallbackEventReference(
การควบคุมการควบคุมอาร์กิวเมนต์สตริง
สตริง clientCallback บริบทสตริง)
สตริงสาธารณะ GetCallbackEventReference(
การควบคุมการควบคุมอาร์กิวเมนต์สตริง
สตริง clientCallback บริบทสตริง
สตริงไคลเอ็นต์ErrorCallback)