Bagikan melalui


Menyimpan Informasi Pengguna Tambahan (VB)

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 UserNamemetode , 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 DeliveryPreferencesPastOrders. 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 SqlMembershipProviderdiperlukan 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.

GuestbookCommentsMenambahkan Tabel

Untuk mengambil komentar buku tamu, kita perlu membuat tabel database bernama GuestbookComments yang memiliki kolom seperti CommentId, , SubjectBody, 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.

Menambahkan Tabel Baru ke Database SecurityTutorials

Gambar 1: Tambahkan Tabel Baru ke SecurityTutorials Database (Klik untuk melihat gambar ukuran penuh)

Selanjutnya, tentukan GuestbookCommentskolom. 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.

Menambahkan Kolom Utama Bernama CommentId

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 GuestbookCommentsbaru .

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.

Gunakan Kotak Dialog Hubungan Kunci Asing untuk Mengelola Batasan Kunci Asing Tabel

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.

Menetapkan Batasan Kunci Asing Antara Tabel aspnet_Users dan GuesbookComments

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.

Mengonfigurasi Batasan Kunci Asing ke Penghapusan Kaskade

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 keaspnet_UsersAtauaspnet_MembershipTabel. Saya tidak akan merekomendasikan pendekatan ini karena memodifikasi skema yang digunakan oleh SqlMembershipProvider. Keputusan ini mungkin akan menghantuimu di jalan. Misalnya, bagaimana jika versi ASP.NET yang akan datang menggunakan skema yang berbeda SqlMembershipProvider . Microsoft dapat menyertakan alat untuk memigrasikan data ASP.NET 2.0 SqlMembershipProvider ke skema baru, tetapi jika Anda telah memodifikasi skema ASP.NET 2.0 SqlMembershipProvider , 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 oleh SqlProfileProvider (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 di Web.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, menyimpan SqlProfileProvider 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 danaspnet_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.

Membuat Tabel UserProfiles

Gambar 6: Buat UserProfiles Tabel (Klik untuk melihat gambar ukuran penuh)

Simpan tabel dan beri UserProfilesnama . 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.

Menambahkan Kontrol SqlDataSource Baru Bernama 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.configSecurityTutorials database. Nama string koneksi ini – SecurityTutorialsConnectionString harus ada di daftar drop-down. Pilih opsi ini dan klik Berikutnya.

Pilih SecurityTutorialsConnectionString dari Daftar Drop-Down

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.

Bawa Kembali Semua Kolom dari Tabel UserProfiles

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.

Menambahkan Parameter Filter pada Kolom UserId

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.

Konten Tabel aspnet_Users dan UserProfiles Ditampilkan

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 HomeTownbidang , 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.

Rekaman Ditambahkan ke UserProfiles 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.

Pengguna yang Saat Ini Mengunjungi Ditampilkan Pengaturannya

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.

Tentukan UpdateCommand dan UpdateParameters SqlDataSource

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.

DetailsView Merender 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 VisibleFalse.

<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.

Pesan Singkat Ditampilkan Saat Pengaturan Diperbarui

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.

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 WidthRows 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 PostCommentButtonClick 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.

Anda Dapat Melihat Komentar Buku Tamu di Tabel GuestbookComments

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 CommentsDataSourceyang 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. GuestbookCommentsPilih tabel , UserProfiles, dan aspnet_Users dan klik OK. Ini akan menambahkan ketiga tabel ke permukaan desain. Karena ada batasan kunci asing di antara GuestbookCommentstabel , , UserProfilesdan aspnet_Users , Pembangun Kueri secara otomatis JOIN adalah tabel ini.

Yang tersisa hanyalah menentukan kolom yang akan dikembalikan. GuestbookComments Dari tabel pilih Subjectkolom , Body, dan CommentDate ; kembalikan HomeTownkolom , , HomepageUrldan 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.

Kueri yang Dibuat JOIN guestbookComments, UserProfiles, dan tabel aspnet_Users

Gambar 18: Kueri JOIN yang Dibuat adalah GuestbookCommentsTabel , 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 , , ItemTemplatedan ItemSeparatorTemplate berikut untuk LayoutTemplatekontrol 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. ItemTemplateMarkup yang dihasilkan ditempatkan di LayoutTemplateitemPlaceholder 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.

Guestbook.aspx Sekarang Menampilkan Komentar Guestbook

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 tombol Click sehingga memanggil metode kontrol DataBind() ListView setelah menyisipkan komentar baru ke dalam database, atau
  • Mengatur properti kontrol EnableViewState ListView ke False. 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 GuestbookCommentsantara 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 HomeTownkolom , 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 NewUserWizardCreatedUser 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.configINSERT 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 HomeTownbidang , HomepageUrl, dan Signature .@HomeTownDBNull

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).

Akun Pengguna Baru dan Catatan UserProfiles Telah Ditambahkan

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 ContinueDestinationPageUrlCreateUserWizard. 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 baruWizardSteps untuk berisi elemen antarmuka pengguna tambahan. Untuk menambahkan baru WizardStep ke CreateUserWizard, klik tautan "Tambahkan/Hapus WizardStep s" dari Tag Pintar untuk meluncurkan WizardStep 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 menggantikan CreateUserWizardStep dengan yang setara WizardStep yang markup-nya mendefinisikan antarmuka pengguna yang cocok CreateUserWizardStepdengan . Dengan mengonversi CreateUserWizardStep menjadi WizardStep kita dapat memposisikan ulang kontrol atau menambahkan elemen antarmuka pengguna tambahan ke langkah ini. Untuk mengonversi CreateUserWizardStep atau CompleteWizardStep menjadi yang dapat WizardStepdiedit, 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).

Alur Kerja CreateUserWizard Saat WizardStep Tambahan Mendahului CreateUserWizardStep

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.

Alur Kerja CreateUserWizard Saat WizardStep Tambahan Datang Setelah CreateUserWizardStep

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.

Menambahkan Wizard BaruStep ke Kontrol CreateUserWizard

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 ActiveStepIndexCreateUserWizard, 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, , HomepageUrldan Signature. Nilai yang dimasukkan untuk kota asal, beranda, dan tanda tangan tidak pernah digunakan. Hasil bersih adalah akun pengguna baru dengan UserProfiles catatan yang HomeTownbidang , , HomepageUrldan 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 WizardStepsecara 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:

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.