Bagikan melalui


Membatasi Fungsionalitas Modifikasi Data Berdasarkan Pengguna (C#)

oleh Scott Mitchell

Unduh PDF

Dalam aplikasi web yang memungkinkan pengguna mengedit data, akun pengguna yang berbeda mungkin memiliki hak istimewa pengeditan data yang berbeda. Dalam tutorial ini kita akan memeriksa cara menyesuaikan kemampuan modifikasi data secara dinamis berdasarkan pengguna yang mengunjungi.

Pendahuluan

Sejumlah aplikasi web mendukung akun pengguna dan menyediakan opsi, laporan, dan fungsionalitas yang berbeda berdasarkan pengguna yang masuk. Misalnya, dengan tutorial kami, kami mungkin ingin mengizinkan pengguna dari perusahaan pemasok untuk masuk ke situs dan memperbarui informasi umum tentang produk mereka - nama dan kuantitas per unit mereka, mungkin - bersama dengan informasi pemasok, seperti nama perusahaan, alamat, informasi kontak orang, dan sebagainya. Selain itu, kami mungkin ingin menambahkan beberapa akun pengguna untuk karyawan perusahaan kami sehingga mereka dapat masuk dan memperbarui informasi produk seperti unit dalam stok, tingkat pemesanan ulang, dan sebagainya. Aplikasi web kami mungkin juga memungkinkan pengguna anonim untuk mengunjungi (orang yang belum masuk), tetapi akan membatasi mereka hanya untuk melihat data. Dengan sistem akun pengguna seperti itu, kami ingin kontrol Web data di halaman ASP.NET kami menawarkan kemampuan menyisipkan, mengedit, dan menghapus yang sesuai untuk pengguna yang saat ini masuk.

Dalam tutorial ini kita akan memeriksa cara menyesuaikan kemampuan modifikasi data secara dinamis berdasarkan pengguna yang mengunjungi. Secara khusus, kita akan membuat halaman yang menampilkan informasi pemasok dalam DetailsView yang dapat diedit bersama dengan GridView yang mencantumkan produk yang disediakan oleh pemasok. Jika pengguna yang mengunjungi halaman berasal dari perusahaan kami, mereka dapat: melihat informasi pemasok; edit alamat mereka; dan mengedit informasi untuk produk apa pun yang disediakan oleh pemasok. Namun, jika pengguna berasal dari perusahaan tertentu, mereka hanya dapat melihat dan mengedit informasi alamat mereka sendiri dan hanya dapat mengedit produk mereka yang belum ditandai sebagai dihentikan.

Pengguna dari Perusahaan Kami Dapat Mengedit Informasi Pemasok Apa Pun

Gambar 1: Pengguna dari Perusahaan Kami Dapat Mengedit Informasi Pemasok Apa Pun (Klik untuk melihat gambar ukuran penuh)

Pengguna dari Pemasok Tertentu Hanya Dapat Melihat dan Mengedit Informasi mereka

Gambar 2: Pengguna dari Pemasok Tertentu Hanya Dapat Melihat dan Mengedit Informasi mereka (Klik untuk melihat gambar ukuran penuh)

Mari kita mulai!

Nota

Sistem keanggotaan ASP.NET 2.0 menyediakan platform standar yang bisa dikembangkan untuk membuat, mengelola, dan memvalidasi akun pengguna. Karena pemeriksaan sistem keanggotaan berada di luar cakupan tutorial ini, tutorial ini sebaliknya mensimulasikan keanggotaan dengan memungkinkan pengunjung anonim untuk memilih apakah mereka berasal dari pemasok tertentu atau dari perusahaan kami sendiri. Untuk informasi selengkapnya tentang keanggotaan, lihat seri artikel Keanggotaan, Peran, dan Profil ASP.NET 2.0 saya .

Langkah 1: Mengizinkan Pengguna menentukan Hak Akses mereka

Dalam aplikasi web dunia nyata, informasi akun pengguna akan mencakup apakah mereka bekerja untuk perusahaan kami atau untuk pemasok tertentu, dan informasi ini akan dapat diakses secara terprogram dari halaman ASP.NET kami setelah pengguna masuk ke situs. Informasi ini dapat diambil melalui sistem peran ASP.NET 2.0 s, sebagai informasi akun tingkat pengguna melalui sistem profil, atau melalui beberapa cara kustom.

Karena tujuan tutorial ini adalah untuk menunjukkan penyesuaian kemampuan modifikasi data berdasarkan pengguna yang masuk, dan tidak dimaksudkan untuk menampilkan keanggotaan, peran, dan sistem profil ASP.NET 2.0 s, kami akan menggunakan mekanisme yang sangat sederhana untuk menentukan kemampuan bagi pengguna yang mengunjungi halaman - DropDownList tempat pengguna dapat menunjukkan apakah mereka harus dapat melihat dan mengedit salah satu informasi pemasok atau, atau, informasi pemasok tertentu apa yang dapat mereka lihat dan edit. Jika pengguna menunjukkan bahwa dia dapat melihat dan mengedit semua informasi pemasok (default), dia dapat menelusuri semua pemasok, mengedit informasi alamat pemasok mana pun, serta mengedit nama dan jumlah per unit untuk produk yang disediakan oleh pemasok yang dipilih. Namun, jika pengguna menunjukkan bahwa dia hanya dapat melihat dan mengedit pemasok tertentu, maka dia hanya bisa mengakses detail dan produk dari pemasok tersebut serta hanya bisa memperbarui nama dan kuantitas per satuan unit untuk produk-produk yang tidak dihentikan.

Langkah pertama kami dalam tutorial ini, adalah membuat DropDownList ini dan mengisinya dengan pemasok dalam sistem. UserLevelAccess.aspx Buka halaman di EditInsertDelete folder, tambahkan DropDownList yang propertinya ID diatur ke Suppliers, dan ikat DropDownList ini ke ObjectDataSource baru bernama AllSuppliersDataSource.

Membuat ObjectDataSource Baru bernama AllSuppliersDataSource

Gambar 3: Buat ObjectDataSource Baru Bernama AllSuppliersDataSource (Klik untuk melihat gambar ukuran penuh)

Karena kami ingin DropDownList ini menyertakan semua pemasok, konfigurasikan ObjectDataSource untuk memanggil metode SuppliersBLL dari kelas GetSuppliers(). Pastikan juga bahwa metode ObjectDataSource dipetakan ke metode milik kelas Update()SuppliersBLL, karena ObjectDataSource ini juga akan digunakan oleh DetailsView yang akan kita tambahkan di Langkah 2.

Setelah menyelesaikan wizard ObjectDataSource, selesaikan langkah-langkah dengan mengonfigurasi Suppliers DropDownList sehingga menampilkan CompanyName bidang data dan menggunakan SupplierID bidang data sebagai nilai untuk setiap ListItem.

Mengonfigurasi DropDownList Pemasok untuk Menggunakan Bidang Data CompanyName dan SupplierID

Gambar 4: Konfigurasikan Suppliers DropDownList untuk Menggunakan CompanyName bidang data dan SupplierID (Klik untuk melihat gambar ukuran penuh)

Pada titik ini, DropDownList mencantumkan nama perusahaan pemasok dalam database. Namun, kita juga perlu menyertakan opsi "Tampilkan/Edit SEMUA Pemasok" ke DropDownList. Untuk mencapai hal ini, atur properti Suppliers DropDownList ke AppendDataBoundItemstrue, lalu tambahkan ListItem yang propertinya Text "Tampilkan/Edit SEMUA Pemasok" dan bernilai -1. Ini dapat ditambahkan langsung melalui markup deklaratif atau melalui Perancang dengan masuk ke jendela Properti dan mengklik elipsis di properti DropDownList.Items

Nota

Lihat kembali ke tutorial Pemfilteran Master/Detail Dengan DropDownList untuk diskusi yang lebih rinci tentang menambahkan Pilih Semua item ke DropDownList yang terikat data.

AppendDataBoundItems Setelah properti diatur dan ListItem ditambahkan, markup deklaratif DropDownList akan terlihat seperti:

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

Gambar 5 menunjukkan cuplikan layar kemajuan kami saat ini, saat dilihat melalui browser.

DropDownList Pemasok Berisi Tampilkan SEMUA ListItem, Plus Satu untuk Setiap Pemasok

Gambar 5: Suppliers DropDownList Berisi Tampilkan SEMUA ListItem, Plus Satu untuk Setiap Pemasok (Klik untuk melihat gambar ukuran penuh)

Karena kami ingin memperbarui antarmuka pengguna segera setelah pengguna mengubah pilihan mereka, atur Suppliers properti DropDownList ke AutoPostBacktrue. Di Langkah 2 kita akan membuat kontrol DetailsView yang akan menampilkan informasi untuk pemasok berdasarkan pilihan DropDownList. Kemudian, di Langkah 3, kita akan membuat penanganan aktivitas untuk peristiwa DropDownList SelectedIndexChanged ini, di mana kita akan menambahkan kode yang mengikat informasi pemasok yang sesuai ke DetailsView berdasarkan pemasok yang dipilih.

Langkah 2: Menambahkan Kontrol DetailsView

Mari kita gunakan DetailsView untuk menampilkan informasi pemasok. Untuk pengguna yang dapat melihat dan mengedit semua pemasok, DetailsView akan mendukung paging, memungkinkan pengguna untuk menelusuri informasi pemasok satu rekaman pada satu waktu. Namun, jika pengguna bekerja untuk pemasok tertentu, DetailsView hanya akan menampilkan informasi pemasok tertentu dan tidak akan menyertakan antarmuka halaman. Dalam kedua kasus, DetailsView perlu memungkinkan pengguna mengedit alamat pemasok, kota, dan bidang negara.

Tambahkan DetailsView ke halaman di bawah Suppliers DropDownList, atur propertinya ID ke SupplierDetails, dan ikat ke AllSuppliersDataSource ObjectDataSource yang dibuat di langkah sebelumnya. Selanjutnya, centang kotak Aktifkan Halaman dan Aktifkan Pengeditan dari tag pintar DetailsView.

Nota

Jika Anda tidak melihat opsi Aktifkan Pengeditan di tag pintar DetailsView, itu karena Anda tidak memetakan metode Update() dari ObjectDataSource ke metode SuppliersBLL dari kelas UpdateSupplierAddress. Luangkan waktu sejenak untuk kembali dan buat perubahan konfigurasi ini, setelah itu opsi Aktifkan Pengeditan akan muncul di tag pintar DetailsView.

Karena metode kelas SuppliersBLL hanya menerima empat parameter - UpdateSupplierAddress, supplierID, address, dan city - modifikasi BoundFields dari DetailsView sehingga BoundFields country dan CompanyName bersifat baca-saja. Selain itu, hapus SupplierID BoundField sama sekali. Akhirnya, AllSuppliersDataSource ObjectDataSource saat ini telah mengatur propertinya OldValuesParameterFormatString ke original_{0}. Luangkan waktu sejenak untuk menghapus pengaturan properti ini dari sintaks deklaratif sama sekali, atau atur ke nilai default, {0}.

Setelah mengonfigurasi SupplierDetails DetailsView dan AllSuppliersDataSource ObjectDataSource, kami akan memiliki markup deklaratif berikut:

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

Pada titik ini DetailsView dapat digulir dan informasi alamat pemasok yang dipilih dapat diperbarui, terlepas dari pilihan yang dibuat dalam Suppliers DropDownList (lihat Gambar 6).

Informasi Pemasok apa pun dapat dilihat, dan Alamatnya Diperbarui

Gambar 6: Setiap Informasi Pemasok Dapat Dilihat, dan Alamatnya Diperbarui (Klik untuk melihat gambar ukuran penuh)

Langkah 3: Hanya Menampilkan Informasi Pemasok yang Dipilih

Halaman kami saat ini menampilkan informasi untuk semua pemasok terlepas dari apakah pemasok tertentu telah dipilih dari Suppliers DropDownList. Untuk menampilkan hanya informasi pemasok untuk pemasok yang dipilih, kita perlu menambahkan ObjectDataSource lain ke halaman kita, yang mengambil informasi tentang pemasok tertentu.

Tambahkan ObjectDataSource baru ke halaman, beri nama SingleSupplierDataSource. Dari tag pintarnya, klik tautan Konfigurasi Sumber Data dan minta menggunakan SuppliersBLL kelas GetSupplierBySupplierID(supplierID) metode. Seperti halnya AllSuppliersDataSource ObjectDataSource, metode SingleSupplierDataSource ObjectDataSource harus Update() dipetakan ke metode SuppliersBLL kelas UpdateSupplierAddress.

Konfigurasikan SingleSupplierDataSource ObjectDataSource untuk Menggunakan Metode GetSupplierBySupplierID(supplierID)

Gambar 7: Konfigurasikan SingleSupplierDataSource ObjectDataSource untuk Menggunakan GetSupplierBySupplierID(supplierID) Metode (Klik untuk melihat gambar ukuran penuh)

Selanjutnya, kami diminta untuk menentukan sumber parameter untuk GetSupplierBySupplierID(supplierID) parameter input metode s supplierID . Karena kami ingin menampilkan informasi untuk pemasok yang dipilih dari DropDownList, gunakan Suppliers properti DropDownList sebagai SelectedValue sumber parameter.

Gunakan DropDownList Pemasok sebagai Sumber Parameter supplierID

Gambar 8: Gunakan Suppliers DropDownList sebagai supplierID Sumber Parameter (Klik untuk melihat gambar ukuran penuh)

Bahkan dengan ObjectDataSource kedua ini ditambahkan, kontrol DetailsView saat ini dikonfigurasi untuk selalu menggunakan AllSuppliersDataSource ObjectDataSource. Kita perlu menambahkan logika untuk menyesuaikan sumber data yang digunakan oleh DetailsView tergantung pada Suppliers item DropDownList yang dipilih. Untuk mencapai hal ini, buat SelectedIndexChanged penanganan aktivitas untuk DropDownList Pemasok. Ini dapat dengan mudah dibuat dengan mengklik dua kali DropDownList di Perancang. Penanganan aktivitas ini perlu menentukan sumber data apa yang akan digunakan dan harus mengikat ulang data ke DetailsView. Ini dicapai dengan kode berikut:

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();
}

