Ek Kullanıcı Bilgileri Depolama (C#)

tarafından Scott Mitchell

Not

Bu makale yazıldığından beri, ASP.NET Üyeliği sağlayıcılarının yerini ASP.NET Identity alır. Bu makalenin yazıldığı sırada öne çıkan Üyelik sağlayıcıları yerine ASP.NET Kimlik platformunu kullanmak için uygulamaları güncelleştirmenizi kesinlikle öneririz. ASP.NET Identity, ASP.NET Üyelik sistemine göre çeşitli avantajlara sahiptir, örneğin:

  • Daha iyi performans
  • Geliştirilmiş genişletilebilirlik ve test edilebilirlik
  • OAuth, OpenID Connect ve iki öğeli kimlik doğrulaması desteği
  • Talep Tabanlı Kimlik desteği
  • ASP.Net Core ile daha iyi birlikte çalışabilirlik

Kod İndirme veya PDF İndirme

Bu öğreticide, çok temel bir konuk defteri uygulaması oluşturarak bu soruyu yanıtlayacağız. Bunu yaparken, veritabanındaki kullanıcı bilgilerini modellemek için farklı seçeneklere göz atacak ve ardından bu verilerin Üyelik çerçevesi tarafından oluşturulan kullanıcı hesaplarıyla nasıl ilişkilendirileceğini göreceğiz.

Giriş

ASP. NET'in Üyelik çerçevesi, kullanıcıları yönetmek için esnek bir arabirim sunar. Üyelik API'sinde kimlik bilgilerini doğrulama, oturum açmış olan kullanıcı hakkındaki bilgileri alma, yeni bir kullanıcı hesabı oluşturma ve kullanıcı hesabını silme yöntemleri bulunur. Üyelik çerçevesindeki her kullanıcı hesabı yalnızca kimlik bilgilerini doğrulamak ve kullanıcı hesabıyla ilgili temel görevleri gerçekleştirmek için gereken özellikleri içerir. Bu, Üyelik çerçevesinde bir kullanıcı hesabını modelleyen sınıfının yöntemleri ve özellikleri MembershipUsertarafından kanıtlanır. Bu sınıfın , , ve gibi UserNameözellikleri ve IsLockedOutve UnlockUsergibi GetPassword yöntemleri Emailvardır.

Çoğu zaman, uygulamaların Üyelik çerçevesine dahil olmayan ek kullanıcı bilgilerini depolaması gerekir. Örneğin, çevrimiçi bir satıcının her kullanıcının sevkiyat ve fatura adreslerini, ödeme bilgilerini, teslimat tercihlerini ve iletişim telefon numarasını depolamasına izin vermeleri gerekebilir. Ayrıca, sistemdeki her sipariş belirli bir kullanıcı hesabıyla ilişkilendirilir.

MembershipUser sınıfı veya DeliveryPreferencesPastOrdersgibi PhoneNumber özellikleri içermez. Peki uygulamanın ihtiyaç duyduğu kullanıcı bilgilerini nasıl izleyebilir ve Üyelik çerçevesiyle tümleştirmesini nasıl sağlarız? Bu öğreticide, çok temel bir konuk defteri uygulaması oluşturarak bu soruyu yanıtlayacağız. Bunu yaparken, veritabanındaki kullanıcı bilgilerini modellemek için farklı seçeneklere göz atacak ve ardından bu verilerin Üyelik çerçevesi tarafından oluşturulan kullanıcı hesaplarıyla nasıl ilişkilendirileceğini göreceğiz. Haydi başlayalım!

1. Adım: Guestbook Uygulamasının Veri Modelini Oluşturma

Veritabanındaki kullanıcı bilgilerini yakalamak ve üyelik çerçevesi tarafından oluşturulan kullanıcı hesaplarıyla ilişkilendirmek için kullanılabilecek çeşitli teknikler vardır. Bu teknikleri göstermek için öğretici web uygulamasını kullanıcıyla ilgili bazı verileri yakalayacak şekilde artırmamız gerekir. (Şu anda, uygulamanın veri modeli yalnızca tarafından gereken SqlMembershipProvideruygulama hizmetleri tablolarını içerir.)

Kimliği doğrulanmış bir kullanıcının yorum bırakabileceği çok basit bir konuk defteri uygulaması oluşturalım. Konuk defteri yorumlarını depolamaya ek olarak, her kullanıcının kendi memleketini, giriş sayfasını ve imzasını depolamasına izin verelim. Sağlanırsa, konuk defterinde bıraktığı her iletide kullanıcının giriş şehri, giriş sayfası ve imzası görüntülenir.

GuestbookCommentsTablo Ekleme

Konuk defteri açıklamalarını yakalamak için , , SubjectBodyve CommentDategibi CommentIdsütunları olan adlı GuestbookComments bir veritabanı tablosu oluşturmamız gerekir. Ayrıca, tablodaki her kaydın açıklamayı GuestbookComments bırakan kullanıcıya başvurmasını da gerektir.

Bu tabloyu veritabanımıza eklemek için Visual Studio'da Veritabanı Gezgini'ne gidin ve veritabanında detaya SecurityTutorials gidin. Tablolar klasörüne sağ tıklayın ve Yeni Tablo Ekle'yi seçin. Bu, yeni tablonun sütunlarını tanımlamamıza olanak tanıyan bir arabirim getirir.

SecurityTutorials Veritabanına Yeni Tablo Ekleme

Şekil 1: Veritabanına Yeni Tablo SecurityTutorials Ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Ardından' sütunlarını GuestbookCommentstanımlayın. başlangıç olarak türünde uniqueidentifieradlı CommentId bir sütun ekleyin. Bu sütun, konuk defterindeki her açıklamayı benzersiz olarak tanımlar, bu nedenle izin verme NULL ve tablonun birincil anahtarı olarak işaretleme. her INSERTbir alanındaki alan için bir değer sağlamak yerine, sütunun CommentId varsayılan değerini olarak ayarlayarak bu alan INSERT için otomatik olarak yeni uniqueidentifier bir değer NEWID()oluşturulması gerektiğini belirtebiliriz. Bu ilk alanı ekledikten, birincil anahtar olarak işaretledikten ve varsayılan değerini ayarlarken, ekranınız Şekil 2'de gösterilen ekran görüntüsüne benzer görünmelidir.

CommentId Adlı Birincil Sütun Ekleme

Şekil 2: Adlı CommentId Birincil Sütun Ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Ardından, türünde adlı Subject bir sütun ve her iki sütunda da izin vermeyerek NULL türünde nvarchar(MAX)bir Body sütun nvarchar(50) ekleyin. Bunu takiben türünde datetimeadlı CommentDate bir sütun ekleyin. S'ye izin verme NULL ve sütunun CommentDate varsayılan değerini olarak getdate()ayarlama.

Geriye kalan tek şey, bir kullanıcı hesabını her konuk defteri açıklamasıyla ilişkilendiren bir sütun eklemektir. Seçeneklerden biri türünde nvarchar(256)adlı UserName bir sütun eklemek olabilir. Bu, dışında SqlMembershipProviderbir Üyelik sağlayıcısı kullanırken uygun bir seçimdir. SqlMembershipProviderAncak, bu öğretici serisinde olduğumuz için kullanırken, tablodaki sütunun UserNameaspnet_Users benzersiz olacağı garanti değildir. Tablonun aspnet_Users birincil anahtarı ve UserId türündedir uniqueidentifier. Bu nedenle, GuestbookComments tablonun türünde uniqueidentifier adlı UserId bir sütuna (değerlere izin vermemesiNULL) gerekir. Devam edin ve bu sütunu ekleyin.

Not

SQL Server'de Üyelik Şeması Oluşturma öğreticisinde ele aldığımız gibi Üyelik çerçevesi, farklı kullanıcı hesaplarına sahip birden çok web uygulamasının aynı kullanıcı depoyu paylaşmasını sağlayacak şekilde tasarlanmıştır. Bunu, kullanıcı hesaplarını farklı uygulamalara bölümleyerek yapar. Her kullanıcı adının bir uygulama içinde benzersiz olacağı garanti edilse de, aynı kullanıcı adı aynı kullanıcı deposunu kullanan farklı uygulamalarda kullanılabilir. ve ApplicationId alanlarındaki tabloda UserName bileşik UNIQUE bir kısıtlama vardır, ancak yalnızca UserName alandaki bir kısıtlama aspnet_Users yoktur. Sonuç olarak, aspnet_Users tablosunun aynı UserName değere sahip iki (veya daha fazla) kaydı olması mümkündür. Ancak tablonun UserId alanında bir UNIQUE kısıtlama aspnet_Users vardır (birincil anahtar olduğundan). Kısıtlama UNIQUE önemlidir çünkü bu olmadan ve aspnet_Users tabloları arasında GuestbookComments yabancı anahtar kısıtlaması oluşturamıyoruz.

Sütunu ekledikten UserId sonra, Araç Çubuğu'ndaki Kaydet simgesine tıklayarak tabloyu kaydedin. Yeni tabloyu olarak adlandırın GuestbookComments.

Tabloyla ilgilenebileceğimiz son bir sorun var: sütun ile GuestbookComments sütun arasında GuestbookComments.UserIdyabancı anahtar kısıtlamasıaspnet_Users.UserId oluşturmamız gerekiyor. Bunu başarmak için Araç Çubuğu'ndaki İlişki simgesine tıklayarak Yabancı Anahtar İlişkileri iletişim kutusunu başlatın. (Alternatif olarak, Tablo Tasarım Aracı menüsüne gidip İlişkiler'i seçerek bu iletişim kutusunu başlatabilirsiniz.)

