Artikel sebelumnya memperkenalkan konsep dasar penerapan peristiwa kontrol server khusus. Artikel ini akan menjelaskan cara menangkap peristiwa panggilan balik melalui contoh umum.
1. Menerapkan pengambilan peristiwa postback.
Jika kontrol server perlu menangkap peristiwa postback dari klien dan ingin menyesuaikan logika pemrosesan peristiwa sisi server untuk peristiwa postback, maka kontrol harus mengimplementasikan antarmuka System.Web.UI.IPostBackEventHandler. Definisi antarmuka tercantum di bawah ini.
antarmuka publik IPostBackEventHandler
{
void RaisePostBackEvent(string eventArgument);
}
Seperti yang ditunjukkan pada kode di atas, antarmuka IPostBackEventHandler hanya menyertakan satu metode anggota RaisePostBackEvent. Metode ini memungkinkan kontrol server untuk menangani kejadian yang muncul ketika formulir dikirim ke server. Parameternya eventArgument mewakili parameter kejadian opsional untuk diteruskan ke pengendali kejadian. Pengembang dapat mengimplementasikan logika yang dilakukan selama proses postback kontrol server dalam metode RaisePostBackEvent. Biasanya, metode RaisePostBackEvent akan memunculkan satu atau lebih peristiwa sisi server. Cuplikan kode berikut menunjukkan implementasi RaisePostBackEvent yang memunculkan event Click di server.
kekosongan publik RaisePostBackEvent(String eventArgument)
{
OnClick(EventArgs.Kosong);
}
Untuk menangkap peristiwa postback, tidak cukup hanya membuat kelas kontrol server mengimplementasikan antarmuka IPostBackEventHandler dan mengimplementasikan metode anggota antarmuka ini. Pengembang juga perlu memperhatikan penerapan hal-hal lainnya. Di bawah ini tercantum tiga poin penting dalam proses menangkap peristiwa postback.
Pertama, dan yang paling penting, kelas kontrol server khusus harus mengimplementasikan antarmuka IPostBackEventHandler dan mengimplementasikan metode anggota antarmuka RaisePostBackEvent. Proses ini telah dijelaskan di atas.
Kedua, tetapkan UniqueID ke kontrol.
Mendefinisikan nilai atribut nama kontrol yang menyebabkan peristiwa postback menjadi UniqueID adalah salah satu kunci untuk mengimplementasikan metode RaisePostBackEvent dengan benar. Ketika postback dipicu, kerangka halaman mencari konten yang dikirim dan menentukan apakah nama objek pengirim sesuai dengan UniqueID kontrol server yang mengimplementasikan IPostBackEventHandler. Jika sesuai, kerangka halaman akan memanggil metode RaisePostBackEvent pada kontrol. Poin kuncinya di sini adalah pengembang perlu menetapkan UniqueID ke atribut nama kontrol dalam logika rendering. Contoh kode sederhana tercantum di bawah ini.
override yang dilindungi void Render (keluaran HtmlTextWriter)
{
output.Write("<INPUT TYPE=kirim nama="+this.UniqueID+"Value='Klik Saya' />");
}
Seperti yang ditunjukkan pada kode di atas, dalam metode rendering kontrol Render, sebuah tombol disajikan, yang nilai atribut namanya adalah UniqueID. Hanya ketika atribut name dari kontrol yang menyebabkan postback diberi UniqueID, peristiwa postback dapat ditangkap dengan benar.
Ketiga, menerapkan struktur atribut acara.
Struktur atribut acara adalah cara yang dioptimalkan untuk mengimplementasikan acara. Sebelum memperkenalkan, pertama-tama mari kita lihat metode implementasi peristiwa kontrol yang umum. Kode spesifiknya adalah sebagai berikut.
...
kelas publik WebCustomControl:WebControl,IPostBackEventHandler{
//Deklarasikan acara Klik delegasi acara publik EventHandler Click;
//Implementasikan metode RaisePostBackEvent void IPostBackEventHandler.RaisePostBackEvent(string eventArgument) {
OnClick(EventArgs.Kosong);
}
//Definisikan event handler OnClick yang dilindungi virtual void OnClick(EventArgs e) {
if(Klik != null) { Klik(ini,e }
}
...
}
Dalam kode di atas, tiga konten utama yang berkaitan dengan definisi peristiwa disertakan: 1. Tentukan delegasi peristiwa Klik; 2. Kelas kontrol mengimplementasikan antarmuka IPostBackEventHandler, di mana pengendali peristiwa OnClick didefinisikan ketika mengimplementasikan metode anggota antarmuka RaisePostBackEvent. ;3. Mengimplementasikan pengendali kejadian OnClick. Cara implementasi di atas sederhana dan mudah digunakan, namun memiliki kekurangan yaitu efisiensi eksekusi yang rendah. Terutama ketika beberapa peristiwa dipicu dalam satu kelas, hal ini akan meningkatkan overhead, membuang banyak sumber daya server, dan pada akhirnya menyebabkan penurunan efisiensi pengoperasian.
Untuk mengatasi masalah di atas, struktur atribut metode implementasi acara yang dioptimalkan diperkenalkan di bawah ini. Struktur ini menggunakan kelas System.ComponentModel.EventHandlerList, yang menyediakan daftar delegasi sederhana. Dengan menggunakan metode terkait yang disediakan oleh kelas ini, pengembang dapat secara fleksibel memanipulasi daftar delegasi pengendali kejadian kontrol. Misalnya, event Click di kontrol menggunakan struktur atribut event sebagai berikut:
protected static readonly object EventClick = new object();
acara publik EventHandler Klik{
menambahkan {
Events.AddHandler(EventClick,nilai);
}
menghapus {
Events.RemoveHandler(EventClick,nilai);
}
}
Sebelum mendefinisikan struktur atribut event, Anda perlu mendefinisikan objek delegasi event Click terlebih dahulu. Karena setiap peristiwa hanya dibuat satu kali, maka peristiwa tersebut perlu dinyatakan statis dan hanya-baca. Kemudian, operasikan daftar delegasi pengendali peristiwa melalui metode AddHandler dan RemoveHandler dalam struktur properti. Saat halaman memanggil kejadian Click, halaman tersebut menambah atau menghapus penangan dari koleksi EventHandlerList kontrol. Karena metode implementasi ini lebih efisien daripada metode implementasi biasa dalam proses deklarasi beberapa peristiwa, maka metode ini sangat direkomendasikan.
Selain itu, selama implementasi metode OnClick, saat menggunakan atribut event, delegasi harus diambil dari EventHandlerList dan dikonversi ke tipe EventHandler.
virtual void terlindung OnClick(EventArgs e){
EventHandler clickHandler = (EventHandler)Acara[EventClick];
jika(clickHandler != null) {
clickHandler(ini,e);
}
}
Harap diperhatikan bagi pembaca: Struktur atribut event tidak berlaku untuk bahasa VB.NET dan hanya dapat diterapkan dalam bahasa seperti C#.
2. Aplikasi umum
Sejujurnya, pengenalan teoretis tentang menangkap peristiwa postback di atas agak sulit dipahami bagi pembaca yang belum pernah menerapkan peristiwa kontrol server. Untuk tujuan ini, bagian ini menggunakan contoh umum untuk secara khusus mengilustrasikan metode implementasi dalam menangkap kejadian kembali.
Contoh ini mengimplementasikan kontrol server khusus WebCustomControl. Meskipun kontrol ini muncul sebagai sebuah tombol, kontrol ini tidak mewarisi kelas Button. Ketika tombol diklik, kontrol akan menyebabkan postback, dan server akan secara otomatis menangkap peristiwa klik yang dikembalikan, memicu peristiwa Klik, dan menjalankan pengendali peristiwa yang sesuai. Berikut ini adalah kode sumber implementasi pengendalian server:
menggunakan Sistem; menggunakan System.Collections.Generik; menggunakan Sistem.ComponentModel; menggunakan Sistem.Teks; menggunakan Sistem.Web; menggunakan Sistem.Web.UI; menggunakan Sistem.Web.UI.WebControls; namespace WebControlLibrary{ [DefaultEvent("Klik")] [ToolboxData("<{0}:WebCustomControl runat=server></{0}:WebCustomControl>")] kelas publik WebCustomControl : WebControl, IPostBackEventHandler { //Mendefinisikan objek delegasi acara Klik objek readonly statis pribadi EventClick = objek baru(); //Menerapkan properti peristiwa Klik [Deskripsi("Klik properti peristiwa"), Kategori("Tindakan") ] acara publik EventHandler Klik { menambahkan { Events.AddHandler(EventClick, nilai); } menghapus { Acara.RemoveHandler(EventClick, nilai); } } // Mengganti metode rendering kontrol RenderContents override yang dilindungi void RenderContents(keluaran HtmlTextWriter) { output.Write("<input type='submit' name=" + this.UniqueID + " value=Silakan klik/>"); } //Menerapkan metode peristiwa yang dilindungi virtual void OnClick(EventArgs e) { EventHandler clickHandler = (EventHandler)Acara[EventClick]; jika (clickHandler != null) { clickHandler(ini, e); } } // Implementasi anggota antarmuka IPostBackEventHandler void IPostBackEventHandler.RaisePostBackEvent(string eventArgument) { OnClick(EventArgs.Kosong); } } } |
<%@ Halaman Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <%@ Daftar TagPrefix="cc" Namespace="WebControlLibrary" Majelis="WebControlLibrary" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <skrip runat="server"> void wcc1_Click(pengirim objek, EventArgs e) { message.Text = "Anda baru saja mengklik tombol di atas"; } </skrip> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Merekam peristiwa postback</title> </kepala> <tubuh> <form id="form1" runat="server"> <tengah> <cc:WebCustomControl ID="wcc1" runat="server" OnClick="wcc1_Click" /> <br /> <br /> <asp:Label ID="pesan" runat="server"></asp:Label> </pusat> </bentuk> </tubuh> </html> |
Gambar 1 Render inisialisasi halaman Gambar 2 Efek setelah mengklik tombol |
//Definisikan atribut AutoPostBack bool publik AutoPostBack{ mengatur { this._autoPostBack = nilai; } mendapatkan { kembalikan ini._autoPostBack; } } //Tambahkan metode Page.GetPostBackEventReference() dalam metode Render override yang dilindungi void Render (keluaran HtmlTextWriter){ ... if(ini.AutoPostBack) { writer.WriteAttribute("ontextchanged","javascript:" + Page.GetPostBackEventReference(ini)); } ... } |