Rob Howard
Ketika saya masih kecil, saya menghabiskan beberapa minggu setiap tahun berkumpul dengan keluarga besar saya. Sebagai seorang pemuda Amerika, saya terpesona dengan kereta listrik Belanda, sesuatu yang belum pernah saya lihat di kampung halaman saya di Dallas, Texas. Sepupu saya mentraktir saya naik perahu mereka untuk melihat kereta yang lewat. Duduk di atas air dekat rel, Anda bisa mendengar kereta mendekat, seperti peluit pelan melintasi rel, hingga mencapai klimaks lambat saat kereta melintas. Saya tidak bisa tidak teringat akan hal ini ketika memikirkan tentang ASP.NET 2.0. ASP.NET 2.0 sudah sangat dekat dan sebagian besar dari kita sangat menantikan peluncurannya segera sehingga kita bahkan mendengar "woo" bahwa rilis tersebut semakin lama semakin keras. Maka cara kita menulis perangkat lunak akan berubah sekali lagi.
Tujuan Microsoft ASP.NET 2.0 adalah memberikan kinerja 50% kepada pengembang. Namun, peningkatan kinerja sebenarnya tampaknya melebihi ekspektasi. Fitur personalisasi, keanggotaan, dan manajemen peran baru meringankan beban pengembang, sementara fitur lainnya, seperti pengikatan data, juga disederhanakan. Misalnya, sintaksis yang familier dan masih didukung:
<%# DataBinder.Eval (Container.DataItem, "FirstName") %>
Di ASP.NET 2.0 dapat disederhanakan menjadi:
<%# Eval("FirstName") %>
Tidak hanya terdapat banyak sekali fitur baru yang mengesankan, namun juga terdapat banyak sekali kontrol server yang berarti. Model pemrograman ASP.NET akan menjadi lebih kuat di ASP.NET 2.0 karena integrasi keanggotaan dengan kontrol server seperti kontrol <ASP:login> dan sumber data baru serta kontrol server kontrol data.
Jumlah perpustakaan kelas System.Web hampir dua kali lipat di ASP.NET 2.0 - begitu banyak cakupan sehingga memerlukan kolom majalah. Untuk benar-benar memahami sejauh mana perubahan ini, Anda memerlukan buku ASP.NET 2.0 baru. Saya berencana untuk menulis beberapa kolom di sini untuk menyoroti beberapa fitur baru yang lebih penting dari ASP.NET 2.0. Bulan ini saya akan fokus pada navigasi dan alur halaman, dimulai dengan fitur yang banyak dicari - kemampuan untuk mengirimkan ke halaman lain.
Pengiriman lintas halaman
Keluhan terbesar yang saya dengar dari pengembang yang bermigrasi ke ASP.NET adalah model halaman postback. Halaman ASP.NET dapat memiliki satu <form> dan hanya dapat mengirim HTTP kembali ke dirinya sendiri, sehingga semua pemrosesan Semua logika akan berjalan. halaman ini.
Banyak pengembang, terutama mereka yang familiar dengan ASP dan suka mengontrol elemen <form>, akan mengetahui bahwa di ASP Anda dapat menginstruksikan <form> di mana dan bagaimana mengirimkan data kontennya (HTTP Post atau HTTP Get), dan halaman yang sama Jumlah <form>. Namun dibandingkan dengan ASP, ASP.NET hanya mengizinkan satu halaman hanya memiliki satu <form runat=server>, dan hanya dapat diposting kembali ke halaman itu sendiri. Ini bisa sangat membuat frustasi. Berikut ini contoh apa yang dikirim ke halaman lain di ASP.NET 2.0:
<%@ Page MasterPageFile="~/Site.master" Language="C#"
CodeFile="Sumber.aspx.cs"
Mewarisi="Sumber" %>
<ASP:ID Konten="Konten Utama"
ContentPlaceHolderID="Utama" Runat="server">
Masukkan nama Anda:
<ASP:TextBox ID="NameBox" Runat="server"></ASP:TextBox>
<ASP:Button ID="Button1" Runat="server" Text="Kirim" />
</ASP:Konten>
Halaman Master digunakan untuk mengontrol tata letak halaman, dengan blok <ASP:content> dan beberapa kontrol server untuk menerima input pengguna.
Jika Anda berencana meneruskan konten ke halaman lain, Anda dapat menggunakan kode server yang mirip dengan berikut:
Response.Redirect("Target.aspx?Name= " +
HttpUtility.UrlEncode(NameBox.Teks));
Masalah dengan teknologi ini adalah ketika pengguna mengklik tombol untuk mengirimkan, server menerima permintaan dan mengirimkan respons untuk mengarahkan browser ke Target.aspx. Masalah sederhana seperti itu telah menyelesaikan banyak pekerjaan!
Bisakah pekerjaannya disederhanakan? Di ASP.NET 2.0 jawabannya adalah ya. Selanjutnya, peragakan kode yang ditingkatkan:
<%@ Page MasterPageFile="~/Site.master" Language="C#"
CodeFile="Sumber.aspx.cs"
Mewarisi="Sumber" %>
<ASP:ID Konten="Konten Utama"
ContentPlaceHolderID="Utama" Runat="server">
Masukkan nama Anda:
<ASP:TextBox ID="NameBox" Runat="server"></ASP:TextBox>
<ASP:Button ID="Button1" Runat="server" Text="Kirim"
PostBackUrl="~/Target.aspx" />
</ASP:Konten>
Perhatikan atribut PostBackUrl di <ASP:Button>. Atribut ini memberitahu tombol untuk tidak melakukan postback default tetapi mengirimkan data langsung ke Target.aspx
Anda mungkin bertanya-tanya bagaimana cara kerjanya, terutama jika Anda familiar dengan ASP.NET ViewState obyek. Namun hal tersebut di luar cakupan artikel ini, ketika fitur pengiriman lintas halaman digunakan, kolom tersembunyi baru akan ditambahkan ke halaman:
<input type="hidden" name="__PREVIOUSPAGE" id="__PREVIOUSPAGE"
nilai="p1-dFHlCpgH2alr1vkr3G21UIR7jOuzn074led6lbGf1KQ47_F25GwG0" />
Ini mirip dengan status tampilan yang dihasilkan oleh pohon kontrol, namun merupakan bagian dari status tampilan yang memvalidasi halaman untuk pengiriman lintas halaman. Anda tahu, ketika sebuah halaman diposkan silang ke halaman lain, halaman penerima harus dapat mengakses halaman postingan tersebut. Dalam hal ini berarti Target.ASP dapat mengakses detail Source.aspx. Faktanya, pendekatan yang lebih efisien adalah dengan mengakses API dari Source.aspx ke Target.aspx melalui manajer yang diketik dengan kuat. Untuk mengakses halaman pengiriman (halaman sebelumnya), ASP.NET2.0 menyediakan atribut halaman untuk pengiriman lintas halaman: PreviousPage.
PreviousPage mengembalikan contoh halaman pengiriman, dan ada juga properti yang digunakan untuk memeriksa apakah itu pengiriman lintas halaman: IsCrossPagePostBack. Properti ini mirip dengan IsPostBack yang ada tetapi mengembalikan nilai true hanya jika postingan lintas halaman terjadi.
Properti PreviousPage dapat berperilaku berbeda. Defaultnya hanya mengembalikan sebuah instance dari halaman sebelumnya sebagai tipe Page. Namun, dengan menggunakan direktif baru Anda dapat membuat properti PreviousPage mengembalikan instance yang diketik dengan kuat untuk mengakses anggota publik halaman tersebut. Misalnya, tambahkan kode berikut ke Target.aspx:
<%@ PreviousPageType VirtualPath="~/Source.aspx" %>
Anda sekarang dapat menggunakan properti PreviousPage di Target.aspx untuk mengakses data Source.aspx. Namun, untuk mengakses kontrol server, seperti NameBox di Source.aspx, Anda juga perlu menulis kode berikut:
TextBox nameBox = PreviousPage.FindControl("NameBox") sebagai TextBox
Dengan kata lain, Anda harus menggunakan FindControl untuk mengakses pohon kontrol. Mengapa? Server mengontrol default untuk variabel anggota yang dilindungi Untuk memiliki akses yang benar-benar sederhana ke elemen halaman sebelumnya, Anda perlu mengekspos properti atau metode di Source.aspx sebagai publik, dan kemudian kode berikut akan berfungsi: TextBox nameBox = PreviousPage.NameBox;
Pengiriman lintas halaman adalah fitur hebat dari ASP.NET. Ada beberapa artikel yang membahas detail teknis pengiriman lintas halaman secara mendalam keluar Pemotongan Dino Esposito di kolom MSDN Magazine Edge edisi September (silakan lihat terjemahan saya: Formulir ASP.NET (Terjemahan)). Anda juga mungkin akan menemukan bahwa jika Anda mahir dalam ASP.NET, Anda akan terus menggunakan model postback halaman standar hampir sepanjang waktu. (Penerjemah: Implikasinya adalah jika Anda seorang ahli, Anda akan meremehkan fitur ini)
Kontrol wizard
dapat dengan mudah membangun fungsi navigasi yang kompleks untuk aplikasi melalui pengiriman lintas halaman. Namun, fitur ini tidak mempermudah pembuatan antarmuka pengguna bergaya wizard. Antarmuka pengguna bergaya wizard, baik linier maupun non-linier, sering kali dirancang untuk menyelesaikan tugas. Ini memberi pengguna akhir cara yang mudah digunakan untuk menyelesaikan serangkaian langkah kompleks, yang masing-masing dipecah menjadi beberapa bagian.
Di ASP.NET 1.x, wizard sering kali diimplementasikan menggunakan beberapa trik: menempatkan beberapa kontrol server <ASP:panel> pada halaman yang sama dan mengalihkan visibilitas berdasarkan lokasi pengguna. Menulis wizard di ASP.NET bukanlah tugas yang mudah. Banyak desainer meninggalkan wizard, dan pengelolaan proses langkahnya juga membingungkan.
Kemampuan pengiriman lintas halaman baru di ASP.NET dapat digunakan untuk memecahkan masalah wizard, namun juga merupakan tantangan ketika navigasi non-linear diperlukan. Misalnya, langkah 1, langkah 2, lewati langkah 3-5, langkah 6, langkah 3, langkah 2, langkah 6, kontrol wizard ASP.NET 2.0 memecahkan sebagian besar masalah ini. Selain itu, semua elemen masukan dari panduan pengiriman lintas halaman dapat terus diakses melalui model postback halaman.
Fungsionalitas kontrol wizard sangat mirip dengan cara menyembunyikan panel di ASP.NET 1.1. Namun, kontrol wizard memperlihatkan serangkaian <ASP:WizardStep>, yang dapat berisi sejumlah kontrol anak. Namun, setiap <ASP:WizardStep> harus memiliki ID uniknya sendiri, lihat Gambar 1. Halaman kontrol wizard mengelola semua navigasi, mendukung navigasi linier dan non-linier, dan memiliki dukungan waktu desain penuh. Gambar 2 menunjukkan kontrol wizard. Sisi kiri adalah navigasi non-linier berbasis tautan, dan sisi kanan bawah adalah navigasi tombol linier. Dari menu tugas yang terbuka, Anda tidak hanya dapat melihat tugas umum tetapi juga daftar langkah yang memungkinkan peralihan antar langkah pada waktu desain.
Gambar 2 Wizard di Visual Studio
Semua elemen kontrol wizard yang terlihat dapat dikonfigurasi. Tautan non-linier dapat diganti dengan tombol atau menghapus entri, dan elemen navigasi linier sebelumnya, berikutnya, dan selesai juga dapat diubah menjadi tombol atau tautan gambar. Faktanya, semua aspek kontrol dapat dikonfigurasi melalui templat.
Salah satu kesulitan dalam menulis kontrol wizard di ASP.NET 1.1 adalah mengatur dimana pengguna seharusnya berada. Kontrol wizard menyederhanakan tugas ini dengan mengekspos properti ActiveStep. Properti ActiveStep dapat melakukan kueri dan menentukan langkah mana yang sedang aktif. Aliran alami wizard akan berjalan seperti yang dinyatakan oleh implementasi, dan aliran dapat diubah kapan saja melalui metode MoveTo. Melalui MoveTo, langkah apa pun dapat diatur sebagai ActiveStep. Untuk membantu navigasi dan proses, juga disediakan beberapa event, lihat Gambar 3.
Kontrol wizard baru sangat berguna ketika mengumpulkan informasi pengguna. Anda tidak ingin menulis semua struktur dasar di ASP.NET 1.1. ASP.NET telah melakukan semua pekerjaan untuk Anda. Kontrol wizard sangat berguna sehingga tim ast.net menggunakannya sebagai kelas dasar untuk kontrol CreateUserWizard, yang digunakan untuk membuat pengguna sebagai bagian dari fungsi Keanggotaan.
Bagian
Posting lintas halaman dan kontrol <ASP:Wizard> memberi pengembang ASP.NET beberapa opsi baru untuk mengontrol alur navigasi dalam aplikasi mereka. Pengiriman lintas halaman berguna dalam situasi di mana Anda saat ini perlu menggunakan Response.Redirect atau Server.Transfer. Kontrol wizard sangat bagus untuk membangun pengumpulan data kompleks yang memerlukan pengumpulan data linier dan non-linier.
--------------------------------------------------- ------
Gambar 1 Langkah-langkah Wizard
<ASP:Wizard runat="server" >
<Langkah Penyihir>
<ASP:WizardStep ID="Langkah1">
Selamat datang!
</ASP:Langkah Penyihir>
<ASP:WizardStep ID="Langkah2">
Siapa nama Anda: [Kotak Teks1]
[Tombol1]
</ASP:Langkah Penyihir>
<ASP:WizardStep ID="Langkah3">
Terima kasih, [KotakTeks1.Teks]!
</ASP:Langkah Penyihir>
</Langkah Penyihir>
</ASP:Penyihir>
-------------------------------------------- --- ----------
Gambar 3 Peristiwa Navigasi
Deskripsi | Peristiwa |
---|---|
ActiveStepChanged | Dibesarkan ketika ActiveStep diatur ke WizardStep baru |
CancelButtonClick | Dibesarkan ketika tombol yang diidentifikasi sebagai tombol Batal diklik |
FinishButtonClick | Dibesarkan ketika tombol yang diidentifikasi sebagai tombol Selesai diklik |
NextButtonClick | Dibesarkan ketika tombol diidentifikasi sebagai Berikutnya tombol diklik |
PreviousButtonClick | Dibesarkan ketika tombol yang diidentifikasi sebagai Tombol Sebelumnya diklik |
SideBarButtonClick | Dibesarkan ketika salah satu tautan atau tombol SideBar diklik |