Yabancı Anahtar İlişkileri iletişim kutusunun sol alt köşesindeki Ekle düğmesine tıklayın. Bu yeni bir yabancı anahtar kısıtlaması ekler, ancak yine de ilişkiye katılan tabloları tanımlamamız gerekir.

Tablonun Yabancı Anahtar Kısıtlamalarını Yönetmek için Yabancı Anahtar İlişkileri İletişim Kutusunu Kullanma

Şekil 3: Tablonun Yabancı Anahtar Kısıtlamalarını Yönetmek için Yabancı Anahtar İlişkileri İletişim Kutusunu Kullanma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Ardından, sağ taraftaki "Tablo ve Sütun Belirtimleri" satırındaki üç nokta simgesine tıklayın. Bu işlem, birincil anahtar tablosunu ve sütununu ve tablodan yabancı anahtar sütununu GuestbookComments belirtebileceğimiz Tablolar ve Sütunlar iletişim kutusunu başlatır. Özellikle, birincil anahtar tablosu ve sütunu UserId olarak ve tablosundan GuestbookComments yabancı anahtar sütunu olarak ve UserId seçin aspnet_Users (bkz. Şekil 4). Birincil ve yabancı anahtar tablolarını ve sütunlarını tanımladıktan sonra, Yabancı Anahtar İlişkileri iletişim kutusuna dönmek için Tamam'a tıklayın.

aspnet_Users ve GuesbookComments Tabloları Arasında Yabancı Anahtar Kısıtlaması Oluşturma

Şekil 4: ve GuesbookComments Tabloları Arasında aspnet_Users Yabancı Anahtar Kısıtlaması Oluşturma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu noktada yabancı anahtar kısıtlaması oluşturulmuştur. Bu kısıtlamanın varlığı, mevcut olmayan bir kullanıcı hesabına başvuran bir konuk defteri girişi olmamasını garanti ederek iki tablo arasında ilişkisel bütünlüğü güvence altına alır. Varsayılan olarak, bir yabancı anahtar kısıtlaması, ilgili alt kayıtlar varsa üst kaydın silinmesine izin vermeyecektir. Başka bir ifadeyle, bir kullanıcı bir veya daha fazla konuk defteri yorumu yaparsa ve sonra bu kullanıcı hesabını silmeye çalışırsak, önce konuk defteri açıklamaları silinmediği sürece silme işlemi başarısız olur.

Yabancı anahtar kısıtlamaları, üst kayıt silindiğinde ilişkili alt kayıtları otomatik olarak silmek üzere yapılandırılabilir. Başka bir deyişle, bir kullanıcının konuk defteri girdilerinin kullanıcı hesabı silindiğinde otomatik olarak silinmesi için bu yabancı anahtar kısıtlamasını ayarlayabiliriz. Bunu yapmak için "INSERT And UPDATE Specification" bölümünü genişletin ve "Delete Rule" özelliğini Cascade olarak ayarlayın.

Silmeleri Art Arda Eklemek için Yabancı Anahtar Kısıtlamasını Yapılandırma

Şekil 5: Yabancı Anahtar Kısıtlamasını Art Arda Silmeler İçin Yapılandırma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Yabancı anahtar kısıtlamasını kaydetmek için Kapat düğmesine tıklayarak Yabancı Anahtar İlişkilerinden çıkın. Ardından, tabloyu ve bu ilişkiyi kaydetmek için Araç Çubuğu'ndaki Kaydet simgesine tıklayın.

Kullanıcının Giriş Şehri, Giriş Sayfası ve İmzasını Depolama

Tabloda, GuestbookComments kullanıcı hesaplarıyla bire çok ilişki paylaşan bilgilerin nasıl depolandığını gösterilmektedir. Her kullanıcı hesabında rastgele sayıda ilişkili açıklama olabileceğinden, bu ilişki, her açıklamayı belirli bir kullanıcıya geri bağlayan bir sütun içeren açıklama kümesini barındıracak bir tablo oluşturularak modellenmiştir. kullanılırkenSqlMembershipProvider, bu bağlantı en iyi şekilde bu sütun ile arasında türü uniqueidentifier ve yabancı anahtar kısıtlaması adlı UserId bir sütun aspnet_Users.UserIdoluşturularak kurulur.

