Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
oleh Scott Mitchell
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.
Gambar 1: Pengguna dari Perusahaan Kami Dapat Mengedit Informasi Pemasok Apa Pun (Klik untuk melihat gambar ukuran penuh)
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
.
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
.
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 AppendDataBoundItems
true
, 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.
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 AutoPostBack
true
. 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).
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
.
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.
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.
Gambar 9: Semua Informasi Pemasok Dapat Dilihat dan Diedit (Klik untuk melihat gambar ukuran penuh)
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.
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.
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
, , QuantityPerUnit
dan 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.
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 EnableViewState
GridView 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).
Gambar 14: Untuk pengguna Supplier-Specific Tombol Edit untuk Chef Anton s Gumbo Mix disembunyikan (Klik untuk melihat gambar ukuran penuh)
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.