Penanganan aktivitas dimulai dengan menentukan apakah opsi "Tampilkan/Edit SEMUA Pemasok" dipilih. Jika ya, ini mengatur SupplierDetails DetailsView DataSourceID ke AllSuppliersDataSource dan mengembalikan pengguna ke catatan pertama dalam kumpulan pemasok dengan mengatur properti PageIndex ke 0. Namun, jika pengguna telah memilih pemasok tertentu dari DropDownList, DetailsView ditetapkan DataSourceID sebagai SingleSuppliersDataSource. Terlepas dari sumber data yang digunakan, mode SuppliersDetails diubah kembali ke dalam mode baca-saja dan data diikat kembali ke DetailsView melalui panggilan metode SuppliersDetails kontrol DataBind().

Dengan penanganan aktivitas ini di tempat, kontrol DetailsView sekarang menunjukkan pemasok yang dipilih, kecuali opsi "Tampilkan/Edit SEMUA Pemasok" dipilih, dalam hal ini semua pemasok dapat dilihat melalui antarmuka halaman. Gambar 9 memperlihatkan halaman dengan opsi "Tampilkan/Edit SEMUA Pemasok" dipilih; perhatikan bahwa antarmuka halaman ada, memungkinkan pengguna untuk mengunjungi dan memperbarui pemasok apa pun. Gambar 10 memperlihatkan halaman dengan pemasok Ma Maison yang dipilih. Hanya informasi Ma Maison yang dapat dilihat dan dapat diedit dalam kasus ini.