Şimdi, kullanıcının konuk defteri açıklamalarında görünecek giriş şehri, giriş sayfası ve imzasını depolamak için her kullanıcı hesabıyla üç sütunu ilişkilendirmemiz gerekiyor. Bunu yapmanın birçok farklı yolu vardır:

  • Öğesine yeni sütunlaraspnet_Users eklemeVeyaaspnet_MembershipTablo. tarafından SqlMembershipProviderkullanılan şemayı değiştirdiğinden bu yaklaşımı önermem. Bu karar yol boyunca seni rahatsız etmek için geri gelebilir. Örneğin, ASP.NET'ın gelecekteki bir sürümü farklı SqlMembershipProvider bir şema kullanıyorsa ne olur? Microsoft, ASP.NET 2.0 SqlMembershipProvider verilerini yeni şemaya geçirmek için bir araç içerebilir, ancak ASP.NET 2.0 SqlMembershipProvider şemasını değiştirdiyseniz bu tür bir dönüştürme mümkün olmayabilir.

  • ASP kullanın. NET'in Profil çerçevesi; giriş şehri, giriş sayfası ve imza için profil özelliği tanımlama. ASP.NET, kullanıcıya özgü ek verileri depolamak için tasarlanmış bir Profil çerçevesi içerir. Üyelik çerçevesi gibi Profil çerçevesi de sağlayıcı modelinin üzerinde oluşturulur. .NET Framework, profil verilerini SQL Server SqlProfileProvider veritabanında depolar. Aslında veritabanımız, uygulama hizmetlerini SQL Server'de Üyelik Şeması Oluşturma öğreticisine geri eklediğimizde eklendiği gibi ()aspnet_Profile tarafından SqlProfileProvider kullanılan tabloya zaten sahiptir.
    Profil çerçevesinin temel avantajı, geliştiricilerin içinde profil özelliklerini Web.config tanımlamasına olanak sağlamasıdır; profil verilerini temel alınan veri deposuna ve deposundan seri hale getirmek için kod yazılması gerekmez. Kısacası, bir profil özellikleri kümesi tanımlamak ve bunlarla kodda çalışmak inanılmaz derecede kolaydır. Ancak, sürüm oluşturma söz konusu olduğunda Profil sistemi istenen birçok şey bırakır; bu nedenle, kullanıcıya özgü yeni özelliklerin daha sonra eklenmesini veya mevcut özelliklerin kaldırılmasını veya değiştirilmesini beklediğiniz bir uygulamanız varsa, Profil çerçevesi en iyi seçenek olmayabilir. Ayrıca, SqlProfileProvider profil özelliklerini yüksek oranda normalleştirilmiş olmayan bir şekilde depolar ve profil verileri üzerinde doğrudan sorgu çalıştırmayı imkansız hale getirir (örneğin, kaç kullanıcının New York'ta ev sahibi olduğu gibi).
    Profil çerçevesi hakkında daha fazla bilgi için bu öğreticinin sonundaki "Diğer Okumalar" bölümüne bakın.

  • Bu üç sütunu veritabanındaki yeni bir tabloya ekleyin ve bu tabloaspnet_Users ile. Bu yaklaşım Profil çerçevesine göre biraz daha fazla çalışma içerir, ancak ek kullanıcı özelliklerinin veritabanında nasıl modellendiği konusunda en yüksek esnekliği sunar. Bu öğreticide bu seçeneği kullanacağız.

Her kullanıcı için giriş kasabasını, giriş sayfasını ve imzayı kaydetmek için adlı UserProfiles yeni bir tablo oluşturacağız. Veritabanı Gezgini penceresinde Tablolar klasörüne sağ tıklayın ve yeni bir tablo oluşturmayı seçin. İlk sütunu UserId adlandırın ve türünü olarak uniqueidentifierayarlayın. Değerlere izin verme NULL ve sütunu birincil anahtar olarak işaretleme. Ardından, türünde ; HomeTownHomepageUrl türünde nvarchar(50)nvarchar(100)ve türünde İmza nvarchar(500)adlı sütunları ekleyin. Bu üç sütunun her biri bir NULL değeri kabul edebilir.

UserProfiles Tablosu Oluşturma

Şekil 6: Tablo Oluşturma UserProfiles (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Tabloyu kaydedin ve olarak adlandırın UserProfiles. Son olarak, tablonun UserId alanıyla alanı arasında UserProfiles yabancı anahtar kısıtlaması aspnet_Users.UserId oluşturun. ve aspnet_Users tabloları arasındaki yabancı anahtar kısıtlamasını GuestbookComments yaptığımız gibi, bu kısıtlamanın art arda silinmesini sağlayın. UserId içindeki UserProfiles alanı birincil anahtar olduğundan, her kullanıcı hesabı için tabloda birden fazla kayıt UserProfiles olmamasını sağlar. Bu ilişki türü bire bir olarak adlandırılır.

Artık veri modelini oluşturduğumuza göre, bunu kullanmaya hazırız. 2. ve 3. Adımlarda, oturum açmış olan kullanıcının giriş şehri, giriş sayfası ve imza bilgilerini nasıl görüntüleyebileceğine ve düzenleyebileceğine bakacağız. 4. Adımda, kimliği doğrulanmış kullanıcıların konuk defterine yeni açıklamalar göndermesi ve mevcut yorumları görüntülemesi için arabirimi oluşturacağız.

2. Adım: Kullanıcının Giriş Şehri, Giriş Sayfası ve İmzasını Görüntüleme

Oturum açmış olan kullanıcının giriş şehri, giriş sayfası ve imza bilgilerini görüntülemesine ve düzenlemesine izin vermenin çeşitli yolları vardır. Kullanıcı arabirimini TextBox ve Label denetimleriyle el ile oluşturabilir veya DetailsView denetimi gibi veri Web denetimlerinden birini kullanabiliriz. Veritabanını SELECT ve UPDATE deyimleri gerçekleştirmek için sayfamızın arka planda kod sınıfında ADO.NET kod yazabilir veya alternatif olarak SqlDataSource ile bildirim temelli bir yaklaşım kullanabiliriz. İdeal olarak uygulamamız katmanlanmış bir mimari içerir. Bu mimari, sayfanın arka planda kod sınıfından program aracılığıyla veya ObjectDataSource denetimi aracılığıyla bildirim temelli olarak çağrılabilir.

Bu öğretici serisi form kimlik doğrulaması, yetkilendirme, kullanıcı hesapları ve rollere odaklandığından, bu farklı veri erişim seçenekleri veya sql deyimlerini doğrudan ASP.NET sayfasından yürütmek yerine katmanlı mimarinin neden tercih edilir olduğu hakkında ayrıntılı bir tartışma olmayacaktır. En hızlı ve en kolay seçenek olan DetailsView ve SqlDataSource'un kullanımına göz atacağım, ancak tartışılan kavramlar kesinlikle alternatif Web denetimlerine ve veri erişim mantığına uygulanabilir. ASP.NET'da verilerle çalışma hakkında daha fazla bilgi için ASP.NET 2.0'da Verilerle Çalışma öğretici serime bakın.

Klasördeki sayfayı AdditionalUserInfo.aspx açın ve sayfaya bir DetailsView denetimi ekleyerek özelliğini UserProfile olarak ayarlayın ID ve ve Height özelliklerini temizleyinWidth.Membership DetailsView'un Akıllı Etiketini genişletin ve yeni bir veri kaynağı denetimine bağlamayı seçin. Bu işlem DataSource Yapılandırma Sihirbazı'nı başlatır (bkz. Şekil 7). İlk adım, veri kaynağı türünü belirtmenizi ister. Doğrudan veritabanına bağlanacağımızdan SecurityTutorials Veritabanı simgesini seçin ve öğesini olarak UserProfileDataSourcebelirtinID.

UserProfileDataSource Adlı Yeni bir SqlDataSource Denetimi Ekleme

Şekil 7: Adlı UserProfileDataSource Yeni Bir SqlDataSource Denetimi Ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Sonraki ekranda veritabanının kullanılması istenir. veritabanı için SecurityTutorials içinde Web.config zaten bir bağlantı dizesi tanımladık. Bu bağlantı dizesi adı – SecurityTutorialsConnectionString – açılan listede olmalıdır. Bu seçeneği belirleyin ve İleri'ye tıklayın.

Drop-Down Listesinden SecurityTutorialsConnectionString'i seçin

Şekil 8: Drop-Down Listesi'nden seçim yapın SecurityTutorialsConnectionString (Tam boyutlu resmi görüntülemek için tıklayın)

Sonraki ekranda sorguya eklenecek tabloyu ve sütunları belirtmemiz istendi. Açılan listeden UserProfiles tabloyu seçin ve tüm sütunları denetleyin.

UserProfiles Tablosundaki Tüm Sütunları Geri Getir

Şekil 9: Tablodaki Tüm Sütunları UserProfiles Geri Getirme (Tam boyutlu resmi görüntülemek için tıklayın)

Şekil 9'daki geçerli sorgu içindeki UserProfilestüm kayıtları döndürür, ancak yalnızca şu anda oturum açmış olan kullanıcının kaydıyla ilgileniyoruz. Yan tümce eklemek WHERE için düğmeye tıklayarak WHERE Yan Tümce Ekle WHERE iletişim kutusunu açın (bkz. Şekil 10). Burada filtre uygulanacak sütunu, işleci ve filtre parametresinin kaynağını seçebilirsiniz. Sütun olarak ve İşleç olarak "=" öğesini seçin UserId .

Ne yazık ki şu anda oturum açmış olan kullanıcının UserId değerini döndürecek yerleşik parametre kaynağı yok. Bu değeri program aracılığıyla yakalamamız gerekir. Bu nedenle, Kaynak açılan listesini "Yok" olarak ayarlayın, parametreyi eklemek için Ekle düğmesine tıklayın ve ardından Tamam'a tıklayın.

UserId Sütununa Filtre Parametresi Ekleme

Şekil 10: Sütuna UserId Filtre Parametresi Ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Tamam'a tıkladıktan sonra Şekil 9'da gösterilen ekrana dönersiniz. Ancak bu kez ekranın en altındaki SQL sorgusu bir WHERE yan tümce içermelidir. "Test Sorgusu" ekranına geçmek için İleri'ye tıklayın. Burada sorguyu çalıştırabilir ve sonuçları görebilirsiniz. Sihirbazı tamamlamak için Son’a tıklayın.

DataSource Yapılandırma Sihirbazı'nı tamamladıktan sonra Visual Studio, sihirbazda belirtilen ayarlara göre SqlDataSource denetimini oluşturur. Ayrıca, SqlDataSource'un tarafından döndürülen her sütun için DetailsView'a BoundFields'ı SelectCommandel ile ekler. Kullanıcının bu değeri bilmesi gerekmediğinden, alanı DetailsView'da göstermeniz UserId gerekmez. Bu alanı doğrudan DetailsView denetiminin bildirim temelli işaretlemesinden veya Akıllı Etiketinden "Alanları Düzenle" bağlantısına tıklayarak kaldırabilirsiniz.

Bu noktada sayfanızın bildirim temelli işaretlemesi aşağıdakine benzer olmalıdır:

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

Veriler seçilmeden önce SqlDataSource denetiminin UserId parametresini şu anda oturum açmış olan kullanıcının UserId parametresine program aracılığıyla ayarlamamız gerekir. Bu, SqlDataSource'un Selecting olayı için bir olay işleyicisi oluşturup buraya aşağıdaki kodu ekleyerek gerçekleştirilebilir:

protected void UserProfileDataSource_Selecting(object sender, 
          SqlDataSourceSelectingEventArgs e)
{
     // Get a reference to the currently logged on user
     MembershipUser currentUser = Membership.GetUser();
 
     // Determine the currently logged on user's UserId value
     Guid currentUserId = (Guid)currentUser.ProviderUserKey;
 
     // Assign the currently logged on user's UserId to the @UserId parameter
     e.Command.Parameters["@UserId"].Value = currentUserId;
}

Yukarıdaki kod, sınıfın GetUser yöntemini çağırarak Membership şu anda oturum açmış olan kullanıcıya bir başvuru alarak başlar. Bu, özelliği öğesini ProviderUserKey içeren UserIdbir MembershipUser nesnesi döndürür. Değer UserId daha sonra SqlDataSource @UserId parametresine atanır.

Not

yöntemi, Membership.GetUser() şu anda oturum açmış olan kullanıcı hakkındaki bilgileri döndürür. Anonim bir kullanıcı sayfayı ziyaret ederse, değerini nulldöndürür. Böyle bir durumda bu, özelliği okumaya çalışırken aşağıdaki kod satırında bir'e NullReferenceExceptionProviderUserKey yol açar. Bu klasördeki AdditionalUserInfo.aspx ASP.NET kaynaklarına yalnızca kimliği doğrulanmış kullanıcıların erişebilmesi için önceki bir öğreticide URL yetkilendirmesini yapılandırdığımız için sayfada bir değer döndürme null konusunda endişelenmemiz Membership.GetUser() gerekmez. Anonim erişime izin verilen bir sayfada oturum açmış olan kullanıcı hakkındaki bilgilere erişmeniz gerekiyorsa, özelliklerine başvurmadan önce yönteminden nesne olmayannull MembershipUser bir nesnenin döndürüldüğünden GetUser() emin olun.

Sayfayı tarayıcı üzerinden ziyaret ederseniz tabloya AdditionalUserInfo.aspx henüz satır UserProfiles eklemediğimiz için boş bir sayfa görürsünüz. 6. Adımda, yeni bir kullanıcı hesabı oluşturulduğunda tabloya otomatik olarak yeni bir satır eklemek için UserProfiles CreateUserWizard denetiminin nasıl özelleştirileceğine bakacağız. Ancak şimdilik tabloda el ile kayıt oluşturmamız gerekir.

Visual Studio'da Veritabanı Gezgini'ne gidin ve Tablolar klasörünü genişletin. Tabloya sağ tıklayın ve tablodaki aspnet_Users kayıtları görmek için "Tablo Verilerini Göster"i seçin; tablo için UserProfiles de aynı işlemi yapın. Şekil 11'de bu sonuçlar dikey olarak döşendiğinde gösterilmiştir. Veritabanımda şu anda aspnet_Users Bruce, Fred ve Tito için kayıtlar var, ancak tabloda hiç kayıt UserProfiles yok.

aspnet_Users ve UserProfiles Tablolarının İçeriği Görüntülenir

Şekil 11: ve UserProfiles Tablolarının aspnet_Users İçeriği Görüntülenir (Tam boyutlu resmi görüntülemek için tıklayın)

, ve alanlarının UserProfiles değerlerini el ile yazarak tabloya HomeTownyeni bir kayıt Signature ekleyin. HomepageUrl Yeni kayıtta geçerli UserId bir değer almanın en kolay yolu, tablodaki belirli bir kullanıcı hesabından aspnet_Users alanı seçmek UserId ve kopyalayıp UserId içindeki UserProfilesalana yapıştırmaktır.UserProfiles Şekil 12'de UserProfiles Bruce için yeni bir kayıt eklendikten sonra tablo gösterilmektedir.

Bruce için UserProfiles'a Bir Kayıt Eklendi

Şekil 12: Bruce için bir UserProfiles Kayıt Eklendi (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Sayfaya AdditionalUserInfo.aspx geri dön, Bruce olarak oturum aç. Şekil 13'de gösterildiği gibi Bruce'un ayarları görüntülenir.

Şu anda ziyaret eden kullanıcıya ayarları gösterilir

Şekil 13: Şu Anda Ziyaret Eden Kullanıcıya Ayarları Gösteriliyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Not

Devam edin ve her Üyelik kullanıcısı için tabloya UserProfiles kayıtları el ile ekleyin. 6. Adımda, yeni bir kullanıcı hesabı oluşturulduğunda tabloya otomatik olarak yeni bir satır eklemek için UserProfiles CreateUserWizard denetiminin nasıl özelleştirileceğine bakacağız.

3. Adım: Kullanıcının Kendi Ana Sayfasını, Giriş Sayfasını ve İmzasını Düzenlemesine İzin Verme

Bu noktada oturum açmış olan kullanıcı giriş kasabasını, giriş sayfasını ve imza ayarını görüntüleyebilir, ancak henüz değiştiremez. Verilerin düzenlenebilmesi için DetailsView denetimini güncelleştirelim.

Yapmamız gereken ilk şey, yürütülecek deyimini ve buna karşılık gelen parametreleri belirterek UPDATE SqlDataSource için bir UpdateCommand eklemektir. SqlDataSource'u seçin ve Özellikler penceresi UpdateQuery özelliğinin yanındaki üç noktaya tıklayarak Komut ve Parametre Düzenleyicisi iletişim kutusunu açın. Metin kutusuna aşağıdaki UPDATE deyimi girin:

UPDATE UserProfiles SET
     HomeTown = @HomeTown,
     HomepageUrl = @HomepageUrl,
     Signature = @Signature
WHERE UserId = @UserId

Ardından, deyimindeki parametrelerin her biri için SqlDataSource denetiminin UpdateParameters koleksiyonunda bir parametre oluşturacak olan "Parametreleri UPDATE Yenile" düğmesine tıklayın. Tüm parametrelerin kaynağını Yok olarak bırakın ve iletişim kutusunu tamamlamak için Tamam düğmesine tıklayın.

SqlDataSource'un UpdateCommand ve UpdateParameters değerlerini belirtin

Şekil 14: SqlDataSource'ları UpdateCommand belirtin ve UpdateParameters (Tam boyutlu görüntüyü görüntülemek için tıklayın)

SqlDataSource denetimine yaptığımız eklemeler nedeniyle DetailsView denetimi artık düzenlemeyi destekleyebilir. DetailsView'ın Akıllı Etiketi'nden "Düzenlemeyi Etkinleştir" onay kutusunu işaretleyin. Bu, denetimin Fields koleksiyonuna ShowEditButton özelliği True olarak ayarlanmış bir CommandField ekler. Bu işlem, DetailsView salt okunur modda görüntülendiğinde düzenle düğmesini ve düzenleme modunda görüntülendiğinde Güncelleştir ve İptal düğmelerini işler. Kullanıcının Düzenle'ye tıklamasını gerektirmek yerine DetailsView denetiminin özelliğini olarak ayarlayarak DetailsView'ın DefaultMode "her zaman düzenlenebilir" durumda işlenmesini Editsağlayabiliriz.

Bu değişikliklerle, DetailsView denetiminizin bildirim temelli işaretlemesi aşağıdakine benzer görünmelidir:

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

CommandField ve özelliğinin eklenmesine dikkat edin DefaultMode .

Devam edin ve bu sayfayı bir tarayıcı üzerinden test edin. içinde karşılık gelen bir kaydı UserProfilesolan bir kullanıcıyla ziyaret edilirken, kullanıcının ayarları düzenlenebilir bir arabirimde görüntülenir.

DetailsView Düzenlenebilir Bir Arabirim İşler

Şekil 15: DetailsView Düzenlenebilir Bir Arabirim İşler (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Değerleri değiştirmeyi ve Güncelleştir düğmesine tıklamayı deneyin. Hiçbir şey olmuyor gibi görünüyor. Bir geri gönderme vardır ve değerler veritabanına kaydedilir, ancak kaydetmenin gerçekleştiğine ilişkin görsel bir geri bildirim yoktur.

Bunu düzeltmek için Visual Studio'ya dönün ve DetailsView'un üzerine bir Etiket denetimi ekleyin. öğesini ID olarakSettingsUpdatedMessageText, özelliğini "Ayarlarınız güncelleştirildi" olarak, Visible ve EnableViewState özelliklerini olarak falseayarlayın.

<asp:Label ID="SettingsUpdatedMessage" runat="server"
     Text="Your settings have been updated."
     EnableViewState="false"
     Visible="false"></asp:Label>

DetailsView her güncelleştirildiğinde Etiketi görüntülememiz SettingsUpdatedMessage gerekir. Bunu gerçekleştirmek için DetailsView ItemUpdated olayı için bir olay işleyicisi oluşturun ve aşağıdaki kodu ekleyin:

protected void UserProfile_ItemUpdated(object sender, DetailsViewUpdatedEventArgs e)
{
     SettingsUpdatedMessage.Visible = true;
}

Bir tarayıcı üzerinden sayfaya AdditionalUserInfo.aspx dönün ve verileri güncelleştirin. Bu kez, yararlı bir durum iletisi görüntülenir.

Ayarlar Güncelleştirildiğinde Kısa bir İleti Görüntülenir

Şekil 16: Ayarlar Güncelleştirildiğinde Kısa bir İleti Görüntülenir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Not

DetailsView denetiminin düzenleme arabirimi istenen çok şey bırakır. Standart boyutlu metin kutuları kullanır, ancak İmza alanı büyük olasılıkla çok satırlı bir metin kutusu olmalıdır. Giriş sayfası URL'sinin girilmesi durumunda "http://" veya "https://" ile başladığından emin olmak için Bir RegularExpressionValidator kullanılmalıdır. Ayrıca, DetailsView denetiminin DefaultMode özelliği olarak ayarlandığından Editİptal düğmesi hiçbir şey yapmaz. Kaldırılmalı veya tıklandığında kullanıcıyı başka bir sayfaya (örneğin ~/Default.aspx) yönlendirmelidir. Bu geliştirmeleri okuyucu için bir alıştırma olarak bırakıyorum.

Şu anda web sitesi sayfaya AdditionalUserInfo.aspx herhangi bir bağlantı sağlamamaktadır. Buna ulaşmanın tek yolu, sayfanın URL'sini doğrudan tarayıcının Adres çubuğuna girmektir. Şimdi ana sayfada bu sayfaya Site.master bir bağlantı ekleyelim.

Ana sayfanın ContentPlaceHolder'da LoginContent kimliği doğrulanmış ve anonim ziyaretçiler için farklı işaretlemeler görüntüleyen bir LoginView Web denetimi içerdiğini hatırlayın. Sayfaya bağlantı eklemek için LoginView denetimlerini LoggedInTemplate güncelleştirin AdditionalUserInfo.aspx . Bu değişiklikleri yaptıktan sonra LoginView denetiminin bildirim temelli işaretlemesi aşağıdakine benzer görünmelidir:

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

HyperLink denetiminin lnkUpdateSettings öğesine ekli olduğunu LoggedInTemplateunutmayın. Bu bağlantı mevcutken, kimliği doğrulanmış kullanıcılar hızla sayfaya atlayarak giriş kasabalarını, giriş sayfalarını ve imza ayarlarını görüntüleyebilir ve değiştirebilirler.

4. Adım: Yeni Konuk Defteri Açıklamaları Ekleme

Sayfa Guestbook.aspx , kimliği doğrulanmış kullanıcıların konuk defterini görüntüleyip yorum bırakabileceği yerdir. Yeni konuk defteri açıklamaları eklemek için arabirimini oluşturarak başlayalım.

Sayfayı Guestbook.aspx Visual Studio'da açın ve biri yeni açıklamanın konusu ve diğeri gövdesi için olmak üzere iki TextBox denetiminden oluşan bir kullanıcı arabirimi oluşturun. İlk TextBox denetiminin ID özelliğini Subject olarak ve Columns özelliğini 40 olarak ayarlayın; saniye BodyID değerini olarak, TextModeMultiLineöğesini olarak ve Width ve Rows özelliklerini sırasıyla "%95" ve 8 olarak ayarlayın. Kullanıcı arabirimini tamamlamak için adlı PostCommentButton bir Düğme Web denetimi ekleyin ve özelliğini "Açıklamanızı Gönderin" olarak ayarlayın Text .

Her konuk defteri açıklaması bir konu ve gövde gerektirdiğinden, TextBox'ların her biri için bir RequiredFieldValidator ekleyin. Bu denetimlerin ValidationGroup özelliğini "EnterComment" olarak ayarlayın; benzer şekilde, denetimin PostCommentButtonValidationGroup özelliğini "EnterComment" olarak ayarlayın. ASP hakkında daha fazla bilgi için. NET'in doğrulama denetimleri, ASP.NET'da Form Doğrulama'ya göz atın.

Kullanıcı arabirimini oluşturma işleminin ardından sayfanızın bildirim temelli işaretlemesi aşağıdakine benzer olmalıdır:

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

Kullanıcı arabirimi tamamlandıktan sonra, sonraki görevimiz öğesine tıklandığında PostCommentButton tabloya GuestbookComments yeni bir kayıt eklemektir. Bu çeşitli yollarla gerçekleştirilebilir: Düğmenin Click olay işleyicisinde ADO.NET kod yazabiliriz; sayfaya bir SqlDataSource denetimi ekleyebilir, öğesini yapılandırabilir InsertCommandve olay işleyicisinden Click yöntemini çağırabilirizInsert; ya da yeni konuk defteri açıklamaları eklemekten sorumlu olan bir orta katman oluşturabilir ve bu işlevi olay işleyicisinden Click çağırabiliriz. 3. Adımda SqlDataSource kullanmaya baktığımız için burada ADO.NET kodu kullanalım.

Not

Microsoft SQL Server veritabanındaki verilere program aracılığıyla erişmek için kullanılan ADO.NET sınıfları ad alanında System.Data.SqlClient bulunur. Bu ad alanını sayfanızın arka kod arkası sınıfına (örneğin) using System.Data.SqlClient;içeri aktarmanız gerekebilir.

'nin Click olayı için PostCommentButtonbir olay işleyicisi oluşturun ve aşağıdaki kodu ekleyin:

protected void PostCommentButton_Click(object sender, EventArgs e)
{
     if (!Page.IsValid)
          return;
 
     // Determine the currently logged on user's UserId
     MembershipUser currentUser = Membership.GetUser();
     Guid currentUserId = (Guid)currentUser.ProviderUserKey;
 
     // Insert a new record into GuestbookComments
     string connectionString = 
          ConfigurationManager.ConnectionStrings["SecurityTutorialsConnectionString"].ConnectionString;
     string insertSql = "INSERT INTO GuestbookComments(Subject, Body, UserId) VALUES(@Subject,
               @Body, @UserId)";
 
     using (SqlConnection myConnection = new SqlConnection(connectionString))
     {
          myConnection.Open();
          SqlCommand myCommand = 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();
     }
 
     // "Reset" the Subject and Body TextBoxes
     Subject.Text = string.Empty;
     Body.Text = string.Empty;
}

Olay işleyicisi Click , kullanıcı tarafından sağlanan verilerin geçerli olup olmadığını denetleyerek başlar. Değilse, olay işleyicisi kayıt eklemeden önce çıkar. Sağlanan verilerin geçerli olduğu varsayıldığında, şu anda oturum açmış olan kullanıcının UserId değeri alınır ve yerel değişkende currentUserId depolanır. içine kayıt GuestbookCommentseklerken bir UserId değer sağlamamız gerektiğinden bu değer gereklidir.

Bundan sonra, veritabanı için SecurityTutorials bağlantı dizesi'nden Web.config alınır ve INSERT SQL deyimi belirtilir. Ardından bir SqlConnection nesne oluşturulur ve açılır. Ardından bir SqlCommand nesne oluşturulur ve sorguda kullanılan parametrelerin INSERT değerleri atanır. Ardından INSERT deyimi yürütülür ve bağlantı kapatılır. Olay işleyicisinin sonunda, Subject ve Body TextBoxes'ın Text özellikleri, kullanıcının değerlerinin geri gönderme boyunca kalıcı olmaması için temizlenir.

Devam edin ve bu sayfayı bir tarayıcıda test edin. Bu sayfa klasörde olduğundan Membership anonim ziyaretçiler tarafından erişilemez. Bu nedenle, önce oturum açmanız gerekir (henüz yapmadıysanız). ve Body TextBoxes içine Subject bir değer girin ve düğmeye PostCommentButton tıklayın. Bu, öğesine yeni bir kaydın eklenmesine GuestbookCommentsneden olur. Geri göndermede, sağladığınız konu ve gövde TextBoxes'tan silinir.

Düğmeye tıkladıktan sonra açıklamanın PostCommentButton konuk defterine eklendiğine ilişkin görsel bir geri bildirim yoktur. 5. Adımda gerçekleştirdiğimiz mevcut konuk defteri açıklamalarını görüntülemek için bu sayfayı güncelleştirmemiz gerekiyor. Bunu başardıktan sonra, yeni eklenen açıklama yorum listesinde görünür ve yeterli görsel geri bildirim sağlar. Şimdilik, tablo içeriğini GuestbookComments inceleyerek konuk defteri açıklamanızın kaydedildiğini onaylayın.

Şekil 17'de iki açıklama bırakıldıktan sonra tablonun içeriği GuestbookComments gösterilir.

GuestbookComments Tablosunda Konuk Defteri Açıklamalarını Görebilirsiniz

Şekil 17: Tablodaki GuestbookComments Konuk Defteri Açıklamalarını Görebilirsiniz (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Not

Kullanıcı, HTML gibi tehlikeli olabilecek işaretlemeler içeren bir konuk defteri açıklaması eklemeye çalışırsa ASP.NET bir HttpRequestValidationExceptionoluşturur. Bu özel durum, neden oluşturuldu ve kullanıcıların tehlikeli olabilecek değerleri göndermesine izin verme hakkında daha fazla bilgi edinmek için İstek Doğrulama Teknik İncelemesi'ne başvurun.

5. Adım: Mevcut Konuk Defteri Açıklamalarını Listeleme

Açıklama bırakmanın yanı sıra, sayfayı Guestbook.aspx ziyaret eden bir kullanıcının konuk defterinin mevcut yorumlarını da görüntüleyebilmesi gerekir. Bunu yapmak için sayfanın en altına adlı CommentList bir ListView denetimi ekleyin.

Not

ListView denetimi, ASP.NET sürüm 3.5'e yeni eklendi. Çok özelleştirilebilir ve esnek bir düzende öğelerin listesini görüntülemek için tasarlanmıştır, ancak yine de GridView gibi yerleşik düzenleme, ekleme, silme, sayfalama ve sıralama işlevleri sunar. ASP.NET 2.0 kullanıyorsanız bunun yerine DataList veya Repeater denetimini kullanmanız gerekir. ListView kullanma hakkında daha fazla bilgi için Scott Guthrie'nin blog girdisi , Asp:ListView Denetimi ve ListView Denetimiile Verileri Görüntüleme makaleme bakın.

ListView'un Akıllı Etiketini açın ve Veri Kaynağı Seç açılan listesinden denetimi yeni bir veri kaynağına bağlayın. 2. Adımda gördüğümüz gibi, bu işlem Veri Kaynağı Yapılandırma Sihirbazı'nı başlatır. Veritabanı simgesini seçin, sonuçta elde edilen SqlDataSource CommentsDataSourceadını verin ve Tamam'a tıklayın. Ardından, açılan listeden SecurityTutorialsConnectionString bağlantı dizesini seçin ve İleri'ye tıklayın.

2. Adımda bu noktada, açılan listeden tabloyu seçip UserProfiles döndürülecek sütunları seçerek sorgulanması gereken verileri belirttik (Şekil 9'a geri bakın). Ancak bu kez, yalnızca 'den GuestbookCommentskayıtları değil, aynı zamanda yorumlayanın giriş şehrini, giriş sayfasını, imzasını ve kullanıcı adını da geri çeken bir SQL deyimi oluşturmak istiyoruz. Bu nedenle, "Özel bir SQL deyimi veya saklı yordam belirtin" radyo düğmesini seçin ve İleri'ye tıklayın.

Bu, "Özel Deyimleri veya Saklı Yordamları Tanımla" ekranını açar. Sorguyu grafik olarak oluşturmak için Sorgu Oluşturucusu düğmesine tıklayın. Sorgu Oluşturucusu, sorgulamak istediğimiz tabloları belirtmemizi isteyerek başlar. GuestbookComments, ve UserProfilestablolarını seçip Tamam'a aspnet_Users tıklayın. Bu, üç tabloyu da tasarım yüzeyine ekler. , UserProfilesve aspnet_Users tabloları arasında GuestbookCommentsyabancı anahtar kısıtlamaları olduğundan, Sorgu Oluşturucusu bu tabloları otomatik JOIN olarak oluşturur.

Geriye kalan tek şey, döndürülecek sütunları belirtmektir. Tablodan GuestbookComments , ve BodyCommentDate sütunlarını seçinSubject; tablodan , HomepageUrlve Signature sütunlarını döndürerek HomeTowntablosundan UserProfiles geri dönün UserNameaspnet_Users. Ayrıca, en son gönderilerin önce döndürülmesi için sorgunun SELECT sonuna "ORDER BY CommentDate DESC" ekleyin. Bu seçimleri yaptıktan sonra Sorgu Oluşturucusu arabiriminiz Şekil 18'deki ekran görüntüsüne benzer olmalıdır.

Yapılandırılan Sorgu GuestbookComments, UserProfiles ve aspnet_Users Tablolarını JOIN'ler

Şekil 18: Oluşturulan Sorgu JOIN , UserProfilesve aspnet_Users Tablolarıdır GuestbookComments(Tam boyutlu görüntüyü görüntülemek için tıklayın)

Sorgu Oluşturucusu penceresini kapatmak için Tamam'a tıklayın ve "Özel Deyimleri veya Saklı Yordamları Tanımla" ekranına dönün. "Test Sorgusu" ekranına ilerlemek için İleri'ye tıklayın. Burada Sorguyu Test Et düğmesine tıklayarak sorgu sonuçlarını görüntüleyebilirsiniz. Hazır olduğunuzda, Veri Kaynağını Yapılandırma sihirbazını tamamlamak için Son'a tıklayın.

2. Adımda Veri Kaynağını Yapılandırma sihirbazını tamamladığımızda, ilişkili DetailsView denetiminin Fields koleksiyonu tarafından döndürülen SelectCommandher sütun için bir BoundField içerecek şekilde güncelleştirildi. Ancak ListView değişmeden kalır; yine de düzenini tanımlamamız gerekiyor. ListView'un düzeni bildirim temelli işaretlemesi aracılığıyla veya Akıllı Etiketindeki "ListView'ı Yapılandır" seçeneğinden el ile oluşturulabilir. İşaretlemeyi genellikle el ile tanımlamayı tercih ederim, ancak sizin için en doğal olan yöntemi kullanın.

ListView denetimim için aşağıdaki LayoutTemplate, ItemTemplateve ItemSeparatorTemplate öğesini kullanmaya son verdim:

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

denetimi LayoutTemplate tarafından yayılan işaretlemeyi tanımlarken ItemTemplate , SqlDataSource tarafından döndürülen her öğeyi işler. Elde edilen ItemTemplateişaretleme 'nin itemPlaceholder denetimine LayoutTemplateyerleştirilir. öğesine ek olarak itemPlaceholder, LayoutTemplate ListView'u sayfa başına yalnızca 10 konuk defteri açıklamasını (varsayılan) gösterecek şekilde sınırlayan ve disk belleği arabirimini işleyen bir DataPager denetimi içerir.

My ItemTemplate her konuk defteri açıklamasının konusunu, konunun altında bulunan gövdeyle birlikte bir <h4> öğede görüntüler. Gövdeyi görüntülemek için kullanılan söz diziminin databinding deyimi tarafından Eval("Body") döndürülen verileri aldığını, dizeye dönüştürdüğünü ve satır sonlarını öğesiyle <br /> değiştirdiğini unutmayın. Boşluk HTML tarafından yoksayıldığından, açıklama gönderilirken girilen satır sonlarını göstermek için bu dönüştürme gereklidir. Kullanıcının imzası, italik olarak cesedin altında görüntülenir ve ardından kullanıcının memleketi, ana sayfasının bağlantısı, yorumun yapıldığı tarih ve saat ve açıklamadan ayrılan kişinin kullanıcı adı gösterilir.

Sayfayı bir tarayıcı üzerinden görüntülemek için biraz zaman ayırın. 5. Adımda konuk defterine eklediğiniz açıklamaları burada görmeniz gerekir.

Guestbook.aspx Şimdi Konuk Kitabının Açıklamalarını Görüntüler

Şekil 19: Guestbook.aspx Şimdi Konuk Kitabının Açıklamalarını Görüntüler (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Konuk defterine yeni bir açıklama eklemeyi deneyin. Düğmeye tıklandığında PostCommentButton sayfa geri gönderilir ve açıklama veritabanına eklenir, ancak ListView denetimi yeni açıklamayı gösterecek şekilde güncelleştirilmez. Bu, aşağıdakilerden biriyle düzeltilebilir:

  • PostCommentButton Yeni açıklamayı veritabanına ekledikten sonra ListView denetiminin DataBind() yöntemini çağıran düğmenin Click olay işleyicisini güncelleştirme veya
  • ListView denetiminin EnableViewState özelliğini olarak falseayarlama. Bu yaklaşım işe yarar çünkü denetimin görünüm durumunu devre dışı bırakarak her geri göndermede temel alınan verilere yeniden bağlaması gerekir.

Bu öğreticiden indirilebilen öğretici web sitesi her iki tekniği de gösterir. ListView denetiminin EnableViewState özelliği false ve verileri ListView'a program aracılığıyla yeniden bağlaması için gereken kod olay işleyicisinde Click bulunur, ancak açıklama satırı yapılır.

Not

AdditionalUserInfo.aspx Şu anda sayfa kullanıcının giriş şehri, giriş sayfası ve imza ayarlarını görüntülemesine ve düzenlemesine izin verir. Oturum açmış kullanıcının konuk defteri açıklamalarını görüntülemek için güncelleştirme AdditionalUserInfo.aspx yapmak iyi olabilir. Başka bir ifadeyle, kullanıcı bilgilerini incelemeye ve değiştirmeye ek olarak, geçmişte hangi konuk defteri yorumlarını yaptığını görmek için sayfayı ziyaret AdditionalUserInfo.aspx edebilir. Bunu ilgili okuyucu için bir alıştırma olarak bırakıyorum.

6. Adım: CreateUserWizard Denetimini Giriş Şehri, Giriş Sayfası ve İmza için Arabirim Içerecek Şekilde Özelleştirme

SELECT Sayfa tarafından Guestbook.aspx kullanılan sorgu, , UserProfilesve aspnet_Users tabloları arasında GuestbookCommentsilgili kayıtları birleştirmek için kullanırINNER JOIN. içinde UserProfiles kaydı olmayan bir kullanıcı bir konuk defteri açıklaması yaparsa, yalnızca ve aspnet_Usersiçinde eşleşen kayıtlar olduğunda kayıtları döndürdüğünden INNER JOINGuestbookComments, açıklama ListView'da UserProfiles görüntülenmez. 3. Adımda gördüğümüz gibi, bir kullanıcının kaydı UserProfiles yoksa sayfada ayarlarını AdditionalUserInfo.aspx görüntüleyemez veya düzenleyemez.

Söylemeye gerek yok, tasarım kararlarımız nedeniyle Üyelik sistemindeki her kullanıcı hesabının tabloda eşleşen bir kaydı UserProfiles olması önemlidir. CreateUserWizard aracılığıyla yeni bir Üyelik kullanıcı hesabı oluşturulduğunda buna karşılık gelen bir kaydın eklenmesini UserProfiles istiyoruz.

Kullanıcı Hesapları Oluşturma öğreticisinde açıklandığı gibi, yeni Üyelik kullanıcı hesabı oluşturulduktan sonra CreateUserWizard denetimi olayını tetiklerCreatedUser. Bu olay için bir olay işleyicisi oluşturabilir, yeni oluşturulan kullanıcının UserId değerini alabilir ve ardından , HomepageUrlve Signature sütunları için varsayılan değerlerle tabloya UserProfilesHomeTownbir kayıt ekleyebiliriz. Dahası, CreateUserWizard denetiminin arabirimini ek TextBox'lar içerecek şekilde özelleştirerek kullanıcıdan bu değerleri istemesi mümkündür.

İlk olarak, varsayılan değerlerle olay işleyicisindeki CreatedUser tabloya UserProfiles nasıl yeni bir satır ekleneceğini inceleyelim. Bundan sonra CreateUserWizard denetiminin kullanıcı arabirimini yeni kullanıcının giriş şehri, giriş sayfası ve imzasını toplamak için ek form alanları içerecek şekilde nasıl özelleştirebileceğimizi göreceğiz.

Varsayılan Satır EklemeUserProfiles

Kullanıcı Hesapları Oluşturma öğreticisinde klasördeki sayfaya CreatingUserAccounts.aspxMembership createUserWizard denetimi ekledik. CreateUserWizard denetiminin kullanıcı hesabı oluşturuldukten sonra tabloya kayıt eklemesini UserProfiles sağlamak için CreateUserWizard denetiminin işlevselliğini güncelleştirmemiz gerekir. Bu değişiklikleri sayfada yapmak yerine sayfaya CreatingUserAccounts.aspx yeni bir CreateUserWizard denetimi EnhancedCreateUserWizard.aspx ekleyelim ve bu öğretici için değişiklikleri orada yapalım.

Visual Studio'da sayfayı EnhancedCreateUserWizard.aspx açın ve Araç Kutusu'ndan bir CreateUserWizard denetimini sayfaya sürükleyin. CreateUserWizard denetiminin ID özelliğini olarak NewUserWizardayarlayın. Kullanıcı Hesapları Oluşturma öğreticisinde ele aldığımız gibi CreateUserWizard'ın varsayılan kullanıcı arabirimi, ziyaretçiden gerekli bilgileri ister. Bu bilgiler sağlandıktan sonra denetim, tek bir kod satırı yazmamıza gerek kalmadan Üyelik çerçevesinde dahili olarak yeni bir kullanıcı hesabı oluşturur.

CreateUserWizard denetimi, iş akışı sırasında bir dizi olayı tetikler. Bir ziyaretçi istek bilgilerini sağlayıp formu gönderdikten sonra CreateUserWizard denetimi başlangıçta olayını tetiklerCreatingUser. Oluşturma işlemi sırasında bir sorun varsa,CreateUserError olay tetiklenir; ancak kullanıcı başarıyla oluşturulursa olayCreatedUser tetiklenir. Kullanıcı Hesapları Oluşturma öğreticisinde, sağlanan kullanıcı adının başında veya sonunda boşluk olmadığından ve kullanıcı adının parolada herhangi bir yerde görünmediğinden emin olmak için olay için CreatingUser bir olay işleyicisi oluşturduk.

Yeni oluşturulan kullanıcının tablosuna UserProfiles satır eklemek için olay için bir olay işleyicisi CreatedUser oluşturmamız gerekir. CreatedUser Olay tetiklendiğinde, üyelik çerçevesinde kullanıcı hesabı zaten oluşturulmuştur ve hesabın UserId değerini almamızı sağlar.

'nin CreatedUser olayı için NewUserWizardbir olay işleyicisi oluşturun ve aşağıdaki kodu ekleyin:

protected void NewUserWizard_CreatedUser(object sender, EventArgs e)
{
     // Get the UserId of the just-added user
     MembershipUser newUser = Membership.GetUser(NewUserWizard.UserName);
     Guid newUserId = (Guid)newUser.ProviderUserKey;
 
     // Insert a new record into UserProfiles
     string connectionString = 
          ConfigurationManager.ConnectionStrings["SecurityTutorialsConnectionString"].ConnectionString;
     string insertSql = "INSERT INTO UserProfiles(UserId, HomeTown, HomepageUrl,
          Signature) VALUES(@UserId, @HomeTown, @HomepageUrl, @Signature)";
 
     using (SqlConnection myConnection = new SqlConnection(connectionString))
     {
          myConnection.Open();
          SqlCommand myCommand = 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();
     }
}

Yeni eklenen kullanıcı hesabının UserId değerini alarak yukarıdaki kod varlıklardır. Bu, yöntemi kullanılarak Membership.GetUser(username) belirli bir kullanıcı hakkındaki bilgileri döndürmek ve ardından userId değerini almak için özelliğini kullanarak ProviderUserKey gerçekleştirilir. Kullanıcı tarafından CreateUserWizard denetimine girilen kullanıcı adı özelliği aracılığıyla UserNamekullanılabilir.

Ardından, bağlantı dizesi'nden Web.config alınır ve INSERT deyimi belirtilir. Gerekli ADO.NET nesneleri örneği oluşturulur ve komut yürütülür. Kod, , @HomepageUrlve parametrelerine @HomeTownbir DBNull örnek atar ve @Signature bu da , HomepageUrlve Signature alanları için HomeTownveritabanı NULL değerleri ekleme etkisine sahiptir.

Tarayıcı üzerinden sayfayı EnhancedCreateUserWizard.aspx ziyaret edin ve yeni bir kullanıcı hesabı oluşturun. Bunu yaptıktan sonra Visual Studio'ya dönün ve ve UserProfiles tablolarının aspnet_Users içeriğini inceleyin (Şekil 12'de yaptığımız gibi). yeni kullanıcı hesabını ve buna karşılık gelen bir satırda aspnet_Users (, HomepageUrlve Signaturedeğerlerini HomeTowniçerenNULL) görmeniz gerekir.UserProfiles

Yeni Bir Kullanıcı Hesabı ve UserProfiles Kaydı Eklendi

Şekil 20: Yeni Bir Kullanıcı Hesabı ve UserProfiles Kayıt Eklendi (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Ziyaretçi yeni hesap bilgilerini sağladıktan ve "Kullanıcı Oluştur" düğmesine tıkladıktan sonra kullanıcı hesabı oluşturulur ve tabloya UserProfiles bir satır eklenir. Ardından CreateUserWizard, başarı iletisini ve Devam düğmesini görüntüleyen öğesini CompleteWizardStepgörüntüler. Devam et düğmesine tıklanması geri göndermeye neden olur, ancak hiçbir işlem yapılmaz ve kullanıcı sayfada EnhancedCreateUserWizard.aspx takılı kalır.

CreateUserWizard denetiminin ContinueDestinationPageUrl özelliği aracılığıyla Devam düğmesine tıklandığında kullanıcıyı göndermek için bir URL belirtebiliriz. ContinueDestinationPageUrl özelliğini "~/Membership/AdditionalUserInfo.aspx" olarak ayarlayın. Bu, yeni kullanıcıyı ayarları görüntüleyip güncelleştirebileceği konumuna AdditionalUserInfo.aspxgötürür.

CreateUserWizard Arabirimini Yeni Kullanıcının Giriş Şehri, Giriş Sayfası ve İmzası İstenecek Şekilde Özelleştirme

CreateUserWizard denetiminin varsayılan arabirimi yalnızca kullanıcı adı, parola ve e-posta gibi temel kullanıcı hesabı bilgilerinin toplanması gereken basit hesap oluşturma senaryoları için yeterlidir. Peki ya ziyaretçiden hesabını oluştururken giriş şehrine, giriş sayfasına ve imzasına girmesini istersek ne olur? Kayıt sırasında ek bilgi toplamak için CreateUserWizard denetiminin arabirimini özelleştirmek mümkündür ve bu bilgiler, temel alınan veritabanına ek kayıtlar eklemek için olay işleyicisinde CreatedUser kullanılabilir.

CreateUserWizard denetimi, sayfa geliştiricisinin sıralı WizardStepsbir dizi tanımlamasını sağlayan bir denetim olan ASP.NET Sihirbazı denetimini genişletir. Sihirbaz denetimi etkin adımı işler ve ziyaretçinin bu adımlarda ilerlemesini sağlayan bir gezinti arabirimi sağlar. Sihirbaz denetimi, uzun bir görevi birkaç kısa adıma bölmek için idealdir. Sihirbaz denetimi hakkında daha fazla bilgi için bkz. ASP.NET 2.0 Sihirbaz Denetimi ile Adım Adım Kullanıcı Arabirimi Oluşturma.

CreateUserWizard denetiminin varsayılan işaretlemesi iki WizardStepstanımlar: CreateUserWizardStep ve 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>

İlk WizardStep, , CreateUserWizardStepkullanıcı adını, parolayı, e-postayı vb. isteyen arabirimi işler. Ziyaretçi bu bilgileri verdikten ve "Kullanıcı Oluştur"a tıkladıktan sonra, başarı iletisini ve Devam düğmesini gösteren öğesine gösterilir CompleteWizardStep.

CreateUserWizard denetiminin arabirimini ek form alanları içerecek şekilde özelleştirmek için şunları yapabiliriz:

  • Bir veya daha fazla yeniWizardStep oluşturmas ek kullanıcı arabirimi öğelerini içerecek şekilde. CreateUserWizard'a yeni WizardStep bir eklemek için Akıllı Etiketinden "Ekle/Kaldır WizardSteps" bağlantısına tıklayarak Koleksiyon Düzenleyicisi'ni WizardStep başlatın. Buradan sihirbazdaki adımları ekleyebilir, kaldırabilir veya yeniden sıralayabilirsiniz. Bu öğretici için bu yaklaşımı kullanacağız.

  • CreateUserWizardStepdüzenlenebilirWizardStep bir. Bu, işaretinin CreateUserWizardStep 'lerle eşleşen bir WizardStep kullanıcı arabirimi tanımladığı eşdeğeri CreateUserWizardStepile değiştirir. öğesini bire WizardStep dönüştürerek CreateUserWizardStep denetimleri yeniden konumlandırabilir veya bu adıma başka kullanıcı arabirimi öğeleri ekleyebiliriz. veya CompleteWizardStep öğesini CreateUserWizardStep düzenlenebilir WizardStepbir öğeye dönüştürmek için, denetimin Akıllı Etiketi'nden "Kullanıcı Adımı Oluşturmayı Özelleştir" veya "Tamamlanan Adımı Özelleştir" bağlantısına tıklayın.

  • Yukarıdaki iki seçeneğin bir bileşimini kullanın.

Aklınızda bulundurmanız gereken önemli bir şey, CreateUserWizard denetiminin içinden "Kullanıcı Oluştur" düğmesine tıklandığında kullanıcı hesabı oluşturma işlemini yürütmesidir CreateUserWizardStep. veya sonrasında başka WizardStep eklerin CreateUserWizardStep olup olmaması önemli değildir.

Ek kullanıcı girişi toplamak için CreateUserWizard denetimine özel WizardStep eklerken, özel WizardStep öğesinden önce veya sonra CreateUserWizardStepyerleştirilebilir. Özelden önce CreateUserWizardStep geliyorsa, olay işleyicisi için CreatedUser özelden WizardStep toplanan ek kullanıcı girişi kullanılabilir. Bununla birlikte, özel WizardStep daha sonra CreateUserWizardStepWizardStep özel görüntülendiğinde yeni kullanıcı hesabı zaten oluşturulmuş ve CreatedUser olay zaten tetiklenmişse.

Şekil 21'de, eklenen WizardStep iş akışı öğesinden CreateUserWizardStepönce geldiğinde iş akışı gösterilir. Olay çalıştırılana kadar ek kullanıcı bilgileri toplandığından CreatedUser , tek yapmamız gereken olay işleyicisini CreatedUser bu girişleri alacak şekilde güncelleştirmek ve deyiminin INSERT parametre değerleri (yerine DBNull.Value) için bunları kullanmaktır.

CreateUserWizard İş Akışı CreateUserWizardStep'in Önüne Ek Bir WizardStep Eklendiğinde

Şekil 21: CreateUserWizard İş Akışı Önüne CreateUserWizardStep Ek WizardStep Bir Ek Geldiğinde (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Ancak, özel WizardStepöğe sonrasındaCreateUserWizardStepyerleştirilirse kullanıcı hesabı oluşturma işlemi, kullanıcının kendi giriş kentine, giriş sayfasına veya imzasına girme şansına sahip olmadan önce gerçekleşir. Böyle bir durumda, Şekil 22'de gösterildiği gibi kullanıcı hesabı oluşturulduktan sonra bu ek bilgilerin veritabanına eklenmesi gerekir.

CreateUserWizardStep Sonrasında Ek Bir WizardStep Geldiğinde CreateUserWizard İş Akışı

Şekil 22: CreateUserWizard İş Akışı WizardStep Ek Sonra Geldiğinde CreateUserWizardStep (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Şekil 22'de gösterilen iş akışı, 2. Adım tamamlanana kadar tabloya UserProfiles kayıt eklenmesini bekler. Ancak, ziyaretçi 1. adımdan sonra tarayıcısını kapatırsa, kullanıcı hesabının oluşturulduğu bir duruma ulaşırız, ancak öğesine UserProfileskayıt eklenmez. Geçici çözümlerden biri, olay işleyicisine (1. adımdan sonra tetiklenen) veya varsayılan değerlerin eklendiği UserProfiles bir kaydın NULLCreatedUser olması ve 2. adım tamamlandıktan sonra bu kaydın güncelleştirilmesidir. Bu, kullanıcı kayıt işleminin ortasından çıksa bile kullanıcı hesabı için bir UserProfiles kayıt eklenmesini sağlar.

Bu öğretici için sürümünden sonra CreateUserWizardStep ama CompleteWizardStepöncesinde gerçekleşen yeni WizardStep bir oluşturalım. İlk olarak WizardStep'i hazırlayıp yapılandıralım ve ardından koda bakalım.

CreateUserWizard denetiminin Akıllı Etiketi'nden Koleksiyon Düzenleyicisi iletişim kutusunu açan WizardStep "Ekle/KaldırWizardStep" öğesini seçin. yeni WizardStepbir ekleyin, öğesini olarakUserSettings, öğesini Title "Ayarlarınız" olarak ve öğesini StepType olarak StepayarlayınID. Ardından, Şekil 23'te gösterildiği gibi ("Yeni Hesabınız için Kaydolun") ve "Tamamlandı" işaretinden önce CompleteWizardStep gelecek CreateUserWizardStep şekilde konumlandırın.

CreateUserWizard Denetimine Yeni Sihirbaz Ekleme

Şekil 23: CreateUserWizard Denetimine Yeni WizardStep Ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Koleksiyon Düzenleyicisi iletişim kutusunu kapatmak için Tamam'a WizardStep tıklayın. Yeni WizardStep , CreateUserWizard denetiminin güncelleştirilmiş bildirim temelli işaretlemesi tarafından kanıtlanmıştır:

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

Yeni <asp:WizardStep> öğeyi not edin. Yeni kullanıcının giriş şehrini, giriş sayfasını ve imzasını toplamak için kullanıcı arabirimini buraya eklemeliyiz. Bu içeriği bildirim temelli söz dizimine veya Tasarım Aracı girebilirsiniz. Tasarım Aracı kullanmak için, Tasarım Aracı adımı görmek için Akıllı Etiket'teki açılan listeden "Ayarlarınız" adımını seçin.

Not

Akıllı Etiketin açılan listesinden bir adım seçildiğinde CreateUserWizard denetiminin ActiveStepIndex özelliği güncelleştirilir ve bu özellik başlangıç adımının dizinini belirtir. Bu nedenle, Tasarım Aracı "Ayarlarınız" adımını düzenlemek için bu açılan listeyi kullanırsanız, kullanıcılar sayfayı ilk ziyaret ettiğinde bu adımın gösterilmesi için bu adımı "Yeni Hesabınıza Kaydolun" olarak ayarladığınızdan EnhancedCreateUserWizard.aspx emin olun.

"Ayarlarınız" adımında , HomepageUrlve Signatureadlı HomeTownüç TextBox denetimi içeren bir kullanıcı arabirimi oluşturun. Bu arabirimi oluşturduktan sonra CreateUserWizard'ın bildirim temelli işaretlemesi aşağıdakine benzer görünmelidir:

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

Bu sayfayı bir tarayıcı üzerinden ziyaret edin ve giriş şehri, giriş sayfası ve imza değerlerini belirterek yeni bir kullanıcı hesabı oluşturun. Kullanıcı hesabı tamamlandıktan CreateUserWizardStep sonra Üyelik çerçevesinde oluşturulur ve olay işleyicisi çalıştırılır ve CreatedUser bu da öğesine yeni bir satır UserProfilesekler, ancak , HomepageUrlve Signatureiçin HomeTownbir veritabanı NULL değeri ekler. Giriş şehri, giriş sayfası ve imza için girilen değerler hiçbir zaman kullanılmaz. Net sonuç, , HomepageUrlve Signature alanları henüz belirtilmemiş bir kaydı olan HomeTownyeni bir UserProfiles kullanıcı hesabıdır.

Kullanıcı tarafından girilen giriş şehri, honepage ve imza değerlerini alan ve uygun UserProfiles kaydı güncelleştiren "Ayarlarınız" adımından sonra kod yürütmemiz gerekir. Kullanıcı bir Sihirbaz denetimindeki adımlar arasında her geçişinde, Sihirbazın ActiveStepChanged olayı tetikler. Bu olay için bir olay işleyicisi oluşturabilir ve "Ayarlarınız" adımı tamamlandığında tabloyu güncelleştirebiliriz UserProfiles .

CreateUserWizard'ın ActiveStepChanged olayı için bir olay işleyicisi ekleyin ve aşağıdaki kodu ekleyin:

protected void NewUserWizard_ActiveStepChanged(object sender, EventArgs e)
{
     // Have we JUST reached the Complete step?
     if (NewUserWizard.ActiveStep.Title == "Complete")
     {
          WizardStep UserSettings = NewUserWizard.FindControl("UserSettings") as
          WizardStep;
 
          // Programmatically reference the TextBox controls
          TextBox HomeTown = UserSettings.FindControl("HomeTown") as TextBox;
          TextBox HomepageUrl = UserSettings.FindControl("HomepageUrl") as TextBox;
          TextBox Signature = UserSettings.FindControl("Signature") as TextBox;
 
          // Update the UserProfiles record for this user
          // Get the UserId of the just-added user
          MembershipUser newUser = Membership.GetUser(NewUserWizard.UserName);
          Guid newUserId = (Guid)newUser.ProviderUserKey;
 
          // Insert a new record into UserProfiles
          string connectionString = 
               ConfigurationManager.ConnectionStrings["SecurityTutorialsConnectionString"].ConnectionString;
          string updateSql = "UPDATE UserProfiles SET HomeTown = @HomeTown, HomepageUrl
               = @HomepageUrl, Signature = @Signature WHERE UserId = @UserId";
 
          using (SqlConnection myConnection = new SqlConnection(connectionString))
          {
               myConnection.Open();
               SqlCommand myCommand = 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();
          }
     }
}

Yukarıdaki kod, "Tamamlandı" adımına ulaşıp ulaşmadığımız belirlenerek başlar. "Tamamla" adımı "Ayarlarınız" adımından hemen sonra gerçekleştiğinden, ziyaretçi "Tamamlandı" adımına ulaştığında bu, "Ayarlarınız" adımını tamamlamış olduğu anlamına gelir.

Böyle bir durumda içindeki TextBox denetimlerine UserSettings WizardStepprogram aracılığıyla başvurmamız gerekir. Bu, önce programlama yoluyla öğesine başvurmak UserSettings WizardStepiçin yönteminin FindControl kullanılması ve ardından içindeki TextBox'lara başvurmak için yeniden kullanılmasıyla WizardStepgerçekleştirilir. TextBox'lara başvurulduktan sonra deyimini UPDATE yürütmeye hazırız. deyimi, UPDATE olay işleyicisindeki CreatedUser deyimle aynı sayıda parametreye INSERT sahiptir, ancak burada kullanıcı tarafından sağlanan giriş şehri, giriş sayfası ve imza değerlerini kullanırız.

Bu olay işleyicisi hazır durumdaysa, sayfayı EnhancedCreateUserWizard.aspx bir tarayıcı üzerinden ziyaret edin ve giriş şehri, giriş sayfası ve imza değerlerini belirten yeni bir kullanıcı hesabı oluşturun. Yeni hesabı oluşturduktan sonra, yeni girilen giriş şehri, giriş sayfası ve imza bilgilerinin görüntülendiği sayfaya yönlendirilmelidir AdditionalUserInfo.aspx .

Not

Web sitemizde şu anda bir ziyaretçinin yeni bir hesap oluşturabileceği iki sayfa vardır: CreatingUserAccounts.aspx ve EnhancedCreateUserWizard.aspx. Web sitesinin site haritası ve oturum açma sayfası sayfaya CreatingUserAccounts.aspx işaret eder, ancak CreatingUserAccounts.aspx sayfa kullanıcıdan giriş şehri, giriş sayfası ve imza bilgilerini sormaz ve öğesine UserProfileskarşılık gelen bir satır eklemez. Bu nedenle, sayfayı CreatingUserAccounts.aspx bu işlevi sunacak şekilde güncelleştirin veya yerine başvuruda EnhancedCreateUserWizard.aspx bulunacak site haritasını ve oturum açma sayfasını güncelleştirin CreatingUserAccounts.aspx. İkinci seçeneği belirlerseniz, anonim kullanıcıların sayfaya erişmesine izin vermek için klasörün Web.config dosyasını güncelleştirdiğinizden MembershipEnhancedCreateUserWizard.aspx emin olun.

Özet

Bu öğreticide Üyelik çerçevesi içindeki kullanıcı hesaplarıyla ilgili verileri modelleme tekniklerini inceledik. Özellikle kullanıcı hesaplarıyla bire çok ilişki paylaşan modelleme varlıklarının yanı sıra bire bir ilişkiyi paylaşan verileri inceledik. Ayrıca, sqldatasource denetimini kullanan bazı örnekler ve ADO.NET kodu kullanan diğer örneklerle bu ilgili bilgilerin nasıl görüntülenebileceğini, eklenebileceğini ve güncelleştirilebileceğini gördük.

Bu öğretici, kullanıcı hesaplarına bakışımızı tamamlar. Sonraki öğreticiden itibaren dikkatimizi rollere çevireceğiz. Sonraki birkaç öğreticide Roller çerçevesine göz atacak, yeni roller oluşturmayı, kullanıcılara rol atamayı, bir kullanıcının hangi rollere ait olduğunu belirlemeyi ve rol tabanlı yetkilendirmeyi nasıl uygulayacağımızı göreceğiz.

Mutlu Programlama!

Daha Fazla Bilgi

Bu öğreticide ele alınan konular hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:

Yazar hakkında

Birden çok ASP/ASP.NET kitabının yazarı ve 4GuysFromRolla.com kurucusu Scott Mitchell, 1998'den beri Microsoft Web teknolojileriyle çalışmaktadır. Scott bağımsız bir danışman, eğitmen ve yazar olarak çalışmaktadır. Son kitabı Sams Teach Yourself ASP.NET 24 Saat içinde 2.0. Scott'a adresinden mitchell@4guysfromrolla.com veya adresinden blogu http://ScottOnWriting.NETaracılığıyla ulaşılabilir.

Özel Teşekkürler...

Bu öğretici serisi birçok yararlı gözden geçiren tarafından gözden geçirildi. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, bana bir satır mitchell@4GuysFromRolla.combırakın.