Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
tarafından Scott Mitchell
Kullanıcıların verileri düzenlemesine olanak tanıyan bir web uygulamasında, farklı kullanıcı hesaplarının farklı veri düzenleme ayrıcalıkları olabilir. Bu öğreticide, ziyaret eden kullanıcıya göre veri değiştirme özelliklerini dinamik olarak ayarlamayı inceleyeceğiz.
Giriş
Bir dizi web uygulaması kullanıcı hesaplarını destekler ve oturum açmış kullanıcıya göre farklı seçenekler, raporlar ve işlevler sağlar. Örneğin, öğreticilerimizle, tedarikçi şirketlerinden kullanıcıların sitede oturum açmasına ve ürünleriyle ilgili genel bilgileri (birim başına ad ve miktarları) ve şirket adları, adresleri, ilgili kişinin bilgileri gibi sağlayıcı bilgilerini güncelleştirmelerine izin vermek isteyebiliriz. Ayrıca, stokta birimler, yeniden sipariş düzeyi vb. gibi ürün bilgilerine oturum açabilmeleri ve bu bilgileri güncelleştirebilmeleri için şirketimizdeki kişiler için bazı kullanıcı hesapları eklemek isteyebiliriz. Web uygulamamız anonim kullanıcıların (oturum açmamış kişiler) ziyaret etmelerine de izin verebilir, ancak bunları yalnızca verileri görüntülemeyle sınırlandırabilir. Böyle bir kullanıcı hesabı sistemi mevcutken, ASP.NET sayfalarımızdaki veri Web denetimlerinin şu anda oturum açmış olan kullanıcıya uygun ekleme, düzenleme ve silme özelliklerini sunmasını isteriz.
Bu öğreticide, ziyaret eden kullanıcıya göre veri değiştirme özelliklerini dinamik olarak ayarlamayı inceleyeceğiz. Özellikle sağlayıcı bilgilerini düzenlenebilir bir DetailsView'da ve sağlayıcı tarafından sağlanan ürünleri listeleyen bir GridView'da görüntüleyen bir sayfa oluşturacağız. Sayfayı ziyaret eden kullanıcı şirketimizden geliyorsa, herhangi bir tedarikçinin bilgilerini görüntüleyebilir; adresini düzenleyin; ve sağlayıcı tarafından sağlanan herhangi bir ürünün bilgilerini düzenleyin. Ancak kullanıcı belirli bir şirketten geliyorsa yalnızca kendi adres bilgilerini görüntüleyebilir ve düzenleyebilir ve yalnızca kullanımdan kaldırılmış olarak işaretlenmemiş ürünlerini düzenleyebilir.
Şekil 1: Şirketimizden Bir Kullanıcı Herhangi Bir Tedarikçinin Bilgilerini Düzenleyebilir (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Şekil 2: Belirli bir Sağlayıcıdan Bir Kullanıcı Bilgilerini Yalnızca Görüntüleyebilir ve Düzenleyebilir (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Haydi başlayalım!
Uyarı
ASP.NET 2.0 s üyelik sistemi, kullanıcı hesaplarını oluşturmak, yönetmek ve doğrulamak için standartlaştırılmış, genişletilebilir bir platform sağlar. Üyelik sisteminin incelenmesi bu öğreticilerin kapsamının dışında olduğundan, bu öğretici anonim ziyaretçilerin belirli bir tedarikçiden mi yoksa şirketimizden mi olduklarını seçmelerine izin vererek "sahte" üyelik sağlar. Üyelik hakkında daha fazla bilgi için ASP.NET 2.0'in Üyelik, Roller ve Profili makale serisine bakın.
1. Adım: Kullanıcının Erişim Haklarını Belirtmesine İzin Verme
Gerçek dünyadaki bir web uygulamasında, bir kullanıcının hesap bilgileri şirketimizde mi yoksa belirli bir tedarikçi için mi çalıştığını içerir ve kullanıcı sitede oturum açtıktan sonra bu bilgilere ASP.NET sayfalarımızdan program aracılığıyla erişilebilir. Bu bilgiler ASP.NET 2.0 sn rol sistemi aracılığıyla, profil sistemi aracılığıyla veya bazı özel yollarla kullanıcı düzeyinde hesap bilgileri olarak yakalanabilir.
Bu öğreticinin amacı, oturum açmış kullanıcıya göre veri değişikliği özelliklerini ayarlamayı göstermek olduğundan ve ASP.NET 2.0'ın üyeliğini, rollerini ve profil sistemlerini göstermeyi amaçlamadığından, sayfayı ziyaret eden kullanıcının özelliklerini belirlemek için basit bir mekanizma kullanacağız: Kullanıcının sağlayıcı bilgilerinden herhangi birini görüntülemesi ve düzenleyebilmesi veya düzenleyebilmesi için belirtebileceği bir DropDownList alternatif olarak, görüntüleyebileceği ve düzenleyebileceği belirli sağlayıcı bilgilerini de seçebilirsiniz. Kullanıcı tüm tedarikçi bilgilerini görüntüleyebildiğini ve düzenleyebileceğini belirtirse (varsayılan), tüm tedarikçilere sayfa ekleyebilir, sağlayıcının adres bilgilerini düzenleyebilir ve seçilen sağlayıcı tarafından sağlanan herhangi bir ürün için birim başına ad ve miktarı düzenleyebilir. Ancak kullanıcı yalnızca belirli bir tedarikçiyi görüntüleyebileceğini ve düzenleyebileceğini belirtiyorsa, yalnızca bu sağlayıcının ayrıntılarını ve ürünlerini görüntüleyebilir ve sonlandırılmayan ürünler için birim başına yalnızca ad ve miktar bilgilerini güncelleştirebilir.
Bu öğreticideki ilk adımımız, bu DropDownList'i oluşturmak ve sistemdeki sağlayıcılarla doldurmaktır.
UserLevelAccess.aspx
sayfasını EditInsertDelete
klasöründe açın, ID
özelliği Suppliers
olarak ayarlanmış bir DropDownList ekleyin ve bu DropDownList'i AllSuppliersDataSource
adlı yeni bir ObjectDataSource'a bağlayın.
Şekil 3: Adlı AllSuppliersDataSource
Yeni Bir ObjectDataSource Oluşturma (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Bu DropDownList öğesinin tüm tedarikçileri içermesini istediğimiz için ObjectDataSource'ı sınıf SuppliersBLL
yöntemini çağıracak GetSuppliers()
şekilde yapılandırın. Ayrıca, bu ObjectDataSource, 2. Adımda ekleyeceğimiz DetailsView'da da kullanılacağından, Update()
yönteminin SuppliersBLL
sınıfının UpdateSupplierAddress
yöntemiyle eşleştirildiğinden emin olun.
ObjectDataSource sihirbazını tamamladıktan sonra Suppliers
adımlarını bitirerek DropDownList'i, her bir CompanyName
için SupplierID
veri alanını gösterecek ve ListItem
veri alanını değer olarak kullanacak şekilde yapılandırın.
Şekil 4: DropDownList'i Suppliers
ve CompanyName
Veri Alanlarını Kullanacak SupplierID
Şekilde Yapılandırma (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Bu noktada DropDownList veritabanındaki tedarikçilerin şirket adlarını listeler. Ancak DropDownList'e "TÜM Tedarikçileri Göster/Düzenle" seçeneğini de eklememiz gerekir. Bunu gerçekleştirmek için Suppliers
DropDownList'in AppendDataBoundItems
özelliğini true
olarak ayarlayın ve ardından özelliği "TÜM Tedarikçileri Göster/Düzenle" ve değeri ListItem
olan bir Text
ekleyin. Bu, doğrudan bildirim temelli işaretleme yoluyla veya Tasarımcı aracılığıyla Özellikler penceresine gidip DropDownList Items
özelliğindeki üç noktaya tıklayarak eklenebilir.
Uyarı
Databound DropDownList'e Tümünü Seç öğesi ekleme hakkında daha ayrıntılı bir tartışma için DropDownList ile Ana/Ayrıntı Filtreleme öğreticisine geri bakın.
AppendDataBoundItems
Özellik ayarlanıp ListItem
eklendikten sonra DropDownList bildirim temelli işaretleme aşağıdaki gibi görünmelidir:
<asp:DropDownList ID="Suppliers" runat="server" AppendDataBoundItems="True"
DataSourceID="AllSuppliersDataSource" DataTextField="CompanyName"
DataValueField="SupplierID">
<asp:ListItem Value="-1">Show/Edit ALL Suppliers</asp:ListItem>
</asp:DropDownList>
Şekil 5'de, tarayıcı üzerinden görüntülendiğinde geçerli ilerleme durumumuzun ekran görüntüsü gösterilmektedir.
Şekil 5: Suppliers
DropDownList, Tüm Sağlayıcılar için Tümünü Göster'in yanı sıra her bir sağlayıcı için bir seçenek içerir (ListItem
)
Kullanıcı seçimini değiştirdikten hemen sonra kullanıcı arabirimini güncelleştirmek istediğimizden DropDownList özelliğini Suppliers
olarak AutoPostBack
ayarlayıntrue
. 2. Adım'da, DropDownList seçimine göre tedarikçilerin bilgilerini gösterecek bir DetailsView denetimi oluşturacağız. Ardından, 3. Adım'da bu DropDownList SelectedIndexChanged
olayı için bir olay işleyicisi oluşturacağız ve burada seçilen sağlayıcıyı temel alan DetailsView'a uygun sağlayıcı bilgilerini bağlayan kod ekleyeceğiz.
2. Adım: DetailsView Denetimi Ekleme
Sağlayıcı bilgilerini göstermek için DetailsView kullanalım. Tüm tedarikçileri görüntüleyebilen ve düzenleyebilen kullanıcı için DetailsView sayfalandırmayı destekleyerek kullanıcının tedarikçi bilgilerini tek tek kaydetmesine olanak tanır. Ancak kullanıcı özel bir sağlayıcı için çalışıyorsa, DetailsView yalnızca o sağlayıcının bilgilerini gösterir ve sayfalama arabirimi içermez. Her iki durumda da DetailsView'un kullanıcının tedarikçinin adresini, şehrini ve ülke alanlarını düzenlemesine izin verebilmesi gerekir.
DropDownList altındaki Suppliers
sayfaya bir DetailsView ekleyin, özelliğini ID
olarak SupplierDetails
ayarlayın ve önceki adımda oluşturulan ObjectDataSource'a AllSuppliersDataSource
bağlayın. Ardından DetailsView akıllı etiketinden Sayfalamayı Etkinleştir ve Düzenlemeyi Etkinleştir onay kutularını işaretleyin.
Uyarı
DetailsView akıllı etiketinde Düzenlemeyi Etkinleştir seçeneğini görmüyorsanız, bunun nedeni ObjectDataSource Update()
yöntemini sınıfın SuppliersBLL
yöntemiyle UpdateSupplierAddress
eşlememiş olmanızdır. Geri dönüp bu yapılandırma değişikliğini yapmak için biraz zaman ayırın; bundan sonra Düzenlemeyi Etkinleştir seçeneği DetailsView akıllı etiketinde görünür.
Sınıfın SuppliersBLL
UpdateSupplierAddress
yöntemi yalnızca dört parametre - supplierID
, address
, city
, ve country
- kabul ettiğinden, DetailsView'in BoundFields'ini CompanyName
ve Phone
BoundFields'ini salt okunur olacak şekilde değiştirin. Ayrıca, BoundField'i SupplierID
tamamen kaldırın. Son olarak, AllSuppliersDataSource
ObjectDataSource'un OldValuesParameterFormatString
özelliği şu anda original_{0}
olarak ayarlanmıştır. Bu özellik ayarını bildirim temelli söz diziminden tamamen kaldırmak veya varsayılan değer {0}
olarak ayarlamak için biraz bekleyin.
DetailsView SupplierDetails
ve ObjectDataSource'ı yapılandırdıktan sonra aşağıdaki bildirim temelli işaretlemeye sahip olacağız:
<asp:ObjectDataSource ID="AllSuppliersDataSource" runat="server"
SelectMethod="GetSuppliers" TypeName="SuppliersBLL"
UpdateMethod="UpdateSupplierAddress">
<UpdateParameters>
<asp:Parameter Name="supplierID" Type="Int32" />
<asp:Parameter Name="address" Type="String" />
<asp:Parameter Name="city" Type="String" />
<asp:Parameter Name="country" Type="String" />
</UpdateParameters>
</asp:ObjectDataSource>
<asp:DetailsView ID="SupplierDetails" runat="server" AllowPaging="True"
AutoGenerateRows="False" DataKeyNames="SupplierID"
DataSourceID="AllSuppliersDataSource">
<Fields>
<asp:BoundField DataField="CompanyName" HeaderText="Company"
ReadOnly="True" SortExpression="CompanyName" />
<asp:BoundField DataField="Address" HeaderText="Address"
SortExpression="Address" />
<asp:BoundField DataField="City" HeaderText="City"
SortExpression="City" />
<asp:BoundField DataField="Country" HeaderText="Country"
SortExpression="Country" />
<asp:BoundField DataField="Phone" HeaderText="Phone" ReadOnly="True"
SortExpression="Phone" />
<asp:CommandField ShowEditButton="True" />
</Fields>
</asp:DetailsView>
Bu noktada, DetailsView sayfalandırılabilir ve DropDownList'te yapılan seçimden bağımsız olarak seçilen sağlayıcının Suppliers
adres bilgileri güncelleştirilebilir (bkz. Şekil 6).
Şekil 6: Tüm Sağlayıcı Bilgileri Görüntülenebilir ve Adresi Güncelleştirilebilir (Tam boyutlu görüntüyü görüntülemek için tıklayın)
3. Adım: Yalnızca Seçili Sağlayıcı Bilgilerini Görüntüleme
Sayfamız şu anda DropDownList'ten belirli bir sağlayıcının seçilip seçilmediğine bakılmaksızın tüm tedarikçilerin Suppliers
bilgilerini görüntüler. Seçilen sağlayıcının yalnızca sağlayıcı bilgilerini görüntülemek için sayfamıza belirli bir sağlayıcı hakkındaki bilgileri alan başka bir ObjectDataSource eklememiz gerekir.
Sayfaya yeni bir ObjectDataSource ekleyin ve adını SingleSupplierDataSource
olarak belirleyin. Akıllı etiketinden Veri Kaynağını Yapılandır bağlantısına tıklayın ve SuppliersBLL
sınıfının GetSupplierBySupplierID(supplierID)
yöntemini kullanmasını sağlayın. ObjectDataSource'ta olduğu gibi, AllSuppliersDataSource
yönteminin SingleSupplierDataSource
sınıfındaki Update()
yöntemine eşlenmiş olmasını sağlayın.
Şekil 7: ObjectDataSource'un SingleSupplierDataSource
Yöntemini Kullanacak Şekilde Yapılandırılması GetSupplierBySupplierID(supplierID)
(Tam boyutlu görüntüyü görüntülemek için tıklayın)
Ardından, yöntemin GetSupplierBySupplierID(supplierID)
giriş parametresi için supplierID
parametre kaynağını belirtmemiz istenir. DropDownList'ten seçilen sağlayıcının bilgilerini göstermek istediğimizden, parametre kaynağı olarak DropDownList s Suppliers
özelliğini kullanınSelectedValue
.
Şekil 8: DropDownList değerini Parametre Kaynağı olarak Suppliers
kullanma supplierID
(Tam boyutlu görüntüyü görüntülemek için tıklayın)
Bu ikinci ObjectDataSource eklense bile, DetailsView denetimi şu anda her zaman AllSuppliersDataSource
ObjectDataSource'u kullanacak şekilde yapılandırılmıştır. DetailsView tarafından kullanılan veri kaynağını, seçilen Suppliers
DropDownList öğesine bağlı olarak ayarlamak için mantık eklememiz gerekir. Bunu başarmak için Sağlayıcılar DropDownList için bir SelectedIndexChanged
olay işleyicisi oluşturun. Bu, tasarımcıda DropDownList'e çift tıklanarak en kolay şekilde oluşturulabilir. Bu olay işleyicisinin kullanılacak veri kaynağını belirlemesi ve verileri DetailsView'a yeniden bağlaması gerekir. Bu, aşağıdaki kodla gerçekleştirilir:
Protected Sub Suppliers_SelectedIndexChanged _
(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles Suppliers.SelectedIndexChanged
If Suppliers.SelectedValue = "-1" Then
' The "Show/Edit ALL" option has been selected
SupplierDetails.DataSourceID = "AllSuppliersDataSource"
' Reset the page index to show the first record
SupplierDetails.PageIndex = 0
Else
' The user picked a particular supplier
SupplierDetails.DataSourceID = "SingleSupplierDataSource"
End If
' Ensure that the DetailsView and GridView are in read-only mode
SupplierDetails.ChangeMode(DetailsViewMode.ReadOnly)
' Need to "refresh" the DetailsView
SupplierDetails.DataBind()
End Sub
Olay işleyicisi, "TÜM Tedarikçileri Göster/Düzenle" seçeneğinin belirlenip belirlenmediğini belirleyerek başlar. Eğer öyleyse, SupplierDetails
DetailsView'i DataSourceID
AllSuppliersDataSource
olarak ayarlar ve PageIndex
özelliğini 0 olarak ayarlayarak kullanıcıyı sağlayıcılar kümesindeki ilk kayda döndürür. Bununla birlikte, kullanıcı DropDownList'ten belirli bir sağlayıcıyı seçtiyse DetailsView'lar DataSourceID
öğesine SingleSuppliersDataSource
atanır. Hangi veri kaynağının kullanıldığına bakılmaksızın, SuppliersDetails
mod salt okunur moda geri döner ve denetim s SuppliersDetails
yöntemine yapılan bir çağrıyla veriler DetailsView'a DataBind()
geri döner.
Bu olay işleyicisi mevcut olduğunda DetailsView denetimi, "TÜM Tedarikçileri Göster/Düzenle" seçeneği belirlenmediği sürece seçili sağlayıcıyı gösterir ve bu durumda tüm sağlayıcılar disk belleği arabirimi üzerinden görüntülenebilir. Şekil 9'da "TÜM Tedarikçileri Göster/Düzenle" seçeneğinin seçili olduğu sayfa gösterilmektedir; sayfalama arayüzünün mevcut olduğunu ve kullanıcının herhangi bir tedarikçiyi ziyaret etmesine ve güncellemesine olanak tanıdığını unutmayın. Şekil 10'da Ma Maison sağlayıcısının seçili olduğu sayfa gösterilmektedir. Bu durumda yalnızca Ma Maison bilgileri görüntülenebilir ve düzenlenebilir.
Şekil 9: Tüm Sağlayıcı Bilgileri Görüntülenebilir ve Düzenlenebilir (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Şekil 10: Yalnızca Seçili SağlayıcıNın Bilgileri Görüntülenebilir ve Düzenlenebilir (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Uyarı
Bu öğreticide, DropDownList ve DetailsView denetimlerinin EnableViewState
her ikisi de true
(varsayılan) olarak ayarlanmalıdır çünkü DropDownList'lerdeki SelectedIndex
ve DetailsView'deki DataSourceID
özellik değişiklikleri postback'ler arasında hatırlanmalıdır.
4. Adım: Tedarikçi Ürünlerini Düzenlenebilir Bir GridView'da Listeleme
DetailsView tamamlandıktan sonraki adımımız, seçilen sağlayıcı tarafından sağlanan ürünleri listeleyen düzenlenebilir bir GridView eklemektir. Bu GridView yalnızca ProductName
ve QuantityPerUnit
alanlarında düzenlemelere izin vermelidir. Ayrıca, sayfayı ziyaret eden kullanıcı belirli bir sağlayıcıdan geliyorsa, yalnızca sonlandırılmayan ürünlerde güncelleştirmelere izin vermelidir. Bunu başarmak için önce yalnızca ProductsBLL
, UpdateProducts
ve ProductID
alanlarını giriş olarak alan ProductName
sınıfının QuantityPerUnit
yöntemine aşırı yükleme eklememiz gerekir. Bu süreci önceden çok sayıda öğreticide adım adım geçtik, dolayısıyla sadece şu kodu ProductsBLL
öğesine eklememiz gerekecek.
<System.ComponentModel.DataObjectMethodAttribute _
(System.ComponentModel.DataObjectMethodType.Update, False)> _
Public Function UpdateProduct(ByVal productName As String, _
ByVal quantityPerUnit As String, ByVal productID As Integer) As Boolean
Dim products As Northwind.ProductsDataTable = Adapter.GetProductByProductID(productID)
If products.Count = 0 Then
' no matching record found, return false
Return False
End If
Dim product As Northwind.ProductsRow = products(0)
product.ProductName = productName
If quantityPerUnit Is Nothing Then
product.SetQuantityPerUnitNull()
Else
product.QuantityPerUnit = quantityPerUnit
End If
' Update the product record
Dim rowsAffected As Integer = Adapter.Update(product)
' Return true if precisely one row was updated, otherwise false
Return rowsAffected = 1
End Function
Bu aşırı yükleme oluşturulduktan sonra GridView denetimini ve ilişkili ObjectDataSource'unu eklemeye hazırız. Sayfaya yeni bir GridView ekleyin, ID
özelliğini ProductsBySupplier
olarak ayarlayın ve yeni bir ProductsBySupplierDataSource
isimli ObjectDataSource kullanacak şekilde yapılandırın. Bu GridView'un bu ürünleri seçilen sağlayıcıya göre listelemesini istediğimizden, sınıfın ProductsBLL
GetProductsBySupplierID(supplierID)
yöntemini kullanın. Ayrıca Update()
yöntemini, yeni oluşturduğumuz UpdateProduct
aşırı yüklemeyle eşleyin.
Şekil 11: ObjectDataSource'un Yeni Oluşturulan Aşırı Yüklemeyi Kullanacak UpdateProduct
Şekilde Yapılandırılması (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Yöntemin GetProductsBySupplierID(supplierID)
giriş parametresi için supplierID
parametre kaynağını seçmeniz istenir. DetailsView'da seçilen sağlayıcının ürünlerini göstermek istediğimiz için parametre kaynağı olarak DetailsView denetimi s SuppliersDetails
özelliğini kullanınSelectedValue
.
Şekil 12: DetailsView s SuppliersDetails
Özelliğini Parametre Kaynağı Olarak Kullanma SelectedValue
(Tam boyutlu görüntüyü görüntülemek için tıklayın)
GridView'e geri döndüğünüzde, ProductName
, QuantityPerUnit
ve Discontinued
dışındaki tüm GridView alanlarını kaldırın ve Discontinued
CheckBoxField'i salt okunur olarak işaretleyin. Ayrıca GridView akıllı etiketinden Düzenlemeyi Etkinleştir seçeneğini işaretleyin. Bu değişiklikler yapıldıktan sonra GridView ve ObjectDataSource bildirim temelli işaretleme aşağıdakine benzer olmalıdır:
<asp:GridView ID="ProductsBySupplier" runat="server" AutoGenerateColumns="False"
DataKeyNames="ProductID" DataSourceID="ProductsBySupplierDataSource">
<Columns>
<asp:CommandField ShowEditButton="True" />
<asp:BoundField DataField="ProductName" HeaderText="Product"
SortExpression="ProductName" />
<asp:BoundField DataField="QuantityPerUnit" HeaderText="Qty/Unit"
SortExpression="QuantityPerUnit" />
<asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued"
ReadOnly="True" SortExpression="Discontinued" />
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ProductsBySupplierDataSource" runat="server"
OldValuesParameterFormatString="original_{0}" TypeName="ProductsBLL"
SelectMethod="GetProductsBySupplierID" UpdateMethod="UpdateProduct">
<UpdateParameters>
<asp:Parameter Name="productName" Type="String" />
<asp:Parameter Name="quantityPerUnit" Type="String" />
<asp:Parameter Name="productID" Type="Int32" />
</UpdateParameters>
<SelectParameters>
<asp:ControlParameter ControlID="SupplierDetails" Name="supplierID"
PropertyName="SelectedValue" Type="Int32" />
</SelectParameters>
</asp:ObjectDataSource>
Önceki ObjectDataSources'umuzda olduğu gibi, bu özellik OldValuesParameterFormatString
olarak ayarlanmıştır original_{0}
. Bu özellik, birim başına bir ürün adını veya miktarını güncelleştirmeye çalışırken sorunlara neden olur. Bu özelliği bildirim temelli söz diziminden tamamen kaldırın veya varsayılan {0}
olarak ayarlayın.
Bu yapılandırma tamamlandıktan sonra sayfamızda artık GridView'da seçilen tedarikçi tarafından sağlanan ürünler listelenmektedir (bkz. Şekil 13). Şu anda birim başına herhangi bir ürünün adı veya miktarı güncelleştirilebilir. Ancak, belirli bir sağlayıcıyla ilişkili kullanıcılar için bu tür işlevlerin kullanımdan kaldırılan ürünlerde yasaklanabilmesi için sayfa mantığımızı güncelleştirmemiz gerekir. 5. adımda bu son parçayı ele alacağız.
Şekil 13: Seçili Sağlayıcı Tarafından Sağlanan Ürünler Görüntüleniyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Uyarı
Bu düzenlenebilir GridView eklentisi ile Suppliers
DropDownList olay işleyicisi GridView'ı SelectedIndexChanged
salt okunur durumuna döndürecek şekilde güncelleştirilmelidir. Aksi takdirde, ürün bilgilerini düzenlemenin ortasındayken farklı bir sağlayıcı seçilirse, yeni sağlayıcı için GridView'daki ilgili dizin de düzenlenebilir olur. Bunu önlemek için, GridView'ın EditIndex
özelliğini olay işleyicisinde -1
olarak SelectedIndexChanged
ayarlamanız yeterlidir.
Ayrıca, GridView görünüm durumunun (varsayılan davranış) etkinleştirilmesinin önemli olduğunu unutmayın. GridView s EnableViewState
özelliğini olarak false
ayarlarsanız, eşzamanlı kullanıcıların istemeden kayıtları silmesini veya düzenlemesini sağlarsınız.
5. Adım: TÜM Tedarikçileri Göster/Düzenle Seçili Olmadığında, Sonlandırılan Ürünler için Düzenlemeye İzin Verme
ProductsBySupplier
GridView tamamen işlevsel olsa da, şu anda belirli bir sağlayıcıdan gelen kullanıcılara çok fazla erişim verir. İş kurallarımıza göre, bu tür kullanıcılar sonlandırılan ürünleri güncelleştirememelidir. Bunu zorunlu kılmak için, sayfa bir sağlayıcıdan bir kullanıcı tarafından ziyaret edilirken, bu GridView satırlarında sayfa artık kullanılmayan ürünler içeren Düzenle düğmesini gizleyebilir (veya devre dışı bırakabiliriz).
GridView RowDataBound
olayı için bir olay işleyicisi oluşturun. Bu olay işleyicisinde, kullanıcının belirli bir sağlayıcıyla ilişkilendirilip ilişkilendirilmediğini belirlememiz gerekir. Bu öğreticide Sağlayıcılar DropDownList SelectedValue
özelliği denetlenerek belirlenebilir . Bu özellik -1 dışında bir şeyse, kullanıcı belirli bir sağlayıcıyla ilişkilendirilir. Bu tür kullanıcılar için ürünün kullanımdan kaldırılıp kaldırılmadığını belirlememiz gerekir. GridView satırına bağlı gerçek ProductRow
örneğine, e.Row.DataItem
özelliği aracılığıyla, GridView Alt Bilgisinde Özet Bilgileri Görüntüleme öğreticisinde açıklandığı gibi ulaşabiliriz. Ürün kullanımdan kaldırıldıysa, önceki öğreticide açıklanan Silme sırasında Client-Side Onayı Ekleme tekniklerini kullanarak GridView'daki CommandField'daki Düzenle düğmesine program aracılığıyla başvuruda bulunabiliriz. Bir referans elde ettikten sonra düğmeyi gizleyebilir veya kapatabiliriz.
Protected Sub ProductsBySupplier_RowDataBound _
(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) _
Handles ProductsBySupplier.RowDataBound
If e.Row.RowType = DataControlRowType.DataRow Then
' Is this a supplier-specific user?
If Suppliers.SelectedValue <> "-1" Then
' Get a reference to the ProductRow
Dim product As Northwind.ProductsRow = _
CType(CType(e.Row.DataItem, System.Data.DataRowView).Row, _
Northwind.ProductsRow)
' Is this product discontinued?
If product.Discontinued Then
' Get a reference to the Edit LinkButton
Dim editButton As LinkButton = _
CType(e.Row.Cells(0).Controls(0), LinkButton)
' Hide the Edit button
editButton.Visible = False
End If
End If
End If
End Sub
Bu olay işleyicisi mevcut olduğunda, bu sayfayı belirli bir tedarikçiden bir kullanıcı olarak ziyaret ederken, bu ürünler için Düzenle düğmesi gizlendiğinden, sonlandırılan ürünler düzenlenemez. Örneğin Chef Anton's Gumbo Mix, New Orleans Cajun Delights sağlayıcısı için kullanımdan kaldırılan bir üründür. Bu sağlayıcının sayfasını ziyaret ederken, bu ürünün Düzenle düğmesi görünürden gizlenir (bkz. Şekil 14). Bununla birlikte, "TÜM Tedarikçileri Göster/Düzenle" seçeneğini kullanarak ziyaret ettiğinizde Düzenle düğmesi kullanılabilir (bkz. Şekil 15).
Şekil 14: Supplier-Specific Kullanıcılar için Chef Anton'un Gumbo Mix'i için Düzenle Düğmesi Gizlendi (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Şekil 15: TÜM Tedarikçi Kullanıcılarını Göster/Düzenle için Chef Anton'un Gumbo Mix'i için Düzenle Düğmesi Görüntülenir (Tam boyutlu görüntüyü görüntülemek için tıklayın)
İş Mantığı Katmanında Erişim Haklarını Denetleme
Bu öğreticide ASP.NET sayfası, kullanıcının görebileceği bilgiler ve güncelleştirebileceği ürünlerle ilgili tüm mantığı işler. İdeal olan, bu mantığın İş Mantığı Katmanı'nda da mevcut olmasıdır. Örneğin, sınıfın SuppliersBLL
GetSuppliers()
yöntemi (tüm tedarikçileri döndürür) oturum açmış olan kullanıcının belirli bir sağlayıcıyla ilişkilendirilmediğinden emin olmak için bir denetim içerebilir. Benzer şekilde, UpdateSupplierAddress
yöntem şu anda oturum açmış olan kullanıcının şirketimiz için çalıştığından (ve bu nedenle tüm tedarikçilerin adres bilgilerini güncelleştirebileceğinden) veya verileri güncelleştirilmekte olan tedarikçiyle ilişkilendirildiğinden emin olmak için bir denetim içerebilir.
Öğreticimizde kullanıcı hakları, BLL sınıflarının erişemediği sayfadaki bir DropDownList tarafından belirlendiğinden, bu tür BLL katmanı denetimlerini buraya eklemedim. Üyelik sistemini veya ASP.NET tarafından sağlanan kullanıma hazır kimlik doğrulama düzenlerinden birini kullanırken (Windows kimlik doğrulaması gibi), şu anda oturum açmış olan kullanıcının bilgilerine ve rol bilgilerine BLL'den erişilebilir, böylece bu erişim hakları denetimleri hem sunuda hem de BLL katmanlarında mümkün olur.
Özet
Kullanıcı hesaplarını sağlayan çoğu sitenin, oturum açmış kullanıcıya göre veri değişikliği arabirimini özelleştirmesi gerekir. Yönetici kullanıcılar herhangi bir kaydı silebilir ve düzenleyebilirken, yönetici olmayan kullanıcılar yalnızca kendi oluşturdukları kayıtları güncelleştirmek veya silmekle sınırlı olabilir. Senaryo ne olursa olsun, veri Web denetimleri, ObjectDataSource ve İş Mantığı Katmanı sınıfları, oturum açmış kullanıcıya göre belirli işlevleri eklemek veya reddetmek için genişletilebilir. Bu öğreticide, kullanıcının belirli bir tedarikçiyle ilişkilendirilip ilişkilendirildiğine veya şirketimiz için çalışıp çalışmadığına bağlı olarak görüntülenebilir ve düzenlenebilir verilerin nasıl sınırlandığını gördük.
Bu öğreticide GridView, DetailsView ve FormView denetimlerini kullanarak veri ekleme, güncelleştirme ve silme işlemlerimiz tamamlanmıştır. Sonraki derse başladığımızda, dikkatimizi sayfalama ve sıralama desteği eklemeye vereceğiz.
Mutlu Programlama!
Yazar Hakkında
Yedi 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ışır. Son kitabı Sams Teach Yourself ASP.NET 24 Hours 2.0'dır. Ona adresinden mitchell@4GuysFromRolla.comulaşabilirsiniz.