Semua Informasi Pemasok Dapat Dilihat dan Diedit

Gambar 9: Semua Informasi Pemasok Dapat Dilihat dan Diedit (Klik untuk melihat gambar ukuran penuh)

Hanya Informasi Pemasok yang Dipilih yang Dapat Dilihat dan Diedit

Gambar 10: Hanya Informasi Pemasok yang Dipilih yang Dapat Dilihat dan Diedit (Klik untuk melihat gambar ukuran penuh)

Nota

Untuk tutorial ini, kontrol DropDownList EnableViewState dan DetailsView harus diatur ke true (default) karena perubahan properti pada DropDownList SelectedIndex dan DetailsView DataSourceID harus diingat di seluruh postback.

Langkah 4: Mencantumkan Produk Pemasok dalam GridView yang Dapat Diedit

Dengan DetailView selesai, langkah kami selanjutnya adalah menyertakan GridView yang dapat diedit yang mencantumkan produk yang disediakan oleh pemasok yang dipilih. GridView ini harus memungkinkan pengeditan hanya pada bidang ProductName dan QuantityPerUnit. Selain itu, jika pengguna yang mengunjungi halaman berasal dari pemasok tertentu, itu hanya boleh memungkinkan pembaruan untuk produk-produk yang tidak dihentikan. Untuk mencapai hal ini, kita harus terlebih dahulu menambahkan overload ke metode ProductsBLL dari kelas UpdateProducts yang hanya mengambil bidang ProductID, ProductName, dan QuantityPerUnit sebagai input. Kami telah melalui proses ini sebelumnya dalam banyak tutorial, jadi mari kita lihat kode di sini, yang harus ditambahkan ke ProductsBLL:

