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 tutorial ini, kita akan melihat cara menangani pengecualian yang dimunculkan secara bijaksana selama alur kerja pembaruan DataList yang dapat diedit.
Pendahuluan
Dalam Ringkasan Pengeditan dan Penghapusan Data dalam tutorial DataList , kami membuat DataList yang menawarkan kemampuan pengeditan dan penghapusan sederhana. Meskipun berfungsi penuh, itu hampir tidak ramah pengguna, karena kesalahan apa pun yang terjadi selama proses pengeditan atau penghapusan mengakibatkan pengecualian yang tidak tertangani. Misalnya, menghilangkan nama produk atau, saat mengedit produk, memasukkan nilai harga sangat terjangkau!, memberikan pengecualian. Karena pengecualian ini tidak tertangkap dalam kode, pengecualian ini berdengung hingga runtime ASP.NET, yang kemudian menampilkan detail pengecualian di halaman web.
Seperti yang kita lihat dalam tutorial Menangani Pengecualian BLL dan DAL-Level dalam Halaman ASP.NET , jika pengecualian dinaikkan dari kedalaman Logika Bisnis atau Lapisan Akses Data, detail pengecualian dikembalikan ke ObjectDataSource dan kemudian ke GridView. Kami melihat cara menangani pengecualian ini dengan anggun dengan membuat Updated
atau RowUpdated
penanganan aktivitas untuk ObjectDataSource atau GridView, memeriksa pengecualian, lalu menunjukkan bahwa pengecualian ditangani.
Namun, tutorial DataList kami tidak menggunakan ObjectDataSource untuk memperbarui dan menghapus data. Sebaliknya, kami bekerja langsung melawan BLL. Untuk mendeteksi pengecualian yang berasal dari BLL atau DAL, kita perlu menerapkan kode penanganan pengecualian dalam kode di belakang halaman ASP.NET kita. Dalam tutorial ini, kita akan melihat cara menangani pengecualian yang dimunculkan secara lebih bijaksana selama alur kerja pembaruan DataList yang dapat diedit.
Nota
Dalam Ringkasan Pengeditan dan Penghapusan Data dalam tutorial DataList , kami membahas berbagai teknik untuk mengedit dan menghapus data dari DataList, Beberapa teknik yang terlibat menggunakan ObjectDataSource untuk memperbarui dan menghapus. Jika Anda menggunakan teknik ini, Anda dapat menangani pengecualian dari BLL atau DAL melalui ObjectDataSource s Updated
atau Deleted
penanganan aktivitas.
Langkah 1: Membuat DataList yang Dapat Diedit
Sebelum kita khawatir tentang menangani pengecualian yang terjadi selama alur kerja pembaruan, mari kita terlebih dahulu membuat DataList yang dapat diedit.
ErrorHandling.aspx
Buka halaman di EditDeleteDataList
folder, tambahkan DataList ke Perancang, atur propertinya ID
ke Products
, dan tambahkan ObjectDataSource baru bernama ProductsDataSource
. Konfigurasikan ObjectDataSource untuk menggunakan ProductsBLL
metode kelas s GetProducts()
untuk memilih rekaman; atur daftar drop-down di tab INSERT, UPDATE, dan DELETE ke (Tidak Ada).
Gambar 1: Mengembalikan Informasi Produk Menggunakan GetProducts()
Metode (Klik untuk melihat gambar ukuran penuh)
Setelah menyelesaikan wizard ObjectDataSource, Visual Studio akan secara otomatis membuat ItemTemplate
untuk DataList. Ganti ini dengan ItemTemplate
yang menampilkan setiap nama dan harga produk dan menyertakan tombol Edit. Selanjutnya, buat EditItemTemplate
dengan kontrol Web TextBox untuk nama dan harga dan tombol Perbarui dan Batalkan. Terakhir, atur properti DataList ke RepeatColumns
2.
Setelah perubahan ini, markup deklaratif halaman Anda akan terlihat mirip dengan yang berikut ini. Periksa kembali untuk memastikan bahwa tombol Edit, Batal, dan Perbarui masing-masing mengatur propertinya CommandName
ke Edit, Batal, dan Perbarui.
<asp:DataList ID="Products" runat="server" DataKeyField="ProductID"
DataSourceID="ProductsDataSource" RepeatColumns="2">
<ItemTemplate>
<h5>
<asp:Label runat="server" ID="ProductNameLabel"
Text='<%# Eval("ProductName") %>' />
</h5>
Price:
<asp:Label runat="server" ID="Label1"
Text='<%# Eval("UnitPrice", "{0:C}") %>' />
<br />
<asp:Button runat="server" id="EditProduct" CommandName="Edit"
Text="Edit" />
<br />
<br />
</ItemTemplate>
<EditItemTemplate>
Product name:
<asp:TextBox ID="ProductName" runat="server"
Text='<%# Eval("ProductName") %>' />
<br />
Price:
<asp:TextBox ID="UnitPrice" runat="server"
Text='<%# Eval("UnitPrice", "{0:C}") %>' />
<br />
<br />
<asp:Button ID="UpdateProduct" runat="server" CommandName="Update"
Text="Update" />
<asp:Button ID="CancelUpdate" runat="server" CommandName="Cancel"
Text="Cancel" />
</EditItemTemplate>
</asp:DataList>
<asp:ObjectDataSource ID="ProductsDataSource" runat="server"
SelectMethod="GetProducts" TypeName="ProductsBLL"
OldValuesParameterFormatString="original_{0}">
</asp:ObjectDataSource>
Nota
Untuk tutorial ini, status tampilan DataList harus diaktifkan.
Luangkan waktu sejenak untuk melihat kemajuan kami melalui browser (lihat Gambar 2).
Gambar 2: Setiap Produk Menyertakan Tombol Edit (Klik untuk melihat gambar ukuran penuh)
Saat ini, tombol Edit hanya menyebabkan postback belum membuat produk dapat diedit. Untuk mengaktifkan pengeditan, kita perlu membuat penanganan aktivitas untuk DataList s EditCommand
, CancelCommand
, dan UpdateCommand
peristiwa. Peristiwa EditCommand
dan CancelCommand
hanya memperbarui properti DataList dan EditItemIndex
menggabungkan kembali data ke DataList:
protected void Products_EditCommand(object source, DataListCommandEventArgs e)
{
// Set the DataList's EditItemIndex property to the
// index of the DataListItem that was clicked
Products.EditItemIndex = e.Item.ItemIndex;
// Rebind the data to the DataList
Products.DataBind();
}
protected void Products_CancelCommand(object source, DataListCommandEventArgs e)
{
// Set the DataList's EditItemIndex property to -1
Products.EditItemIndex = -1;
// Rebind the data to the DataList
Products.DataBind();
}
Penanganan UpdateCommand
aktivitas sedikit lebih terlibat. Ini perlu dibaca dalam produk yang ProductID
diedit dari DataKeys
koleksi bersama dengan nama produk dan harga dari TextBoxes di EditItemTemplate
, dan kemudian memanggil ProductsBLL
metode kelas s UpdateProduct
sebelum mengembalikan DataList ke status pra-pengeditannya.
Untuk saat ini, mari kita gunakan kode yang sama persis dari UpdateCommand
penanganan aktivitas di Gambaran Umum Pengeditan dan Penghapusan Data dalam tutorial DataList . Kami akan menambahkan kode untuk menangani pengecualian dengan anggun di langkah 2.
protected void Products_UpdateCommand(object source, DataListCommandEventArgs e)
{
// Read in the ProductID from the DataKeys collection
int productID = Convert.ToInt32(Products.DataKeys[e.Item.ItemIndex]);
// Read in the product name and price values
TextBox productName = (TextBox)e.Item.FindControl("ProductName");
TextBox unitPrice = (TextBox)e.Item.FindControl("UnitPrice");
string productNameValue = null;
if (productName.Text.Trim().Length > 0)
productNameValue = productName.Text.Trim();
decimal? unitPriceValue = null;
if (unitPrice.Text.Trim().Length > 0)
unitPriceValue = Decimal.Parse(unitPrice.Text.Trim(),
System.Globalization.NumberStyles.Currency);
// Call the ProductsBLL's UpdateProduct method...
ProductsBLL productsAPI = new ProductsBLL();
productsAPI.UpdateProduct(productNameValue, unitPriceValue, productID);
// Revert the DataList back to its pre-editing state
Products.EditItemIndex = -1;
Products.DataBind();
}
Dalam menghadapi input yang tidak valid yang dapat dalam bentuk harga satuan yang diformat dengan tidak benar, nilai harga satuan ilegal seperti -$5.00, atau kelalaian nama produk pengecualian akan dinaikkan.
UpdateCommand
Karena penanganan aktivitas tidak menyertakan kode penanganan pengecualian apa pun pada saat ini, pengecualian akan menggelegak hingga runtime ASP.NET, di mana itu akan ditampilkan kepada pengguna akhir (lihat Gambar 3).
Gambar 3: Saat Pengecualian Tidak Tertangani Terjadi, Pengguna Akhir Melihat Halaman Kesalahan
Langkah 2: Menangani Pengecualian dengan Anggun di UpdateCommand Event Handler
Selama alur kerja pembaruan, pengecualian dapat terjadi di UpdateCommand
penanganan aktivitas, BLL, atau DAL. Misalnya, jika pengguna memasukkan harga Terlalu mahal, Decimal.Parse
pernyataan dalam penanganan UpdateCommand
aktivitas akan melemparkan FormatException
pengecualian. Jika pengguna menghilangkan nama produk atau jika harga memiliki nilai negatif, DAL akan mengajukan pengecualian.
Ketika pengecualian terjadi, kami ingin menampilkan pesan informatif dalam halaman itu sendiri. Tambahkan kontrol Web Label ke halaman yang ID
diatur ke ExceptionDetails
. Konfigurasikan teks Label untuk ditampilkan dalam font merah, ekstra besar, tebal, dan miring dengan menetapkan propertinya CssClass
ke Warning
kelas CSS, yang ditentukan dalam Styles.css
file.
Ketika terjadi kesalahan, kami hanya ingin Label ditampilkan sekali. Artinya, pada postback berikutnya, pesan peringatan Label harus hilang. Ini dapat dicapai dengan menghapus properti Text
pada Label atau mengatur propertinya Visible
ke False
dalam handler peristiwa Page_Load
(seperti yang kita lakukan sebelumnya dalam tutorial Penanganan Pengecualian BLL dan DAL-Level dalam Halaman ASP.NET) atau dengan menonaktifkan dukungan view state pada Label. Mari kita gunakan opsi terakhir.
<asp:Label ID="ExceptionDetails" EnableViewState="False" CssClass="Warning"
runat="server" />
Saat pengecualian dimunculkan, kami akan menetapkan detail pengecualian ke ExceptionDetails
properti Kontrol Text
label. Karena status tampilannya dinonaktifkan, pada postback Text
berikutnya, perubahan terprogram properti akan hilang, mengembalikan kembali ke teks default (string kosong), sehingga menyembunyikan pesan peringatan.
Untuk menentukan kapan kesalahan telah dimunculkan untuk menampilkan pesan bermanfaat di halaman, kita perlu menambahkan Try ... Catch
blok ke UpdateCommand
penanganan aktivitas. Bagian berisi Try
kode yang dapat menyebabkan pengecualian, sementara Catch
blok berisi kode yang dijalankan dalam menghadapi pengecualian. Lihat bagian Dasar-Dasar Penanganan Pengecualian di dokumentasi .NET Framework untuk informasi selengkapnya tentang Try ... Catch
blok.
protected void Products_UpdateCommand(object source, DataListCommandEventArgs e)
{
// Handle any exceptions raised during the editing process
try
{
// Read in the ProductID from the DataKeys collection
int productID = Convert.ToInt32(Products.DataKeys[e.Item.ItemIndex]);
... Some code omitted for brevity ...
}
catch (Exception ex)
{
// TODO: Display information about the exception in ExceptionDetails
}
}
Ketika pengecualian dari jenis apa pun dilemparkan oleh kode dalam Try
blok, Catch
kode blok akan mulai dijalankan. Jenis pengecualian yang dilemparkan DbException
, , NoNullAllowedException
ArgumentException
, dan sebagainya tergantung pada apa, tepatnya, mengendap kesalahan di tempat pertama. Jika ada masalah di tingkat database, akan DbException
dilemparkan. Jika nilai yang tidak valid dimasukkan untuk bidang UnitPrice
, UnitsInStock
, UnitsOnOrder
, atau ReorderLevel
, kesalahan ArgumentException
akan terjadi, karena kami menambahkan kode untuk memvalidasi nilai-nilai bidang ini di kelas ProductsDataTable
(lihat tutorial Membuat Lapisan Logika Bisnis).
Kami dapat memberikan penjelasan yang lebih membantu kepada pengguna akhir dengan mendinginkan teks pesan pada jenis pengecualian yang tertangkap. Kode berikut, yang digunakan dalam bentuk yang hampir identik di tutorial Penanganan Pengecualian BLL dan DAL-Level di Halaman ASP.NET, menyediakan tingkat detail ini:
private void DisplayExceptionDetails(Exception ex)
{
// Display a user-friendly message
ExceptionDetails.Text = "There was a problem updating the product. ";
if (ex is System.Data.Common.DbException)
ExceptionDetails.Text += "Our database is currently experiencing problems.
Please try again later.";
else if (ex is NoNullAllowedException)
ExceptionDetails.Text += "There are one or more required fields that are
missing.";
else if (ex is ArgumentException)
{
string paramName = ((ArgumentException)ex).ParamName;
ExceptionDetails.Text +=
string.Concat("The ", paramName, " value is illegal.");
}
else if (ex is ApplicationException)
ExceptionDetails.Text += ex.Message;
}
Untuk menyelesaikan tutorial ini, cukup panggil DisplayExceptionDetails
metode dari blok yang Catch
melewati instans yang tertangkap Exception
(ex
).
Try ... Catch
Dengan blok di tempat, pengguna disajikan dengan pesan kesalahan yang lebih informatif, seperti yang ditunjukkan Gambar 4 dan 5. Perhatikan bahwa dalam menghadapi pengecualian, DataList tetap dalam mode edit. Ini karena setelah pengecualian terjadi, alur kontrol segera dialihkan ke Catch
blok, melewati kode yang mengembalikan DataList ke status pra-pengeditannya.
Gambar 4: Pesan Kesalahan Ditampilkan jika Pengguna Menghilangkan Bidang yang Diperlukan (Klik untuk melihat gambar ukuran penuh)
Gambar 5: Pesan Kesalahan Ditampilkan Saat Memasukkan Harga Negatif (Klik untuk melihat gambar ukuran penuh)
Ringkasan
GridView dan ObjectDataSource menyediakan penanganan aktivitas pasca-tingkat yang menyertakan informasi tentang pengecualian apa pun yang dimunculkan selama alur kerja pembaruan dan penghapusan, serta properti yang dapat diatur untuk menunjukkan apakah pengecualian telah ditangani atau tidak. Namun, fitur-fitur ini tidak tersedia saat bekerja dengan DataList dan menggunakan BLL secara langsung. Sebaliknya, kami bertanggung jawab untuk menerapkan penanganan pengecualian.
Dalam tutorial ini kita melihat cara menambahkan penanganan pengecualian ke alur kerja pembaruan DataList yang dapat diedit dengan menambahkan Try ... Catch
blok ke UpdateCommand
penanganan aktivitas. Jika pengecualian dimunculkan selama alur kerja pembaruan, Catch
kode blok dijalankan, menampilkan informasi bermanfaat di ExceptionDetails
Label.
Pada titik ini, DataList tidak berupaya mencegah pengecualian terjadi di tempat pertama. Meskipun kami tahu bahwa harga negatif akan menghasilkan pengecualian, kami belum menambahkan fungsionalitas apa pun untuk secara proaktif mencegah pengguna memasukkan input yang tidak valid tersebut. Dalam tutorial berikutnya, kita akan melihat cara membantu mengurangi pengecualian yang disebabkan oleh input pengguna yang tidak valid dengan menambahkan kontrol validasi di EditItemTemplate
.
Selamat Pemrograman!
Bacaan Lebih Lanjut
Untuk informasi selengkapnya tentang topik yang dibahas dalam tutorial ini, lihat sumber daya berikut:
- Panduan Desain untuk Pengecualian
- Modul dan Pengelola Pencatatan Kesalahan (ELMAH) (pustaka sumber terbuka untuk pencatatan kesalahan)
- Pustaka Perusahaan untuk .NET Framework 2.0 (termasuk Blok Aplikasi Manajemen Pengecualian)
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.
Ucapan terima kasih khusus kepada
Seri tutorial ini ditinjau oleh banyak peninjau yang bermanfaat. Peninjau prospek untuk tutorial ini adalah Ken Pespisa. Tertarik untuk meninjau artikel MSDN saya yang akan datang? Jika demikian, hubungi saya di mitchell@4GuysFromRolla.com.