Aracılığıyla paylaş


Kullanıcıya Bağlı Olarak Veri Değişikliği İşlevselliğini Sınırlama (C#)

tarafından Scott Mitchell

PDF'i indirin

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.

Şirketimizden Bir Kullanıcı Herhangi Bir Tedarikçinin Bilgilerini 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)

Belirli Bir Sağlayıcıdan Bir Kullanıcı Bilgilerini Yalnızca Görüntüleyebilir ve Düzenleyebilir

Ş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 s Üyelik, Roller ve Profil makale serilerimi inceleyin.

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.

AllSuppliersDataSource Adlı Yeni Bir ObjectDataSource Oluşturma

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

Suppliers DropDownList'i CompanyName ve SupplierID Veri Alanlarını Kullanacak Şekilde Yapılandırma

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

Tedarikçiler açılır-listesi, bir Tümünü Göster öğesini ve ardından her tedarikçi için bir öğeyi içerir

Ş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 AutoPostBackayarlayı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 SuppliersBLLUpdateSupplierAddress 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).

Tüm Tedarikçi Bilgileri Görüntülenebilir ve Adresi Güncelleştirilebilir

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

SingleSupplierDataSource ObjectDataSource'ı GetSupplierBySupplierID(supplierID) Yöntemini Kullanacak Şekilde Yapılandırma

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

Suppliers DropDownList değerini supplierID Parametre Kaynağı olarak kullanma

Ş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 void Suppliers_SelectedIndexChanged(object sender, EventArgs e)
{
    if (Suppliers.SelectedValue == "-1")
    {
        // 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";
    // Ensure that the DetailsView is in read-only mode
    SupplierDetails.ChangeMode(DetailsViewMode.ReadOnly);
    // Need to "refresh" the DetailsView
    SupplierDetails.DataBind();
}

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 DataSourceIDAllSuppliersDataSource 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 SingleSuppliersDataSourceatanı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.

Tüm Tedarikçi 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)

Yalnızca Seçili Sağlayıcı Bilgileri Görüntülenebilir ve Düzenlenebilir

Ş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 bool UpdateProduct(string productName, string quantityPerUnit, int productID)
{
    Northwind.ProductsDataTable products = Adapter.GetProductByProductID(productID);
    if (products.Count == 0)
        // no matching record found, return false
        return false;
    Northwind.ProductsRow product = products[0];
    product.ProductName = productName;
    if (quantityPerUnit == null)
        product.SetQuantityPerUnitNull();
    else
        product.QuantityPerUnit = quantityPerUnit;
    // Update the product record
    int rowsAffected = Adapter.Update(product);
    // Return true if precisely one row was updated, otherwise false
    return rowsAffected == 1;
}

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 ProductsBLLGetProductsBySupplierID(supplierID) yöntemini kullanın. Ayrıca Update() yöntemini, yeni oluşturduğumuz UpdateProduct aşırı yüklemeyle eşleyin.

ObjectDataSource'ı Az Önce Oluşturulan UpdateProduct Aşırı Yüklemesini Kullanacak Şekilde Yapılandırma

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

Parametre Kaynağı olarak SuppliersDetails DetailsView s SelectedValue Özelliğini Kullanma

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

Seçilen Sağlayıcı Tarafından Sağlanan Ürünler Görüntülenir

Ş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 falseayarlarsanı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 void ProductsBySupplier_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        // Is this a supplier-specific user?
        if (Suppliers.SelectedValue != "-1")
        {
            // Get a reference to the ProductRow
            Northwind.ProductsRow product =
                (Northwind.ProductsRow)((System.Data.DataRowView)e.Row.DataItem).Row;
            // Is this product discontinued?
            if (product.Discontinued)
            {
                // Get a reference to the Edit LinkButton
                LinkButton editButton = (LinkButton)e.Row.Cells[0].Controls[0];
                // Hide the Edit button
                editButton.Visible = false;
            }
        }
    }
}

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

Supplier-Specific Kullanıcılar için Chef Anton'un Gumbo Mix'i için Düzenle Düğmesi Gizlendi

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

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

Ş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 SuppliersBLLGetSuppliers() 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.