[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;
}

Dengan kelebihan beban ini dibuat, kami siap untuk menambahkan kontrol GridView dan ObjectDataSource terkait. Tambahkan GridView baru ke halaman, atur propertinya ID ke ProductsBySupplier, dan konfigurasikan untuk menggunakan ObjectDataSource baru bernama ProductsBySupplierDataSource. Karena kami ingin GridView ini mencantumkan produk tersebut oleh pemasok yang dipilih, gunakan metode ProductsBLL kelas GetProductsBySupplierID(supplierID). Hubungkan metode Update() ke overload baru UpdateProduct yang baru saja dibuat.

Mengonfigurasi ObjectDataSource untuk menggunakan Overload UpdateProduct yang baru dibuat

Gambar 11: Mengonfigurasi ObjectDataSource untuk Menggunakan UpdateProduct Overload Just Create (Klik untuk melihat gambar ukuran penuh)

Kami diminta untuk memilih sumber parameter untuk GetProductsBySupplierID(supplierID) parameter input metode s supplierID . Karena kami ingin menampilkan produk untuk pemasok yang dipilih di DetailsView, gunakan SuppliersDetails properti kontrol SelectedValue DetailsView sebagai sumber parameter.

Gunakan Properti SelectedValue dari SuppliersDetails DetailsView sebagai Sumber Parameter

