Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
oleh Scott Mitchell
Catatan
Sejak artikel ini ditulis, penyedia keanggotaan ASP.NET telah digantikan oleh ASP.NET Identity. Kami sangat menyarankan untuk memperbarui aplikasi untuk menggunakan platform identitas ASP.NET daripada penyedia Keanggotaan yang ditampilkan pada saat artikel ini ditulis. ASP.NET Identity memiliki sejumlah keunggulan dibandingkan sistem Keanggotaan ASP.NET, termasuk :
- Performa yang lebih baik
- Peningkatan ekstensibilitas dan uji coba
- Dukungan untuk OAuth, OpenID Connect, dan autentikasi dua faktor
- Dukungan Identitas berbasis klaim
- Interoperabilitas yang lebih baik dengan ASP.Net Core
Unduh Kode atau Unduh PDF
Dalam tutorial ini kita akan menjawab pertanyaan ini dengan membangun aplikasi buku tamu yang sangat rudimenter. Dalam melakukannya, kita akan melihat opsi yang berbeda untuk memodelkan informasi pengguna dalam database, lalu melihat cara mengaitkan data ini dengan akun pengguna yang dibuat oleh kerangka kerja Keanggotaan.
Pengantar
ASP. Kerangka kerja Keanggotaan NET menawarkan antarmuka yang fleksibel untuk mengelola pengguna. API Keanggotaan mencakup metode untuk memvalidasi kredensial, mengambil informasi tentang pengguna yang saat ini masuk, membuat akun pengguna baru, dan menghapus akun pengguna, antara lain. Setiap akun pengguna dalam kerangka kerja Keanggotaan hanya berisi properti yang diperlukan untuk memvalidasi kredensial dan melakukan tugas terkait akun pengguna penting. Ini dibuktikan dengan metode dan properti MembershipUser
kelas , yang memodelkan akun pengguna dalam kerangka kerja Keanggotaan. Kelas ini memiliki properti seperti UserName
metode , Email
, dan IsLockedOut
, dan seperti GetPassword
dan UnlockUser
.
Seringkali, aplikasi perlu menyimpan informasi pengguna tambahan yang tidak disertakan dalam kerangka kerja Keanggotaan. Misalnya, peritel online mungkin perlu membiarkan setiap pengguna menyimpan alamat pengiriman dan penagihannya, informasi pembayaran, preferensi pengiriman, dan nomor telepon kontak. Selain itu, setiap pesanan dalam sistem dikaitkan dengan akun pengguna tertentu.
Kelas MembershipUser
tidak menyertakan properti seperti PhoneNumber
atau DeliveryPreferences
PastOrders
. Jadi bagaimana cara melacak informasi pengguna yang diperlukan oleh aplikasi dan mengintegrasikannya dengan kerangka kerja Keanggotaan? Dalam tutorial ini kita akan menjawab pertanyaan ini dengan membangun aplikasi buku tamu yang sangat rudimenter. Dalam melakukannya, kita akan melihat opsi yang berbeda untuk memodelkan informasi pengguna dalam database, lalu melihat cara mengaitkan data ini dengan akun pengguna yang dibuat oleh kerangka kerja Keanggotaan. Mari kita mulai!
Langkah 1: Membuat Model Data Aplikasi Guestbook
Ada berbagai teknik yang dapat digunakan untuk menangkap informasi pengguna dalam database dan mengaitkannya dengan akun pengguna yang dibuat oleh kerangka kerja Keanggotaan. Untuk mengilustrasikan teknik ini, kita perlu menambah aplikasi web tutorial sehingga menangkap semacam data terkait pengguna. (Saat ini, model data aplikasi hanya berisi tabel layanan aplikasi yang SqlMembershipProvider
diperlukan oleh .)
Mari kita buat aplikasi buku tamu yang sangat sederhana di mana pengguna yang diautentikasi dapat meninggalkan komentar. Selain menyimpan komentar buku tamu, mari kita izinkan setiap pengguna untuk menyimpan kota asal, beranda, dan tanda tangannya. Jika disediakan, kota asal, beranda, dan tanda tangan pengguna akan muncul di setiap pesan yang telah ia tinggalkan di buku tamu.
GuestbookComments
Menambahkan Tabel
Untuk mengambil komentar buku tamu, kita perlu membuat tabel database bernama GuestbookComments
yang memiliki kolom seperti CommentId
, , Subject
Body
, dan CommentDate
. Kita juga perlu memiliki setiap rekaman dalam tabel mereferensikan GuestbookComments
pengguna yang meninggalkan komentar.
Untuk menambahkan tabel ini ke database kami, buka Database Explorer di Visual Studio dan telusuri paling detail database SecurityTutorials
. Klik kanan pada folder Tabel dan pilih Tambahkan Tabel Baru. Ini memunculkan antarmuka yang memungkinkan kita menentukan kolom untuk tabel baru.
Gambar 1: Tambahkan Tabel Baru ke SecurityTutorials
Database (Klik untuk melihat gambar ukuran penuh)
Selanjutnya, tentukan GuestbookComments
kolom. Mulailah dengan menambahkan kolom bernama CommentId
jenis uniqueidentifier
. Kolom ini akan mengidentifikasi setiap komentar secara unik dalam buku tamu, jadi larang NULL
dan tandai sebagai kunci utama tabel. Daripada memberikan nilai untuk CommentId
bidang pada setiap INSERT
, kita dapat menunjukkan bahwa nilai baru uniqueidentifier
harus secara otomatis dihasilkan untuk bidang ini pada INSERT
dengan mengatur nilai default kolom ke NEWID()
. Setelah menambahkan bidang pertama ini, menandainya sebagai kunci primer, dan mengatur nilai defaultnya, layar Anda akan terlihat mirip dengan cuplikan layar yang ditampilkan di Gambar 2.
Gambar 2: Tambahkan Kolom Utama Bernama CommentId
(Klik untuk melihat gambar ukuran penuh)
Selanjutnya, tambahkan kolom bernama Subject
jenis nvarchar(50)
dan kolom bernama Body
jenis nvarchar(MAX)
, melarang NULL
s di kedua kolom. Setelah itu, tambahkan kolom bernama CommentDate
jenis datetime
. Larang NULL
dan atur CommentDate
nilai default kolom ke getdate()
.
Yang tersisa hanyalah menambahkan kolom yang mengaitkan akun pengguna dengan setiap komentar buku tamu. Salah satu opsinya adalah menambahkan kolom bernama UserName
jenis nvarchar(256)
. Ini adalah pilihan yang cocok saat menggunakan penyedia Keanggotaan selain SqlMembershipProvider
. Tetapi ketika menggunakan SqlMembershipProvider
, seperti yang kita dalam seri tutorial ini, UserName
kolom dalam tabel tidak dijamin aspnet_Users
unik. Kunci aspnet_Users
primer tabel adalah UserId
dan berjenis uniqueidentifier
. Oleh karena itu, GuestbookComments
tabel memerlukan kolom bernama UserId
jenis uniqueidentifier
(melarang NULL
nilai). Lanjutkan dan tambahkan kolom ini.
Catatan
Seperti yang kita bahas dalam tutorial Membuat Skema Keanggotaan dalam SQL Server, kerangka kerja Keanggotaan dirancang untuk memungkinkan beberapa aplikasi web dengan akun pengguna yang berbeda untuk berbagi penyimpanan pengguna yang sama. Ini dilakukan dengan mempartisi akun pengguna ke dalam aplikasi yang berbeda. Dan meskipun setiap nama pengguna dijamin unik dalam aplikasi, nama pengguna yang sama dapat digunakan dalam aplikasi yang berbeda menggunakan penyimpanan pengguna yang sama. Ada batasan komposit UNIQUE
dalam aspnet_Users
tabel pada UserName
bidang dan ApplicationId
, tetapi tidak satu pada bidang saja UserName
. Akibatnya, tabel aspnet_Users dapat memiliki dua (atau lebih) rekaman dengan nilai yang sama UserName
. Namun, UNIQUE
ada batasan pada aspnet_Users
bidang tabel UserId
(karena itu adalah kunci utama). Batasan UNIQUE
penting karena tanpanya kita tidak dapat menetapkan batasan kunci asing antara GuestbookComments
tabel dan aspnet_Users
.
Setelah menambahkan UserId
kolom, simpan tabel dengan mengklik ikon Simpan di Toolbar. Beri nama tabel GuestbookComments
baru .
Kami memiliki satu masalah terakhir untuk dihadiri dengan GuestbookComments
tabel: kita perlu membuat batasan kunci asing antara GuestbookComments.UserId
kolom dan aspnet_Users.UserId
kolom. Untuk mencapai hal ini, klik ikon Hubungan di Toolbar untuk meluncurkan kotak dialog Hubungan Kunci Asing. (Atau, Anda dapat meluncurkan kotak dialog ini dengan masuk ke menu Designer Tabel dan memilih Hubungan.)
Klik tombol Tambahkan di sudut kiri bawah kotak dialog Hubungan Kunci Asing. Ini akan menambahkan batasan kunci asing baru, meskipun kita masih perlu menentukan tabel yang berpartisipasi dalam hubungan.
Gambar 3: Gunakan Kotak Dialog Hubungan Kunci Asing untuk Mengelola Batasan Kunci Asing Tabel (Klik untuk melihat gambar ukuran penuh)
Selanjutnya, klik ikon elipsis di baris "Spesifikasi Tabel dan Kolom" di sebelah kanan. Ini akan meluncurkan kotak dialog Tabel dan Kolom, tempat kita dapat menentukan tabel dan kolom kunci utama dan kolom kunci asing dari GuestbookComments
tabel. Secara khusus, pilih aspnet_Users
dan UserId
sebagai tabel dan kolom kunci utama, dan UserId
dari GuestbookComments
tabel sebagai kolom kunci asing (lihat Gambar 4). Setelah menentukan tabel dan kolom kunci utama dan asing, klik OK untuk kembali ke kotak dialog Hubungan Kunci Asing.
Gambar 4: Menetapkan Batasan Kunci Asing Antara aspnet_Users
tabel dan GuesbookComments
(Klik untuk melihat gambar ukuran penuh)
Pada titik ini batasan kunci asing telah ditetapkan. Kehadiran batasan ini memastikan integritas relasional antara kedua tabel dengan menjamin bahwa tidak akan pernah ada entri buku tamu yang mengacu pada akun pengguna yang tidak ada. Secara default, batasan kunci asing akan melarang rekaman induk dihapus jika ada rekaman turunan yang sesuai. Artinya, jika pengguna membuat satu atau beberapa komentar buku tamu, dan kemudian kami mencoba menghapus akun pengguna tersebut, penghapusan akan gagal kecuali komentar buku tamunya dihapus terlebih dahulu.
Batasan kunci asing dapat dikonfigurasi untuk menghapus rekaman anak terkait secara otomatis saat rekaman induk dihapus. Dengan kata lain, kita dapat mengatur batasan kunci asing ini sehingga entri buku tamu pengguna secara otomatis dihapus ketika akun penggunanya dihapus. Untuk mencapai hal ini, perluas bagian "SISIPKAN Dan PERBARUI Spesifikasi" dan atur properti "Hapus Aturan" ke Cascade.
Gambar 5: Konfigurasikan Batasan Kunci Asing untuk Penghapusan Berjende (Klik untuk melihat gambar ukuran penuh)
Untuk menyimpan batasan kunci asing, klik tombol Tutup untuk keluar dari Hubungan Kunci Asing. Lalu klik ikon Simpan di Toolbar untuk menyimpan tabel dan hubungan ini.
Menyimpan Kota Asal, Beranda, dan Tanda Tangan Pengguna
Tabel ini GuestbookComments
menggambarkan cara menyimpan informasi yang berbagi hubungan satu ke banyak dengan akun pengguna. Karena setiap akun pengguna mungkin memiliki jumlah komentar terkait arbitrer, hubungan ini dimodelkan dengan membuat tabel untuk menahan kumpulan komentar yang menyertakan kolom yang menautkan kembali setiap komentar ke pengguna tertentu. Saat menggunakan SqlMembershipProvider
, tautan ini paling baik dibuat dengan membuat kolom bernama UserId
jenis uniqueidentifier
dan batasan kunci asing antara kolom ini dan aspnet_Users.UserId
.
Kita sekarang perlu mengaitkan tiga kolom dengan setiap akun pengguna untuk menyimpan kota asal, beranda, dan tanda tangan pengguna, yang akan muncul di komentar buku tamunya. Ada sejumlah cara berbeda untuk mencapai hal ini:
Menambahkan kolom baru ke
aspnet_Users
Atauaspnet_Membership
Tabel. Saya tidak akan merekomendasikan pendekatan ini karena memodifikasi skema yang digunakan olehSqlMembershipProvider
. Keputusan ini mungkin akan menghantuimu di jalan. Misalnya, bagaimana jika versi ASP.NET yang akan datang menggunakan skema yang berbedaSqlMembershipProvider
. Microsoft dapat menyertakan alat untuk memigrasikan data ASP.NET 2.0SqlMembershipProvider
ke skema baru, tetapi jika Anda telah memodifikasi skema ASP.NET 2.0SqlMembershipProvider
, konversi tersebut mungkin tidak dimungkinkan.Gunakan ASP. Kerangka kerja Profil NET, menentukan properti profil untuk kota asal, beranda, dan tanda tangan. ASP.NET menyertakan kerangka kerja Profil yang dirancang untuk menyimpan data khusus pengguna tambahan. Seperti kerangka kerja Keanggotaan, kerangka kerja Profil dibangun di atas model penyedia. .NET Framework dikirim dengan
SqlProfileProvider
yang menyimpan data profil dalam database SQL Server. Bahkan, database kami sudah memiliki tabel yang digunakan olehSqlProfileProvider
(aspnet_Profile
), seperti yang ditambahkan ketika kami menambahkan layanan aplikasi kembali dalam tutorial Membuat Skema Keanggotaan di SQL Server.
Manfaat utama dari kerangka kerja Profil adalah memungkinkan pengembang untuk menentukan properti profil diWeb.config
- tidak ada kode yang perlu ditulis untuk membuat serialisasi data profil ke dan dari penyimpanan data yang mendasar. Singkatnya, sangat mudah untuk menentukan sekumpulan properti profil dan bekerja dengannya dalam kode. Namun, sistem Profil meninggalkan banyak hal yang diinginkan dalam hal penerapan versi, jadi jika Anda memiliki aplikasi di mana Anda mengharapkan properti khusus pengguna baru ditambahkan di lain waktu, atau yang sudah ada untuk dihapus atau dimodifikasi, maka kerangka kerja Profil mungkin bukan pilihan terbaik. Selain itu, menyimpanSqlProfileProvider
properti profil dengan cara yang sangat denormalisasi, sehingga tidak mungkin untuk menjalankan kueri langsung terhadap data profil (seperti, berapa banyak pengguna yang memiliki kota asal New York).
Untuk informasi selengkapnya tentang kerangka kerja Profil, lihat bagian "Bacaan Lebih Lanjut" di akhir tutorial ini.Tambahkan ketiga kolom ini ke tabel baru dalam database dan buat hubungan satu-ke-satu antara tabel ini dan
aspnet_Users
. Pendekatan ini melibatkan sedikit lebih banyak pekerjaan daripada dengan kerangka kerja Profil, tetapi menawarkan fleksibilitas maksimum dalam bagaimana properti pengguna tambahan dimodelkan dalam database. Ini adalah opsi yang akan kita gunakan dalam tutorial ini.
Kami akan membuat tabel baru yang disebut UserProfiles
untuk menyimpan kota asal, beranda, dan tanda tangan untuk setiap pengguna. Klik kanan pada folder Tabel di jendela Penjelajah Database dan pilih untuk membuat tabel baru. Beri nama kolom UserId
pertama dan atur jenisnya ke uniqueidentifier
. Larang NULL
nilai dan tandai kolom sebagai kunci primer. Selanjutnya, tambahkan kolom bernama: HomeTown
dari jenis nvarchar(50)
; HomepageUrl
dari jenis nvarchar(100)
; dan Tanda tangan jenis nvarchar(500)
. Masing-masing dari ketiga kolom ini dapat menerima NULL
nilai.
Gambar 6: Buat UserProfiles
Tabel (Klik untuk melihat gambar ukuran penuh)
Simpan tabel dan beri UserProfiles
nama . Terakhir, buat batasan kunci asing antara UserProfiles
bidang tabel UserId
dan aspnet_Users.UserId
bidang . Seperti yang kami lakukan dengan batasan kunci asing antara GuestbookComments
tabel dan aspnet_Users
, memiliki batasan penghapusan kaskade ini.
UserId
Karena bidang di UserProfiles
adalah kunci utama, ini memastikan bahwa tidak akan ada lebih dari satu rekaman dalam UserProfiles
tabel untuk setiap akun pengguna. Jenis hubungan ini disebut sebagai satu-ke-satu.
Sekarang setelah model data dibuat, kami siap menggunakannya. Pada Langkah 2 dan 3 kita akan melihat bagaimana pengguna yang saat ini masuk dapat melihat dan mengedit informasi kota asal, beranda, dan tanda tangan mereka. Pada Langkah 4 kita akan membuat antarmuka bagi pengguna yang diautentikasi untuk mengirimkan komentar baru ke buku tamu dan melihat yang sudah ada.
Langkah 2: Menampilkan Kota Asal, Beranda, dan Tanda Tangan Pengguna
Ada berbagai cara untuk memungkinkan pengguna yang saat ini masuk untuk melihat dan mengedit informasi kota asal, beranda, dan tanda tangannya. Kita dapat membuat antarmuka pengguna secara manual dengan kontrol TextBox dan Label atau kita dapat menggunakan salah satu kontrol Web data, seperti kontrol DetailsView. Untuk melakukan database SELECT
dan UPDATE
pernyataan, kita dapat menulis kode ADO.NET di kelas code-behind halaman kita atau, sebagai alternatif, menggunakan pendekatan deklaratif dengan SqlDataSource. Idealnya aplikasi kami akan berisi arsitektur berjenjang, yang dapat kita panggil secara terprogram dari kelas code-behind halaman atau secara deklaratif melalui kontrol ObjectDataSource.
Karena seri tutorial ini berfokus pada autentikasi formulir, otorisasi, akun pengguna, dan peran, tidak akan ada diskusi menyeluruh tentang berbagai opsi akses data ini atau mengapa arsitektur berjenjang lebih disukai daripada mengeksekusi pernyataan SQL langsung dari halaman ASP.NET. Saya akan berjalan menggunakan DetailsView dan SqlDataSource - opsi tercepat dan term mudah - tetapi konsep yang dibahas tentu dapat diterapkan pada kontrol Web alternatif dan logika akses data. Untuk informasi selengkapnya tentang bekerja dengan data di ASP.NET, lihat seri tutorial Bekerja dengan Data di ASP.NET 2.0 saya.
AdditionalUserInfo.aspx
Buka halaman di Membership
folder dan tambahkan kontrol DetailsView ke halaman, atur properti ID-nya ke UserProfile
dan hapus properti dan Height
.Width
Perluas Tag Pintar DetailsView dan pilih untuk mengikatnya ke kontrol sumber data baru. Ini akan meluncurkan Wizard Konfigurasi DataSource (lihat Gambar 7). Langkah pertama meminta Anda untuk menentukan jenis sumber data. Karena kita akan terhubung langsung ke SecurityTutorials
database, pilih ikon Database, menentukan ID
sebagai UserProfileDataSource
.
Gambar 7: Tambahkan Kontrol SqlDataSource Baru Bernama UserProfileDataSource
(Klik untuk melihat gambar ukuran penuh)
Layar berikutnya meminta database untuk digunakan. Kami telah mendefinisikan string koneksi untuk Web.config
SecurityTutorials
database. Nama string koneksi ini – SecurityTutorialsConnectionString
harus ada di daftar drop-down. Pilih opsi ini dan klik Berikutnya.
Gambar 8: Pilih SecurityTutorialsConnectionString
dari Daftar Drop-Down (Klik untuk melihat gambar ukuran penuh)
Layar berikutnya meminta kami untuk menentukan tabel dan kolom yang akan dikueri.
UserProfiles
Pilih tabel dari daftar drop-down dan periksa semua kolom.
Gambar 9: Bawa Kembali Semua Kolom dari UserProfiles
Tabel (Klik untuk melihat gambar ukuran penuh)
Kueri saat ini di Gambar 9 mengembalikan semua rekaman di UserProfiles
, tetapi kami hanya tertarik pada rekaman pengguna yang saat ini masuk. Untuk menambahkan klausa WHERE
, klik tombol WHERE
untuk memunculkan kotak dialog Tambahkan WHERE
Klausa (lihat Gambar 10). Di sini Anda dapat memilih kolom untuk difilter, operator, dan sumber parameter filter. Pilih UserId
sebagai kolom dan "=" sebagai Operator.
Sayangnya tidak ada sumber parameter bawaan untuk mengembalikan nilai pengguna UserId
yang saat ini masuk. Kita harus mengambil nilai ini secara terprogram. Oleh karena itu, atur daftar drop-down Sumber ke "Tidak Ada", klik tombol Tambahkan untuk menambahkan parameter, lalu klik OK.
Gambar 10: Tambahkan Parameter Filter pada UserId
Kolom (Klik untuk melihat gambar ukuran penuh)
Setelah mengklik OK, Anda akan dikembalikan ke layar yang ditunjukkan pada Gambar 9. Namun kali ini, kueri SQL di bagian bawah layar harus menyertakan WHERE
klausul . Klik Berikutnya untuk melanjutkan ke layar "Uji Kueri". Di sini Anda bisa menjalankan kueri dan melihat hasilnya. Klik Selesai untuk menyelesaikan wizard.
Setelah menyelesaikan Panduan Konfigurasi DataSource, Visual Studio membuat kontrol SqlDataSource berdasarkan pengaturan yang ditentukan dalam wizard. Selain itu, ini secara manual menambahkan BoundFields ke DetailsView untuk setiap kolom yang dikembalikan oleh SqlDataSource SelectCommand
. Tidak perlu menampilkan UserId
bidang di DetailsView, karena pengguna tidak perlu mengetahui nilai ini. Anda dapat menghapus bidang ini langsung dari markup deklaratif kontrol DetailsView atau dengan mengklik tautan "Edit Bidang" dari Tag Pintarnya.
Pada titik ini markup deklaratif halaman Anda akan terlihat mirip dengan yang berikut ini:
<asp:DetailsView ID="UserProfile" runat="server"
AutoGenerateRows="False" DataKeyNames="UserId"
DataSourceID="UserProfileDataSource">
<Fields>
<asp:BoundField DataField="HomeTown" HeaderText="HomeTown"
SortExpression="HomeTown" />
<asp:BoundField DataField="HomepageUrl" HeaderText="HomepageUrl"
SortExpression="HomepageUrl" />
<asp:BoundField DataField="Signature" HeaderText="Signature"
SortExpression="Signature" />
</Fields>
</asp:DetailsView>
<asp:SqlDataSource ID="UserProfileDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:SecurityTutorialsConnectionString %>"
SelectCommand="SELECT [UserId], [HomeTown], [HomepageUrl], [Signature] FROM
[UserProfiles] WHERE ([UserId] = @UserId)">
<SelectParameters>
<asp:Parameter Name="UserId" Type="Object" />
</SelectParameters>
</asp:SqlDataSource>
Kita perlu secara terprogram mengatur parameter kontrol UserId
SqlDataSource ke pengguna yang saat ini masuk UserId
sebelum data dipilih. Ini dapat dicapai dengan membuat penanganan aktivitas untuk peristiwa SqlDataSource Selecting
dan menambahkan kode berikut di sana:
Protected Sub UserProfileDataSource_Selecting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs) Handles UserProfileDataSource.Selecting
' Get a reference to the currently logged on user
Dim currentUser As MembershipUser = Membership.GetUser()
' Determine the currently logged on user's UserId value
Dim currentUserId As Guid = CType(currentUser.ProviderUserKey, Guid)
' Assign the currently logged on user's UserId to the @UserId parameter
e.Command.Parameters("@UserId").Value = currentUserId
End Sub
Kode di atas dimulai dengan mendapatkan referensi ke pengguna yang saat ini masuk dengan memanggil Membership
metode kelas GetUser
. Ini mengembalikan MembershipUser
objek , yang propertinya ProviderUserKey
berisi UserId
. Nilai UserId
kemudian ditetapkan ke parameter SqlDataSource @UserId
.
Catatan
Metode mengembalikan Membership.GetUser()
informasi tentang pengguna yang saat ini masuk. Jika pengguna anonim mengunjungi halaman, itu akan mengembalikan nilai Nothing
. Dalam kasus seperti itu, ini akan mengarah ke NullReferenceException
pada baris kode berikut ketika mencoba membaca ProviderUserKey
properti . Tentu saja, kita tidak perlu khawatir tentang Membership.GetUser()
mengembalikan Tidak ada di AdditionalUserInfo.aspx
halaman karena kami mengonfigurasi otorisasi URL dalam tutorial sebelumnya sehingga hanya pengguna yang diautentikasi yang dapat mengakses sumber daya ASP.NET di folder ini. Jika Anda perlu mengakses informasi tentang pengguna yang saat ini masuk di halaman di mana akses anonim diizinkan, pastikan untuk memeriksa bahwa objek yang MembershipUser
dikembalikan dari GetUser()
metode bukan Apa-apa sebelum mereferensikan propertinya.
Jika Anda mengunjungi AdditionalUserInfo.aspx
halaman melalui browser, Anda akan melihat halaman kosong karena kami belum menambahkan baris apa pun ke UserProfiles
tabel. Di Langkah 6 kita akan melihat cara menyesuaikan kontrol CreateUserWizard untuk secara otomatis menambahkan baris baru ke UserProfiles
tabel saat akun pengguna baru dibuat. Namun, untuk saat ini, kita harus membuat rekaman secara manual dalam tabel.
Navigasi ke Database Explorer di Visual Studio dan perluas folder Tabel. Klik kanan pada aspnet_Users
tabel dan pilih "Tampilkan Data Tabel" untuk melihat rekaman dalam tabel; lakukan hal yang sama untuk UserProfiles
tabel. Gambar 11 menunjukkan hasil ini saat diurutkan secara vertikal. Dalam database saya saat ini aspnet_Users
ada catatan untuk Bruce, Fred, dan Tito, tetapi tidak ada catatan dalam UserProfiles
tabel.
Gambar 11: Konten aspnet_Users
dan UserProfiles
Tabel Ditampilkan (Klik untuk melihat gambar ukuran penuh)
Tambahkan rekaman baru ke UserProfiles
tabel dengan mengetikkan nilai secara manual untuk HomeTown
bidang , HomepageUrl
, dan Signature
. Cara term mudah untuk mendapatkan nilai yang valid UserId
dalam catatan baru UserProfiles
adalah dengan memilih UserId
bidang dari akun pengguna tertentu dalam aspnet_Users
tabel dan menyalin dan menempelkannya ke UserId
bidang di UserProfiles
. Gambar 12 memperlihatkan UserProfiles
tabel setelah catatan baru ditambahkan untuk Bruce.
Gambar 12: Rekaman Ditambahkan ke UserProfiles
untuk Bruce (Klik untuk melihat gambar ukuran penuh)
Kembali ke AdditionalUserInfo.aspx page
, masuk sebagai Bruce. Seperti yang ditunjukkan Gambar 13, pengaturan Bruce ditampilkan.
Gambar 13: Pengguna yang Saat Ini Mengunjungi Ditampilkan Pengaturannya (Klik untuk melihat gambar ukuran penuh)
Catatan
Lanjutkan dan tambahkan rekaman secara manual dalam UserProfiles
tabel untuk setiap pengguna Keanggotaan. Di Langkah 6 kita akan melihat cara menyesuaikan kontrol CreateUserWizard untuk secara otomatis menambahkan baris baru ke UserProfiles
tabel saat akun pengguna baru dibuat.
Langkah 3: Mengizinkan Pengguna Untuk Mengedit Kota Asal, Beranda, dan Tanda Tangannya
Pada titik ini, pengguna yang saat ini masuk dapat melihat pengaturan kota asal, beranda, dan tanda tangan mereka, tetapi mereka belum dapat memodifikasinya. Mari kita perbarui kontrol DetailsView sehingga data dapat diedit.
Hal pertama yang perlu kita lakukan adalah menambahkan UpdateCommand
untuk SqlDataSource, menentukan UPDATE
pernyataan untuk dieksekusi dan parameter yang sesuai. Pilih SqlDataSource dan, dari jendela Properti, klik elipsis di samping properti UpdateQuery untuk memunculkan kotak dialog Editor Perintah dan Parameter. Masukkan pernyataan berikut UPDATE
ke dalam kotak teks:
UPDATE UserProfiles SET
HomeTown = @HomeTown,
HomepageUrl = @HomepageUrl,
Signature = @Signature
WHERE UserId = @UserId
Selanjutnya, klik tombol "Refresh Parameter", yang akan membuat parameter dalam koleksi kontrol UpdateParameters
SqlDataSource untuk setiap parameter dalam UPDATE
pernyataan . Biarkan sumber untuk semua parameter diatur ke Tidak Ada dan klik tombol OK untuk menyelesaikan kotak dialog.
Gambar 14: Tentukan SqlDataSource UpdateCommand
dan UpdateParameters
(Klik untuk melihat gambar ukuran penuh)
Karena penambahan yang kami buat ke kontrol SqlDataSource, kontrol DetailsView sekarang dapat mendukung pengeditan. Dari Tag Pintar DetailsView, centang kotak centang "Aktifkan Pengeditan". Ini menambahkan CommandField ke koleksi kontrol Fields
dengan propertinya ShowEditButton
diatur ke True. Ini merender tombol Edit saat DetailsView ditampilkan dalam mode baca-saja dan tombol Perbarui dan Batalkan saat ditampilkan dalam mode edit. Alih-alih mengharuskan pengguna untuk mengklik Edit, kita dapat memiliki DetailsView yang dirender dalam status "selalu dapat diedit" dengan mengatur properti kontrol DefaultMode
DetailsView ke Edit
.
Dengan perubahan ini, markup deklaratif kontrol DetailsView Anda akan terlihat mirip dengan yang berikut ini:
<asp:DetailsView ID="UserProfile" runat="server"
AutoGenerateRows="False" DataKeyNames="UserId"
DataSourceID="UserProfileDataSource" DefaultMode="Edit">
<Fields>
<asp:BoundField DataField="HomeTown" HeaderText="HomeTown"
SortExpression="HomeTown" />
<asp:BoundField DataField="HomepageUrl" HeaderText="HomepageUrl"
SortExpression="HomepageUrl" />
<asp:BoundField DataField="Signature" HeaderText="Signature"
SortExpression="Signature" />
<asp:CommandField ShowEditButton="True" />
</Fields>
</asp:DetailsView>
Perhatikan penambahan CommandField dan DefaultMode
properti .
Lanjutkan dan uji halaman ini melalui browser. Saat mengunjungi dengan pengguna yang memiliki rekaman yang sesuai di UserProfiles
, pengaturan pengguna ditampilkan di antarmuka yang dapat diedit.
Gambar 15: DetailsView Merender Antarmuka yang Dapat Diedit (Klik untuk melihat gambar ukuran penuh)
Coba ubah nilai dan klik tombol Perbarui. Tampaknya seolah-olah tidak ada yang terjadi. Ada postback dan nilai disimpan ke database, tetapi tidak ada umpan balik visual bahwa penyimpanan terjadi.
Untuk memperbaikinya, kembali ke Visual Studio dan tambahkan kontrol Label di atas DetailsView.
ID
Atur ke SettingsUpdatedMessage
, propertinya Text
ke "Pengaturan Anda telah diperbarui," dan properti dan EnableViewState
ke Visible
False
.
<asp:Label ID="SettingsUpdatedMessage" runat="server"
Text="Your settings have been updated."
EnableViewState="false"
Visible="false">
</asp:Label>
Kita perlu menampilkan SettingsUpdatedMessage
Label setiap kali DetailsView diperbarui. Untuk mencapai hal ini, buat penanganan aktivitas untuk peristiwa DetailsView ItemUpdated
dan tambahkan kode berikut:
Protected Sub UserProfile_ItemUpdated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewUpdatedEventArgs) Handles UserProfile.ItemUpdated
SettingsUpdatedMessage.Visible = True
End Sub
Kembali ke AdditionalUserInfo.aspx
halaman melalui browser dan perbarui data. Kali ini, pesan status bermanfaat ditampilkan.
Gambar 16: Pesan Singkat Ditampilkan Saat Pengaturan Diperbarui (Klik untuk melihat gambar ukuran penuh)
Catatan
Antarmuka pengeditan kontrol DetailsView meninggalkan banyak hal yang diinginkan. Ini menggunakan kotak teks berukuran standar, tetapi bidang Tanda Tangan mungkin harus berupa kotak teks multibaris. RegularExpressionValidator harus digunakan untuk memastikan bahwa URL beranda, jika dimasukkan, dimulai dengan "http://" atau "https://". Selain itu, karena kontrol DetailsView mengatur propertinya DefaultMode
ke Edit
, tombol Batalkan tidak melakukan apa pun. Ini harus dihapus atau, ketika diklik, mengalihkan pengguna ke beberapa halaman lain (seperti ~/Default.aspx
). Saya membiarkan peningkatan ini sebagai latihan untuk pembaca.
Menambahkan Link keAdditionalUserInfo.aspx
Halaman di Halaman Master
Saat ini, situs web tidak menyediakan tautan apa pun ke AdditionalUserInfo.aspx
halaman. Satu-satunya cara untuk mencapainya adalah dengan memasukkan URL halaman langsung ke bilah Alamat browser. Mari kita tambahkan tautan ke halaman ini di Site.master
halaman master.
Ingat bahwa halaman master berisi kontrol Web LoginView di ContentPlaceHolder-nya LoginContent
yang menampilkan markup berbeda untuk pengunjung yang diautentikasi dan anonim. Perbarui kontrol LoggedInTemplate
LoginView untuk menyertakan tautan ke AdditionalUserInfo.aspx
halaman. Setelah membuat perubahan ini, markup deklaratif kontrol LoginView akan terlihat mirip dengan yang berikut ini:
<asp:LoginView ID="LoginView1" runat="server">
<LoggedInTemplate>
Welcome back,
<asp:LoginName ID="LoginName1" runat="server" />.
<br />
<asp:HyperLink ID="lnkUpdateSettings" runat="server"
NavigateUrl="~/Membership/AdditionalUserInfo.aspx">
Update Your Settings</asp:HyperLink>
</LoggedInTemplate>
<AnonymousTemplate>
Hello, stranger.
</AnonymousTemplate>
</asp:LoginView>
Perhatikan penambahan lnkUpdateSettings
kontrol HyperLink ke LoggedInTemplate
. Dengan tautan ini di tempat, pengguna yang diautentikasi dapat dengan cepat melompat ke halaman untuk melihat dan memodifikasi pengaturan kota asal, beranda, dan tanda tangan mereka.
Langkah 4: Menambahkan Komentar Buku Tamu Baru
Halaman Guestbook.aspx
ini adalah tempat pengguna yang diautentikasi dapat melihat buku tamu dan meninggalkan komentar. Mari kita mulai dengan membuat antarmuka untuk menambahkan komentar buku tamu baru.
Guestbook.aspx
Buka halaman di Visual Studio dan buat antarmuka pengguna yang terdiri dari dua kontrol TextBox, satu untuk subjek komentar baru dan satu untuk isinya. Atur properti kontrol ID
TextBox pertama ke Subject
dan propertinya Columns
ke 40; atur kedua ID
ke Body
, TextMode
ke MultiLine
, dan properti dannya Width
Rows
masing-masing menjadi "95%" dan 8. Untuk menyelesaikan antarmuka pengguna, tambahkan kontrol Web Tombol bernama PostCommentButton
dan atur propertinya Text
ke "Posting Komentar Anda".
Karena setiap komentar buku tamu memerlukan subjek dan isi, tambahkan RequiredFieldValidator untuk setiap TextBoxes.
ValidationGroup
Atur properti kontrol ini ke "EnterComment"; demikian juga, atur PostCommentButton
properti kontrol ValidationGroup
ke "EnterComment". Untuk informasi selengkapnya tentang ASP. Kontrol validasi NET, lihat Validasi Formulir di ASP.NET.
Setelah membuat antarmuka pengguna, markup deklaratif halaman Anda akan terlihat seperti berikut ini:
<h3>Leave a Comment</h3>
<p>
<b>Subject:</b>
<asp:RequiredFieldValidator ID="SubjectReqValidator" runat="server"
ErrorMessage="You must provide a value for Subject"
ControlToValidate="Subject" ValidationGroup="EnterComment">
</asp:RequiredFieldValidator><br />
<asp:TextBox ID="Subject" Columns="40" runat="server"></asp:TextBox>
</p>
<p>
<b>Body:</b>
<asp:RequiredFieldValidator ID="BodyReqValidator" runat="server"
ControlToValidate="Body"
ErrorMessage="You must provide a value for Body" ValidationGroup="EnterComment">
</asp:RequiredFieldValidator><br />
<asp:TextBox ID="Body" TextMode="MultiLine" Width="95%"
Rows="8" runat="server"></asp:TextBox>
</p>
<p>
<asp:Button ID="PostCommentButton" runat="server"
Text="Post Your Comment"
ValidationGroup="EnterComment" />
</p>
Setelah antarmuka pengguna selesai, tugas kami berikutnya adalah menyisipkan rekaman baru ke GuestbookComments
dalam tabel saat PostCommentButton
diklik. Ini dapat dicapai dengan sejumlah cara: kita dapat menulis kode ADO.NET di handler acara Button Click
; kita dapat menambahkan kontrol SqlDataSource ke halaman, mengonfigurasinya InsertCommand
, dan kemudian memanggil metodenya Insert
dari Click
penanganan aktivitas; atau kita dapat membangun tingkat tengah yang bertanggung jawab untuk menyisipkan komentar buku tamu baru, dan memanggil fungsionalitas ini dari Click
penanganan aktivitas. Karena kita melihat menggunakan SqlDataSource di Langkah 3, mari kita gunakan kode ADO.NET di sini.
Catatan
Kelas ADO.NET yang digunakan untuk mengakses data secara terprogram dari database Microsoft SQL Server terletak di System.Data.SqlClient
namespace layanan. Anda mungkin perlu mengimpor namespace layanan ini ke kelas code-behind halaman Anda (yaitu, Imports System.Data.SqlClient
).
Buat penanganan aktivitas untuk PostCommentButton
Click
peristiwa dan tambahkan kode berikut:
Protected Sub PostCommentButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles PostCommentButton.Click
If Not Page.IsValid Then Exit Sub
' Determine the currently logged on user's UserId
Dim currentUser As MembershipUser = Membership.GetUser()
Dim currentUserId As Guid = CType(currentUser.ProviderUserKey, Guid)
' Insert a new record into GuestbookComments
Dim connectionString As String =
ConfigurationManager.ConnectionStrings("SecurityTutorialsConnectionString").ConnectionString
Dim insertSql As String = "INSERT INTO GuestbookComments(Subject, Body, UserId)
VALUES(@Subject, @Body, @UserId)"
Using myConnection As New SqlConnection(connectionString)
myConnection.Open()
Dim myCommand As New SqlCommand(insertSql, myConnection)
myCommand.Parameters.AddWithValue("@Subject", Subject.Text.Trim())
myCommand.Parameters.AddWithValue("@Body", Body.Text.Trim())
myCommand.Parameters.AddWithValue("@UserId", currentUserId)
myCommand.ExecuteNonQuery()
myConnection.Close()
End Using
' "Reset" the Subject and Body TextBoxes
Subject.Text = String.Empty
Body.Text = String.Empty
End Sub
Penanganan Click
aktivitas dimulai dengan memeriksa apakah data yang disediakan pengguna valid. Jika tidak, penanganan aktivitas keluar sebelum menyisipkan rekaman. Dengan asumsi data yang disediakan valid, nilai pengguna UserId
yang saat ini masuk diambil dan disimpan dalam currentUserId
variabel lokal. Nilai ini diperlukan karena kita harus menyediakan UserId
nilai saat memasukkan rekaman ke dalam GuestbookComments
.
Setelah itu, string koneksi untuk SecurityTutorials
database diambil dari Web.config
dan INSERT
pernyataan SQL ditentukan. Objek SqlConnection
kemudian dibuat dan dibuka. Selanjutnya, SqlCommand
objek dibangun dan nilai untuk parameter yang digunakan dalam INSERT
kueri ditetapkan. Pernyataan INSERT
kemudian dijalankan dan koneksi ditutup. Di akhir penanganan aktivitas, Subject
properti dan Body
TextBoxes Text
dibersihkan sehingga nilai pengguna tidak bertahan di seluruh postback.
Lanjutkan dan uji halaman ini di browser. Karena halaman ini berada di Membership
folder, halaman ini tidak dapat diakses oleh pengunjung anonim. Oleh karena itu, Anda harus masuk terlebih dahulu (jika Anda belum melakukannya). Masukkan nilai ke Subject
dalam kotak teks dan Body
dan klik tombol PostCommentButton
. Ini akan menyebabkan rekaman baru ditambahkan ke GuestbookComments
. Pada postback, subjek dan isi yang Anda berikan dihapus dari TextBoxes.
Setelah mengklik tombol PostCommentButton
tidak ada umpan balik visual bahwa komentar ditambahkan ke buku tamu. Kami masih perlu memperbarui halaman ini untuk menampilkan komentar buku tamu yang ada, yang akan kami lakukan di Langkah 5. Setelah kami mencapainya, komentar yang baru ditambahkan akan muncul dalam daftar komentar, memberikan umpan balik visual yang memadai. Untuk saat ini, konfirmasikan bahwa komentar buku tamu Anda disimpan dengan memeriksa konten GuestbookComments
tabel.
Gambar 17 memperlihatkan konten GuestbookComments
tabel setelah dua komentar ditinggalkan.
Gambar 17: Anda Dapat Melihat Komentar Buku Tamu di GuestbookComments
Tabel (Klik untuk melihat gambar ukuran penuh)
Catatan
Jika pengguna mencoba menyisipkan komentar buku tamu yang berisi markup yang berpotensi berbahaya - seperti HTML - ASP.NET akan melemparkan HttpRequestValidationException
. Untuk mempelajari selengkapnya tentang pengecualian ini, mengapa pengecualian tersebut dilemparkan, dan cara mengizinkan pengguna mengirimkan nilai yang berpotensi berbahaya, lihat Laporan Resmi Validasi Permintaan.
Langkah 5: Mencantumkan Komentar Buku Tamu yang Ada
Selain meninggalkan komentar, pengguna yang mengunjungi Guestbook.aspx
halaman juga harus dapat melihat komentar buku tamu yang ada. Untuk mencapai hal ini, tambahkan kontrol ListView bernama CommentList
ke bagian bawah halaman.
Catatan
Kontrol ListView baru ASP.NET versi 3.5. Ini dirancang untuk menampilkan daftar item dalam tata letak yang sangat dapat disesuaikan dan fleksibel, namun masih menawarkan fungsionalitas pengeditan, penyisipan, penghapusan, penomoran, dan pengurutan bawaan seperti GridView. Jika Anda menggunakan ASP.NET 2.0, Anda harus menggunakan kontrol DataList atau Repeater sebagai gantinya. Untuk informasi selengkapnya tentang menggunakan ListView, lihat entri blog Scott Guthrie, Kontrol asp:ListView, dan artikel saya, Menampilkan Data dengan Kontrol ListView.
Buka Tag Cerdas ListView dan, dari daftar drop-down Pilih Sumber Data, ikat kontrol ke sumber data baru. Seperti yang kita lihat di Langkah 2, ini akan meluncurkan Panduan Konfigurasi Sumber Data. Pilih ikon Database, beri nama SqlDataSource CommentsDataSource
yang dihasilkan, dan klik OK. Selanjutnya, pilih SecurityTutorialsConnectionString
string koneksi dari daftar drop-down dan klik Berikutnya.
Pada titik ini di Langkah 2 kami menentukan data untuk dikueri dengan memilih UserProfiles
tabel dari daftar drop-down dan memilih kolom yang akan dikembalikan (lihat kembali ke Gambar 9). Namun kali ini, kami ingin membuat pernyataan SQL yang menarik kembali tidak hanya rekaman dari GuestbookComments
, tetapi juga kota asal, beranda, tanda tangan, dan nama pengguna pemberi komentar. Oleh karena itu, pilih tombol radio "Tentukan pernyataan SQL kustom atau prosedur tersimpan" dan klik Berikutnya.
Ini akan memunculkan layar "Tentukan Pernyataan Kustom atau Prosedur Tersimpan". Klik tombol Penyusun Kueri untuk menyusun kueri secara grafis. Pembangun Kueri dimulai dengan meminta kita untuk menentukan tabel yang ingin kita kueri.
GuestbookComments
Pilih tabel , UserProfiles
, dan aspnet_Users
dan klik OK. Ini akan menambahkan ketiga tabel ke permukaan desain. Karena ada batasan kunci asing di antara GuestbookComments
tabel , , UserProfiles
dan aspnet_Users
, Pembangun Kueri secara otomatis JOIN
adalah tabel ini.
Yang tersisa hanyalah menentukan kolom yang akan dikembalikan.
GuestbookComments
Dari tabel pilih Subject
kolom , Body
, dan CommentDate
; kembalikan HomeTown
kolom , , HomepageUrl
dan Signature
dari UserProfiles
tabel; dan kembali UserName
dari aspnet_Users
. Selain itu, tambahkan "ORDER BY CommentDate DESC
" ke akhir SELECT
kueri sehingga posting terbaru dikembalikan terlebih dahulu. Setelah membuat pilihan ini, antarmuka Query Builder Anda akan terlihat mirip dengan cuplikan layar di Gambar 18.
Gambar 18: Kueri JOIN
yang Dibuat adalah GuestbookComments
Tabel , UserProfiles
, dan aspnet_Users
(Klik untuk melihat gambar ukuran penuh)
Klik OK untuk menutup jendela Pembangun Kueri dan kembali ke layar "Tentukan Pernyataan Kustom atau Prosedur Tersimpan". Klik Berikutnya untuk melanjutkan ke layar "Uji Kueri", tempat Anda dapat menampilkan hasil kueri dengan mengklik tombol Uji Kueri. Saat Anda siap, klik Selesai untuk menyelesaikan wizard Konfigurasi Sumber Data.
Ketika kami menyelesaikan wizard Konfigurasi Sumber Data di Langkah 2, koleksi kontrol Fields
DetailsView terkait diperbarui untuk menyertakan BoundField untuk setiap kolom yang dikembalikan oleh SelectCommand
. ListView, bagaimanapun, tetap tidak berubah; kita masih perlu menentukan tata letaknya. Tata letak ListView dapat dibuat secara manual melalui markup deklaratifnya atau dari opsi "Konfigurasi ListView" di Tag Pintarnya. Saya biasanya lebih suka mendefinisikan markup dengan tangan, tetapi gunakan metode apa pun yang paling alami untuk Anda.
Saya akhirnya menggunakan , , ItemTemplate
dan ItemSeparatorTemplate
berikut untuk LayoutTemplate
kontrol ListView saya:
<asp:ListView ID="CommentList" runat="server" DataSourceID="CommentsDataSource">
<LayoutTemplate>
<span ID="itemPlaceholder" runat="server" />
<p>
<asp:DataPager ID="DataPager1" runat="server">
<Fields>
<asp:NextPreviousPagerField ButtonType="Button"
ShowFirstPageButton="True"
ShowLastPageButton="True" />
</Fields>
</asp:DataPager>
</p>
</LayoutTemplate>
<ItemTemplate>
<h4>
<asp:Label ID="SubjectLabel" runat="server"
Text='<%# Eval("Subject") %>' />
</h4>
<asp:Label ID="BodyLabel" runat="server"
Text='<%# Eval("Body").ToString().Replace(Environment.NewLine, "<br />") %>' />
<p>
---<br />
<asp:Label ID="SignatureLabel" Font-Italic="true" runat="server"
Text='<%# Eval("Signature") %>' />
<br />
<br />
My Home Town:
<asp:Label ID="HomeTownLabel" runat="server"
Text='<%# Eval("HomeTown") %>' />
<br />
My Homepage:
<asp:HyperLink ID="HomepageUrlLink" runat="server"
NavigateUrl='<%# Eval("HomepageUrl") %>'
Text='<%# Eval("HomepageUrl") %>' />
</p>
<p align="center">
Posted by
<asp:Label ID="UserNameLabel" runat="server"
Text='<%# Eval("UserName") %>' />
on
<asp:Label ID="CommentDateLabel" runat="server"
Text='<%# Eval("CommentDate") %>' />
</p>
</ItemTemplate>
<ItemSeparatorTemplate>
<hr />
</ItemSeparatorTemplate>
</asp:ListView>
LayoutTemplate
menentukan markup yang dipancarkan oleh kontrol, sementara ItemTemplate
merender setiap item yang dikembalikan oleh SqlDataSource.
ItemTemplate
Markup yang dihasilkan ditempatkan di LayoutTemplate
itemPlaceholder
kontrol. Selain itemPlaceholder
, LayoutTemplate
menyertakan kontrol DataPager, yang membatasi ListView untuk menampilkan hanya 10 komentar buku tamu per halaman (default) dan merender antarmuka penomor.
Saya ItemTemplate
menampilkan setiap subjek komentar buku tamu dalam <h4>
elemen dengan isi yang terletak di bawah subjek. Perhatikan bahwa sintaks yang digunakan untuk menampilkan isi mengambil data yang dikembalikan oleh Eval("Body")
pernyataan pengikatan data, mengonversinya menjadi string, dan mengganti pemisah baris dengan <br />
elemen . Konversi ini diperlukan untuk menampilkan hentian baris yang dimasukkan saat mengirimkan komentar karena spasi kosong diabaikan oleh HTML. Tanda tangan pengguna ditampilkan di bawah isi dalam miring, diikuti oleh kota asal pengguna, tautan ke berandanya, tanggal dan waktu komentar dibuat, dan nama pengguna orang yang meninggalkan komentar.
Luangkan waktu sejenak untuk melihat halaman melalui browser. Anda akan melihat komentar yang Anda tambahkan ke buku tamu di Langkah 5 ditampilkan di sini.
Gambar 19: Guestbook.aspx
Sekarang Menampilkan Komentar Guestbook (Klik untuk melihat gambar ukuran penuh)
Coba tambahkan komentar baru ke buku tamu. Setelah mengklik PostCommentButton
tombol, halaman memposting kembali dan komentar ditambahkan ke database, tetapi kontrol ListView tidak diperbarui untuk menampilkan komentar baru. Ini dapat diperbaiki dengan:
- Memperbarui
PostCommentButton
penanganan aktivitas tombolClick
sehingga memanggil metode kontrolDataBind()
ListView setelah menyisipkan komentar baru ke dalam database, atau - Mengatur properti kontrol
EnableViewState
ListView keFalse
. Pendekatan ini berfungsi karena dengan menonaktifkan status tampilan kontrol, pendekatan harus mengikat kembali ke data yang mendasar pada setiap postback.
Situs web tutorial yang dapat diunduh dari tutorial ini menggambarkan kedua teknik. Properti kontrol EnableViewState
ListView ke False
dan kode yang diperlukan untuk mengikat ulang data secara terprogram ke ListView ada di penanganan Click
aktivitas, tetapi dikomentari.
Catatan
Saat ini halaman AdditionalUserInfo.aspx
memungkinkan pengguna untuk melihat dan mengedit pengaturan kota asal, beranda, dan tanda tangan mereka. Mungkin menyenangkan untuk memperbarui AdditionalUserInfo.aspx
untuk menampilkan komentar buku tamu pengguna yang masuk. Artinya, selain memeriksa dan memodifikasi informasinya, pengguna dapat mengunjungi AdditionalUserInfo.aspx
halaman untuk melihat komentar buku tamu apa yang dibuatnya di masa lalu. Saya meninggalkan ini sebagai latihan untuk pembaca yang tertarik.
Langkah 6: Menyesuaikan Kontrol CreateUserWizard untuk Menyertakan Antarmuka untuk Kota Asal, Beranda, dan Tanda Tangan
Kueri SELECT
yang Guestbook.aspx
digunakan oleh halaman menggunakan INNER JOIN
untuk menggabungkan rekaman terkait di GuestbookComments
antara tabel , UserProfiles
, dan aspnet_Users
. Jika pengguna yang tidak memiliki rekaman membuat UserProfiles
komentar buku tamu, komentar tidak akan ditampilkan di ListView karena satu-satunya INNER JOIN
mengembalikan GuestbookComments
rekaman saat ada rekaman yang cocok di UserProfiles
dan aspnet_Users
. Dan seperti yang kita lihat di Langkah 3, jika pengguna tidak memiliki rekaman di UserProfiles
dia tidak dapat melihat atau mengedit pengaturannya di AdditionalUserInfo.aspx
halaman.
Tidak perlu dikatakan, karena keputusan desain kami, penting bahwa setiap akun pengguna dalam sistem Keanggotaan memiliki rekaman yang cocok dalam UserProfiles
tabel. Yang kami inginkan adalah agar rekaman yang sesuai ditambahkan setiap UserProfiles
kali akun pengguna Keanggotaan baru dibuat melalui CreateUserWizard.
Seperti yang dibahas dalam tutorial Membuat Akun Pengguna, setelah akun pengguna Keanggotaan baru dibuat, kontrol CreateUserWizard meningkatkan peristiwanyaCreatedUser
. Kita dapat membuat penanganan aktivitas untuk peristiwa ini, mendapatkan UserId untuk pengguna yang baru saja dibuat, lalu menyisipkan rekaman ke dalam UserProfiles
tabel dengan nilai default untuk HomeTown
kolom , HomepageUrl
, dan Signature
. Terlebih lagi, dimungkinkan untuk meminta nilai-nilai ini kepada pengguna dengan menyesuaikan antarmuka kontrol CreateUserWizard untuk menyertakan TextBox tambahan.
Mari kita lihat terlebih dahulu cara menambahkan baris baru ke UserProfiles
tabel di penanganan CreatedUser
aktivitas dengan nilai default. Setelah itu, kita akan melihat cara menyesuaikan antarmuka pengguna kontrol CreateUserWizard untuk menyertakan bidang formulir tambahan untuk mengumpulkan kota asal, beranda, dan tanda tangan pengguna baru.
Menambahkan Baris Default keUserProfiles
Dalam tutorial Membuat Akun Pengguna , kami menambahkan kontrol CreateUserWizard ke CreatingUserAccounts.aspx
halaman di Membership
folder . Agar kontrol CreateUserWizard menambahkan rekaman ke UserProfiles
tabel saat pembuatan akun pengguna, kita perlu memperbarui fungsionalitas kontrol CreateUserWizard. Daripada membuat perubahan ini ke CreatingUserAccounts.aspx
halaman, mari kita tambahkan kontrol CreateUserWizard baru ke EnhancedCreateUserWizard.aspx
halaman dan buat modifikasi untuk tutorial ini di sana.
EnhancedCreateUserWizard.aspx
Buka halaman di Visual Studio dan seret kontrol CreateUserWizard dari Kotak Alat ke halaman. Atur properti kontrol ID
CreateUserWizard ke NewUserWizard
. Seperti yang kita bahas dalam tutorial Membuat Akun Pengguna , antarmuka pengguna default CreateUserWizard meminta informasi yang diperlukan kepada pengunjung. Setelah informasi ini diberikan, kontrol secara internal membuat akun pengguna baru dalam kerangka kerja Keanggotaan, semua tanpa kita harus menulis satu baris kode pun.
Kontrol CreateUserWizard meningkatkan sejumlah peristiwa selama alur kerjanya. Setelah pengunjung menyediakan informasi permintaan dan mengirimkan formulir, kontrol CreateUserWizard awalnya mengaktifkan peristiwanyaCreatingUser
. Jika ada masalah selama proses pembuatan, CreateUserError
peristiwa diaktifkan; namun, jika pengguna berhasil dibuat, makaCreatedUser
peristiwa dinaikkan. Dalam tutorial Membuat Akun Pengguna , kami membuat penanganan aktivitas untuk peristiwa untuk CreatingUser
memastikan bahwa nama pengguna yang disediakan tidak berisi spasi awal atau akhir, dan bahwa nama pengguna tidak muncul di mana pun dalam kata sandi.
Untuk menambahkan baris dalam UserProfiles
tabel untuk pengguna yang baru saja dibuat, kita perlu membuat penanganan aktivitas untuk peristiwa tersebut CreatedUser
. Pada saat CreatedUser
peristiwa diaktifkan, akun pengguna telah dibuat dalam kerangka kerja Keanggotaan, memungkinkan kami untuk mengambil nilai UserId akun.
Buat penanganan aktivitas untuk NewUserWizard
CreatedUser
peristiwa dan tambahkan kode berikut:
Protected Sub NewUserWizard_CreatedUser(ByVal sender As Object, ByVal e As System.EventArgs) Handles NewUserWizard.CreatedUser
' Get the UserId of the just-added user
Dim newUser As MembershipUser = Membership.GetUser(NewUserWizard.UserName)
Dim newUserId As Guid = CType(newUser.ProviderUserKey, Guid)
' Insert a new record into UserProfiles
Dim connectionString As String =
ConfigurationManager.ConnectionStrings("SecurityTutorialsConnectionString").ConnectionString
Dim insertSql As String = "INSERT INTO UserProfiles(UserId, HomeTown, HomepageUrl,
Signature) VALUES(@UserId, @HomeTown, @HomepageUrl, @Signature)"
Using myConnection As New SqlConnection(connectionString)
myConnection.Open()
Dim myCommand As New SqlCommand(insertSql, myConnection)
myCommand.Parameters.AddWithValue("@UserId", newUserId)
myCommand.Parameters.AddWithValue("@HomeTown", DBNull.Value)
myCommand.Parameters.AddWithValue("@HomepageUrl", DBNull.Value)
myCommand.Parameters.AddWithValue("@Signature", DBNull.Value)
myCommand.ExecuteNonQuery()
myConnection.Close()
End Using
End Sub
Makhluk kode di atas dengan mengambil UserId dari akun pengguna yang baru ditambahkan. Ini dicapai dengan menggunakan Membership.GetUser(username)
metode untuk mengembalikan informasi tentang pengguna tertentu, lalu menggunakan ProviderUserKey
properti untuk mengambil UserId mereka. Nama pengguna yang dimasukkan oleh pengguna di kontrol CreateUserWizard tersedia melalui propertinyaUserName
.
Selanjutnya, string koneksi diambil dan Web.config
INSERT
pernyataan ditentukan. Objek ADO.NET yang diperlukan dibuat dan perintah dijalankan. Kode menetapkan instans ke parameter , @HomepageUrl
, dan @Signature
, yang memiliki efek menyisipkan nilai database NULL
untuk HomeTown
bidang , HomepageUrl
, dan Signature
.@HomeTown
DBNull
EnhancedCreateUserWizard.aspx
Kunjungi halaman melalui browser dan buat akun pengguna baru. Setelah melakukannya, kembali ke Visual Studio dan periksa konten aspnet_Users
tabel dan UserProfiles
(seperti yang kami lakukan kembali pada Gambar 12). Anda akan melihat akun pengguna baru di aspnet_Users
dan baris yang UserProfiles
sesuai (dengan NULL
nilai untuk HomeTown
, HomepageUrl
, dan Signature
).
Gambar 20: Akun Pengguna Baru dan UserProfiles
Rekaman Telah Ditambahkan (Klik untuk melihat gambar ukuran penuh)
Setelah pengunjung memberikan informasi akun barunya dan mengklik tombol "Buat Pengguna", akun pengguna dibuat dan baris ditambahkan ke UserProfiles
tabel. CreateUserWizard kemudian menampilkan CompleteWizardStep
, yang menampilkan pesan sukses dan tombol Lanjutkan. Mengklik tombol Lanjutkan menyebabkan postback, tetapi tidak ada tindakan yang diambil, membuat pengguna terjebak di EnhancedCreateUserWizard.aspx
halaman.
Kita dapat menentukan URL untuk mengirim pengguna ke ketika tombol Lanjutkan diklik melalui properti kontrol ContinueDestinationPageUrl
CreateUserWizard. Atur properti ke ContinueDestinationPageUrl
"~/Membership/AdditionalUserInfo.aspx". Ini membawa pengguna baru ke AdditionalUserInfo.aspx
, tempat mereka dapat melihat dan memperbarui pengaturan mereka.
Menyesuaikan Antarmuka CreateUserWizard untuk Meminta Kota Asal, Beranda, dan Tanda Tangan Pengguna Baru
Antarmuka default kontrol CreateUserWizard cukup untuk skenario pembuatan akun sederhana di mana hanya informasi akun pengguna inti seperti nama pengguna, kata sandi, dan email yang perlu dikumpulkan. Tapi bagaimana jika kita ingin meminta pengunjung untuk memasuki kota asalnya, beranda, dan tanda tangan saat membuat akunnya? Dimungkinkan untuk menyesuaikan antarmuka kontrol CreateUserWizard untuk mengumpulkan informasi tambahan saat pendaftaran, dan informasi ini dapat digunakan dalam CreatedUser
penanganan aktivitas untuk menyisipkan rekaman tambahan ke dalam database yang mendasar.
Kontrol CreateUserWizard memperluas kontrol wizard ASP.NET, yang merupakan kontrol yang memungkinkan pengembang halaman untuk menentukan serangkaian yang diurutkan WizardSteps
. Kontrol Wizard merender langkah aktif dan menyediakan antarmuka navigasi yang memungkinkan pengunjung untuk menelusuri langkah-langkah ini. Kontrol Wizard sangat ideal untuk memecah tugas panjang menjadi beberapa langkah singkat. Untuk informasi selengkapnya tentang kontrol Wizard, lihat Membuat Antarmuka Pengguna Langkah demi Langkah dengan Kontrol Wizard ASP.NET 2.0.
Markup default kontrol CreateUserWizard mendefinisikan dua WizardSteps
: CreateUserWizardStep
dan CompleteWizardStep
.
<asp:CreateUserWizard ID="NewUserWizard" runat="server"
ContinueDestinationPageUrl="~/Membership/AdditionalUserInfo.aspx">
<WizardSteps>
<asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server">
</asp:CreateUserWizardStep>
<asp:CompleteWizardStep ID="CompleteWizardStep1" runat="server">
</asp:CompleteWizardStep>
</WizardSteps>
</asp:CreateUserWizard>
Yang pertama WizardStep
, CreateUserWizardStep
, merender antarmuka yang meminta nama pengguna, kata sandi, email, dan sebagainya. Setelah pengunjung memberikan informasi ini dan mengklik "Buat Pengguna", dia ditampilkan CompleteWizardStep
, yang menunjukkan pesan sukses dan tombol Lanjutkan.
Untuk menyesuaikan antarmuka kontrol CreateUserWizard untuk menyertakan bidang formulir tambahan, kita dapat:
Buat satu atau beberapa baru
WizardStep
s untuk berisi elemen antarmuka pengguna tambahan. Untuk menambahkan baruWizardStep
ke CreateUserWizard, klik tautan "Tambahkan/HapusWizardStep
s" dari Tag Pintar untuk meluncurkanWizardStep
koleksi Editor. Dari sana Anda bisa menambahkan, menghapus, atau menyusun ulang langkah-langkah dalam wizard. Ini adalah pendekatan yang akan kita gunakan untuk tutorial ini.CreateUserWizardStep
Mengonversimenjadi dapat dieditWizardStep
. Ini menggantikanCreateUserWizardStep
dengan yang setaraWizardStep
yang markup-nya mendefinisikan antarmuka pengguna yang cocokCreateUserWizardStep
dengan . Dengan mengonversiCreateUserWizardStep
menjadiWizardStep
kita dapat memposisikan ulang kontrol atau menambahkan elemen antarmuka pengguna tambahan ke langkah ini. Untuk mengonversiCreateUserWizardStep
atauCompleteWizardStep
menjadi yang dapatWizardStep
diedit, klik tautan "Sesuaikan Buat Langkah Pengguna" atau "Sesuaikan Langkah Selesai" dari Tag Cerdas kontrol.Gunakan beberapa kombinasi dari dua opsi di atas.
Satu hal penting yang perlu diingat adalah bahwa kontrol CreateUserWizard menjalankan proses pembuatan akun penggunanya ketika tombol "Buat Pengguna" diklik dari dalam .CreateUserWizardStep
Tidak masalah jika ada tambahan WizardStep
setelah CreateUserWizardStep
atau tidak.
Saat menambahkan kustom WizardStep
ke kontrol CreateUserWizard untuk mengumpulkan input pengguna tambahan, kustom WizardStep
dapat ditempatkan sebelum atau sesudah CreateUserWizardStep
. Jika datang sebelum CreateUserWizardStep
input pengguna tambahan yang dikumpulkan dari kustom WizardStep
tersedia untuk penanganan CreatedUser
aktivitas. Namun, jika kustom WizardStep
datang setelahnya CreateUserWizardStep
pada saat kustom WizardStep
ditampilkan, akun pengguna baru telah dibuat dan CreatedUser
peristiwa telah diaktifkan.
Gambar 21 memperlihatkan alur kerja saat ditambahkan WizardStep
mendahului CreateUserWizardStep
. Karena informasi pengguna tambahan telah dikumpulkan pada saat CreatedUser
peristiwa diaktifkan, yang harus kita lakukan adalah memperbarui CreatedUser
penanganan aktivitas untuk mengambil input ini dan menggunakannya untuk INSERT
nilai parameter pernyataan (bukan DBNull.Value
).
Gambar 21: Alur Kerja CreateUserWizard Saat Tambahan WizardStep
Mendahului CreateUserWizardStep
(Klik untuk melihat gambar ukuran penuh)
Namun, jika kustom WizardStep
ditempatkan setelahCreateUserWizardStep
, proses buat akun pengguna terjadi sebelum pengguna memiliki kesempatan untuk memasuki kota asal, beranda, atau tanda tangannya. Dalam kasus seperti itu, informasi tambahan ini perlu dimasukkan ke dalam database setelah akun pengguna dibuat, seperti yang diilustrasikan Gambar 22.
Gambar 22: Alur Kerja CreateUserWizard Saat Tambahan WizardStep
Datang Setelah CreateUserWizardStep
(Klik untuk melihat gambar ukuran penuh)
Alur kerja yang diperlihatkan dalam Gambar 22 menunggu untuk menyisipkan rekaman ke UserProfiles
dalam tabel hingga setelah Langkah 2 selesai. Namun, jika pengunjung menutup browsernya setelah langkah 1, kami akan mencapai status di mana akun pengguna dibuat, tetapi tidak ada catatan yang ditambahkan ke UserProfiles
. Salah satu solusinya adalah memiliki rekaman dengan NULL
atau nilai default yang dimasukkan ke UserProfiles
dalam CreatedUser
penanganan aktivitas (yang diaktifkan setelah langkah 1), lalu memperbarui rekaman ini setelah langkah 2 selesai. Ini memastikan bahwa UserProfiles
rekaman akan ditambahkan untuk akun pengguna meskipun pengguna keluar dari proses pendaftaran di tengah jalan.
Untuk tutorial ini mari kita buat baru WizardStep
yang terjadi setelah CreateUserWizardStep
tetapi sebelum CompleteWizardStep
. Mari kita pertama-tama mendapatkan WizardStep di tempat dan dikonfigurasi dan kemudian kita akan melihat kode.
Dari Tag Pintar kontrol CreateUserWizard, pilih "Tambahkan/Hapus WizardStep
s", yang memunculkan WizardStep
dialog Koleksi Editor. Tambahkan baru WizardStep
, atur ID
ke UserSettings
, Title
ke "Pengaturan Anda" dan StepType
ke Step
. Kemudian posisikan sehingga muncul setelah CreateUserWizardStep
("Daftar untuk Akun Baru Anda") dan sebelum CompleteWizardStep
("Selesai"), seperti yang ditunjukkan pada Gambar 23.
Gambar 23: Tambahkan Baru WizardStep
ke CreateUserWizard Control (Klik untuk melihat gambar ukuran penuh)
Klik OK untuk menutup WizardStep
dialog Editor Koleksi. Yang baru WizardStep
dibuktikan oleh markup deklaratif kontrol CreateUserWizard yang diperbarui:
<asp:CreateUserWizard ID="NewUserWizard" runat="server"
ContinueDestinationPageUrl="~/Membership/AdditionalUserInfo.aspx">
<WizardSteps>
<asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server">
</asp:CreateUserWizardStep>
<asp:WizardStep runat="server" ID="UserSettings" StepType="Step"
Title="Your Settings">
</asp:WizardStep>
<asp:CompleteWizardStep ID="CompleteWizardStep1" runat="server">
</asp:CompleteWizardStep>
</WizardSteps>
</asp:CreateUserWizard>
Perhatikan elemen baru <asp:WizardStep>
. Kita perlu menambahkan antarmuka pengguna untuk mengumpulkan kota asal, beranda, dan tanda tangan pengguna baru di sini. Anda dapat memasukkan konten ini dalam sintaks deklaratif atau melalui Designer. Untuk menggunakan Designer, pilih langkah "Pengaturan Anda" dari daftar drop-down di Tag Pintar untuk melihat langkah di Designer.
Catatan
Memilih langkah melalui daftar drop-down Tag Pintar memperbarui properti kontrol ActiveStepIndex
CreateUserWizard, yang menentukan indeks langkah awal. Oleh karena itu, jika Anda menggunakan daftar drop-down ini untuk mengedit langkah "Pengaturan Anda" di Designer, pastikan untuk mengaturnya kembali ke "Daftar untuk Akun Baru Anda" sehingga langkah ini ditampilkan saat pengguna pertama kali mengunjungi EnhancedCreateUserWizard.aspx
halaman.
Buat antarmuka pengguna dalam langkah "Pengaturan Anda" yang berisi tiga kontrol TextBox bernama HomeTown
, HomepageUrl
, dan Signature
. Setelah membangun antarmuka ini, markup deklaratif CreateUserWizard akan terlihat mirip dengan yang berikut ini:
<asp:CreateUserWizard ID="NewUserWizard" runat="server"
ContinueDestinationPageUrl="~/Membership/AdditionalUserInfo.aspx">
<WizardSteps>
<asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server">
</asp:CreateUserWizardStep>
<asp:WizardStep runat="server" ID="UserSettings" StepType="Step"
Title="Your Settings">
<p>
<b>Home Town:</b><br />
<asp:TextBox ID="HomeTown" runat="server"></asp:TextBox>
</p>
<p>
<b>Homepage URL:</b><br />
<asp:TextBox ID="HomepageUrl" Columns="40" runat="server"></asp:TextBox>
</p>
<p>
<b>Signature:</b><br />
<asp:TextBox ID="Signature" TextMode="MultiLine" Width="95%"
Rows="5" runat="server"></asp:TextBox>
</p>
</asp:WizardStep>
<asp:CompleteWizardStep ID="CompleteWizardStep1" runat="server">
</asp:CompleteWizardStep>
</WizardSteps>
</asp:CreateUserWizard>
Lanjutkan dan kunjungi halaman ini melalui browser dan buat akun pengguna baru, tentukan nilai untuk kota asal, beranda, dan tanda tangan. Setelah menyelesaikan CreateUserWizardStep
akun pengguna dibuat dalam kerangka kerja Keanggotaan dan CreatedUser
penanganan aktivitas berjalan, yang menambahkan baris baru ke UserProfiles
, tetapi dengan nilai database NULL
untuk HomeTown
, , HomepageUrl
dan Signature
. Nilai yang dimasukkan untuk kota asal, beranda, dan tanda tangan tidak pernah digunakan. Hasil bersih adalah akun pengguna baru dengan UserProfiles
catatan yang HomeTown
bidang , , HomepageUrl
dan Signature
belum ditentukan.
Kita perlu menjalankan kode setelah langkah "Pengaturan Anda" yang mengambil nilai kota asal, pengasah, dan tanda tangan yang dimasukkan oleh pengguna dan memperbarui catatan yang sesuai UserProfiles
. Setiap kali pengguna berpindah di antara langkah-langkah dalam kontrol Wizard, peristiwa Wizard ActiveStepChanged
diaktifkan. Kita dapat membuat penanganan aktivitas untuk peristiwa ini dan memperbarui UserProfiles
tabel ketika langkah "Pengaturan Anda" telah selesai.
Tambahkan penanganan aktivitas untuk peristiwa CreateUserWizard ActiveStepChanged
dan tambahkan kode berikut:
Protected Sub NewUserWizard_ActiveStepChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles NewUserWizard.ActiveStepChanged
' Have we JUST reached the Complete step?
If NewUserWizard.ActiveStep.Title = "Complete" Then
Dim UserSettings As WizardStep = CType(NewUserWizard.FindControl("UserSettings"),WizardStep)
' Programmatically reference the TextBox controls
Dim HomeTown As TextBox = CType(UserSettings.FindControl("HomeTown"), TextBox)
Dim HomepageUrl As TextBox = CType(UserSettings.FindControl("HomepageUrl"), TextBox)
Dim Signature As TextBox = CType(UserSettings.FindControl("Signature"), TextBox)
' Update the UserProfiles record for this user
' Get the UserId of the just-added user
Dim newUser As MembershipUser = Membership.GetUser(NewUserWizard.UserName)
Dim newUserId As Guid = CType(newUser.ProviderUserKey, Guid)
' Insert a new record into UserProfiles
Dim connectionString As String = ConfigurationManager.ConnectionStrings("SecurityTutorialsConnectionString").ConnectionString
Dim updateSql As String = "UPDATE UserProfiles SET HomeTown = @HomeTown, HomepageUrl
= @HomepageUrl, Signature = @Signature WHERE UserId = @UserId"
Using myConnection As New SqlConnection(connectionString)
myConnection.Open()
Dim myCommand As New SqlCommand(updateSql, myConnection)
myCommand.Parameters.AddWithValue("@HomeTown", HomeTown.Text.Trim())
myCommand.Parameters.AddWithValue("@HomepageUrl", HomepageUrl.Text.Trim())
myCommand.Parameters.AddWithValue("@Signature", Signature.Text.Trim())
myCommand.Parameters.AddWithValue("@UserId", newUserId)
myCommand.ExecuteNonQuery()
myConnection.Close()
End Using
End If
End Sub
Kode di atas dimulai dengan menentukan apakah kita baru saja mencapai langkah "Selesai". Karena langkah "Selesai" terjadi segera setelah langkah "Pengaturan Anda", maka ketika pengunjung mencapai langkah "Selesai" yang berarti dia baru saja menyelesaikan langkah "Pengaturan Anda".
Dalam kasus seperti itu, kita perlu mereferensikan kontrol TextBox secara terprogram dalam UserSettings WizardStep
. Ini dicapai dengan terlebih dahulu menggunakan FindControl
metode untuk merujuk UserSettings WizardStep
secara terprogram , dan kemudian lagi untuk mereferensikan TextBoxes dari dalam WizardStep
. Setelah TextBoxes direferensikan, kami siap untuk menjalankan UPDATE
pernyataan. Pernyataan UPDATE
ini memiliki jumlah parameter INSERT
yang sama dengan pernyataan dalam CreatedUser
penanganan aktivitas, tetapi di sini kami menggunakan nilai kota asal, beranda, dan tanda tangan yang disediakan oleh pengguna.
Dengan penanganan aktivitas ini di tempat, kunjungi EnhancedCreateUserWizard.aspx
halaman melalui browser dan buat akun pengguna baru yang menentukan nilai untuk kota asal, beranda, dan tanda tangan. Setelah membuat akun baru, Anda harus dialihkan ke AdditionalUserInfo.aspx
halaman, tempat informasi kota asal, beranda, dan tanda tangan yang baru saja dimasukkan ditampilkan.
Catatan
Situs web kami saat ini memiliki dua halaman tempat pengunjung dapat membuat akun baru: CreatingUserAccounts.aspx
dan EnhancedCreateUserWizard.aspx
. Peta situs web dan halaman masuk menunjuk ke CreatingUserAccounts.aspx
halaman, tetapi CreatingUserAccounts.aspx
halaman tidak meminta pengguna untuk kota asal, beranda, dan informasi tanda tangan mereka dan tidak menambahkan baris yang sesuai ke UserProfiles
. Oleh karena itu, perbarui CreatingUserAccounts.aspx
halaman sehingga menawarkan fungsionalitas ini atau perbarui peta situs dan halaman masuk untuk mereferensikan EnhancedCreateUserWizard.aspx
alih-alih CreatingUserAccounts.aspx
. Jika Anda memilih opsi terakhir, pastikan untuk memperbarui Membership
file folder Web.config
sehingga memungkinkan pengguna anonim mengakses halaman EnhancedCreateUserWizard.aspx
.
Ringkasan
Dalam tutorial ini kita melihat teknik untuk memodelkan data yang terkait dengan akun pengguna dalam kerangka kerja Keanggotaan. Secara khusus, kami melihat entitas pemodelan yang berbagi hubungan satu-ke-banyak dengan akun pengguna serta data yang berbagi hubungan satu-ke-satu. Selain itu, kami melihat bagaimana informasi terkait ini dapat ditampilkan, disisipkan, dan diperbarui, dengan beberapa contoh menggunakan kontrol SqlDataSource dan yang lain menggunakan kode ADO.NET.
Tutorial ini melengkapi tampilan akun pengguna kami. Dimulai dengan tutorial berikutnya kita akan mengalihkan perhatian kita pada peran. Selama beberapa tutorial berikutnya kita akan melihat kerangka kerja Peran, melihat cara membuat peran baru, cara menetapkan peran kepada pengguna, cara menentukan peran apa yang dimiliki pengguna, dan cara menerapkan otorisasi berbasis peran.
Selamat Pemrograman!
Bacaan lebih lanjut
Untuk informasi selengkapnya tentang topik yang dibahas dalam tutorial ini, lihat sumber daya berikut:
- Mengakses dan Memperbarui Data di ASP.NET 2.0
- Kontrol Wizard ASP.NET 2.0
- Membuat Antarmuka Pengguna Langkah demi Langkah dengan Kontrol Wizard ASP.NET 2.0
- Membuat Parameter Kontrol Sumber Data Kustom
- Menyesuaikan Kontrol CreateUserWizard
- Mulai Cepat Kontrol DetailTampilan Cepat
- Menampilkan Data dengan Kontrol ListView
- Membedah Kontrol Validasi di ASP.NET 2.0
- Mengedit Sisipkan dan Hapus Data
- Validasi Formulir di ASP.NET
- Mengumpulkan informasi pendaftaran pengguna kustom
- Profil di ASP.NET 2.0
- Kontrol asp:ListView
- Mulai Cepat Profil Pengguna
Tentang Penulis
Scott Mitchell, penulis beberapa buku ASP/ASP.NET dan pendiri 4GuysFromRolla.com, telah bekerja dengan teknologi Microsoft Web sejak 1998. Scott bekerja sebagai konsultan, pelatih, dan penulis independen. Buku terbarunya adalah Sams Teach Yourself ASP.NET 2.0 dalam 24 Jam. Scott dapat dijangkau di mitchell@4guysfromrolla.com atau melalui blognya di http://ScottOnWriting.NET.
Terima kasih khusus untuk...
Seri tutorial ini ditinjau oleh banyak peninjau yang bermanfaat. Tertarik untuk meninjau artikel MSDN saya yang akan datang? Jika demikian, letakkan saya baris di mitchell@4GuysFromRolla.com.