Gambar 12: Gunakan SuppliersDetails Properti DetailsView s SelectedValue sebagai Sumber Parameter (Klik untuk melihat gambar ukuran penuh)

Kembali ke GridView, hapus semua bidang GridView kecuali untuk ProductName, , QuantityPerUnitdan Discontinued, menandai Discontinued CheckBoxField sebagai baca-saja. Selain itu, centang opsi Aktifkan Pengeditan dari tag pintar GridView. Setelah perubahan ini dibuat, markup deklaratif untuk GridView dan ObjectDataSource akan terlihat mirip dengan yang berikut ini:

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

Seperti halnya ObjectDataSources kami sebelumnya, properti s OldValuesParameterFormatString ini diatur ke original_{0}, yang akan menyebabkan masalah saat mencoba memperbarui nama atau kuantitas produk per unit. Hapus properti ini dari sintaks deklaratif sama sekali atau atur ke defaultnya, {0}.

Dengan konfigurasi ini selesai, halaman kami sekarang mencantumkan produk yang disediakan oleh pemasok yang dipilih di GridView (lihat Gambar 13). Saat ini nama atau kuantitas produk apa pun per unit dapat diperbarui. Namun, kita perlu memperbarui logika halaman sehingga fungsionalitas tersebut dilarang untuk produk yang dihentikan untuk pengguna yang terkait dengan pemasok tertentu. Kita akan mengatasi bagian terakhir ini di Langkah 5.

Produk yang Disediakan oleh Pemasok yang Dipilih Ditampilkan

Gambar 13: Produk yang Disediakan oleh Pemasok yang Dipilih Ditampilkan (Klik untuk melihat gambar ukuran penuh)

Nota

Dengan penambahan GridView yang dapat diedit Suppliers ini, penanganan aktivitas DropDownList SelectedIndexChanged harus diperbarui untuk mengembalikan GridView ke status baca-saja. Jika tidak, jika pemasok yang berbeda dipilih saat berada di tengah mengedit informasi produk, indeks yang sesuai di GridView untuk pemasok baru juga akan dapat diedit. Untuk mencegah hal ini, cukup atur properti EditIndex GridView ke -1 di pengendali acara SelectedIndexChanged.

Selain itu, ingatlah bahwa penting bahwa status tampilan GridView diaktifkan (perilaku default). Jika Anda mengatur properti EnableViewStateGridView ke false , Anda berisiko memiliki pengguna bersamaan yang secara tidak sengaja menghapus atau mengedit rekaman.

Langkah 5: Nonaktifkan Pengeditan untuk Produk yang Dihentikan Ketika Tampilkan/Edit SEMUA Pemasok Tidak Dipilih

ProductsBySupplier Meskipun GridView berfungsi penuh, gridview saat ini memberikan terlalu banyak akses kepada pengguna yang berasal dari pemasok tertentu. Sesuai aturan bisnis kami, pengguna tersebut seharusnya tidak dapat memperbarui produk yang dihentikan. Untuk memberlakukan ini, kita dapat menyembunyikan (atau menonaktifkan) tombol Edit di baris GridView tersebut dengan produk yang dihentikan ketika halaman sedang dikunjungi oleh pengguna dari pemasok.

Buat penanganan aktivitas untuk peristiwa GridView RowDataBound . Dalam penanganan aktivitas ini kita perlu menentukan apakah pengguna dikaitkan dengan pemasok tertentu atau tidak, yang, untuk tutorial ini, dapat ditentukan dengan memeriksa properti DropDownList SelectedValue Pemasok - jika itu sesuatu selain -1, maka pengguna dikaitkan dengan pemasok tertentu. Untuk pengguna tersebut, kita kemudian perlu menentukan apakah produk dihentikan atau tidak. Kita dapat mengambil referensi ke instans aktual ProductRow yang terikat ke baris GridView melalui properti e.Row.DataItem, seperti yang dibahas dalam tutorial Menampilkan Informasi Ringkasan di Footer GridView. Jika produk tidak lagi diproduksi, kita dapat mengambil referensi terprogram ke tombol Edit dalam CommandField di GridView dengan menggunakan teknik yang dibahas dalam tutorial sebelumnya, Menambahkan Client-Side Konfirmasi Saat Menghapus. Setelah kita memiliki referensi, kita kemudian dapat menyembunyikan atau menonaktifkan tombol .

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

Dengan penanganan aktivitas ini di tempat, ketika mengunjungi halaman ini sebagai pengguna dari pemasok tertentu, produk yang dihentikan tidak dapat diedit, karena tombol Edit disembunyikan untuk produk-produk ini. Misalnya, Gumbo Mix Chef Anton's adalah produk yang sudah tidak diproduksi lagi oleh pemasok New Orleans Cajun Delights. Saat mengunjungi halaman untuk pemasok khusus ini, tombol Edit untuk produk ini disembunyikan dari penglihatan (lihat Gambar 14). Namun, saat mengunjungi menggunakan "Tampilkan/Edit SEMUA Pemasok," tombol Edit tersedia (lihat Gambar 15).

Untuk pengguna Supplier-Specific Tombol Edit untuk Chef Anton s Gumbo Mix disembunyikan

Gambar 14: Untuk pengguna Supplier-Specific Tombol Edit untuk Chef Anton s Gumbo Mix disembunyikan (Klik untuk melihat gambar ukuran penuh)

Untuk Menampilkan/Mengedit Seluruh Pengguna Pemasok, Tombol Edit untuk Chef Anton's Gumbo Mix Ditampilkan

Gambar 15: Untuk Tampilkan/Edit SEMUA Pengguna Pemasok, Tombol Edit untuk Campuran Gumbo Chef Anton ditampilkan (Klik untuk melihat gambar ukuran penuh)

Memeriksa Hak Akses di Lapisan Logika Bisnis

Dalam tutorial ini halaman ASP.NET menangani semua logika sehubungan dengan informasi apa yang dapat dilihat pengguna dan produk apa yang dapat dia perbarui. Idealnya, logika ini juga akan ada di Lapisan Logika Bisnis. Misalnya, SuppliersBLL metode kelas s GetSuppliers() (yang mengembalikan semua pemasok) mungkin menyertakan pemeriksaan untuk memastikan bahwa pengguna yang saat ini masuk tidak terkait dengan pemasok tertentu. Demikian juga, metode ini UpdateSupplierAddress dapat menyertakan pemeriksaan untuk memastikan bahwa pengguna yang saat ini masuk bekerja untuk perusahaan kami (dan oleh karena itu dapat memperbarui semua informasi alamat pemasok) atau dikaitkan dengan pemasok yang datanya sedang diperbarui.

Saya tidak menyertakan pemeriksaan lapisan BLL seperti itu di sini karena dalam tutorial kami hak pengguna ditentukan oleh DropDownList pada halaman, yang tidak dapat diakses oleh kelas BLL. Saat menggunakan sistem keanggotaan atau salah satu skema autentikasi di luar kotak yang disediakan oleh ASP.NET (seperti autentikasi Windows), informasi pengguna yang saat ini masuk dan informasi peran dapat diakses dari BLL, sehingga memungkinkan pemeriksaan hak akses tersebut di lapisan presentasi dan BLL.

Ringkasan

Sebagian besar situs yang menyediakan akun pengguna perlu menyesuaikan antarmuka modifikasi data berdasarkan pengguna yang masuk. Pengguna administratif mungkin dapat menghapus dan mengedit rekaman apa pun, sedangkan pengguna non-administratif mungkin hanya dibatasi untuk memperbarui atau menghapus rekaman yang mereka buat sendiri. Apa pun skenarionya, kontrol Web data, ObjectDataSource, dan kelas Lapisan Logika Bisnis dapat diperluas untuk menambahkan atau menolak fungsionalitas tertentu berdasarkan pengguna yang masuk. Dalam tutorial ini kami melihat cara membatasi data yang dapat dilihat dan dapat diedit tergantung pada apakah pengguna dikaitkan dengan pemasok tertentu atau jika mereka bekerja untuk perusahaan kami.

Tutorial ini menyimpulkan pemeriksaan kami untuk menyisipkan, memperbarui, dan menghapus data menggunakan kontrol GridView, DetailsView, dan FormView. Dimulai dengan tutorial berikutnya, kita akan fokus untuk menambahkan dukungan pemrosesan halaman dan pengurutan.

Selamat Pemrograman!

Tentang Penulis

Scott Mitchell, penulis tujuh buku ASP/ASP.NET dan pendiri 4GuysFromRolla.com, telah bekerja sama dengan teknologi Microsoft Web sejak 1998. Scott bekerja sebagai konsultan, pelatih, dan penulis independen. Buku terbarunya adalah Sams Teach Yourself ASP.NET 2.0 dalam 24 Jam. Dia dapat dijangkau di mitchell@4GuysFromRolla.com.