Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
tarafından Scott Mitchell
Bu öğreticide, düzenlenebilir bir DataList'in güncelleştirme iş akışı sırasında oluşan özel durumları düzgün bir şekilde nasıl işleyebileceğinizi göreceğiz.
Giriş
DataList öğreticisindeki Verileri Düzenleme ve Silmeye Genel Bakış öğreticisinde, basit düzenleme ve silme özellikleri sunan bir DataList oluşturduk. Tamamen işlevsel olsa da, düzenleme veya silme işlemi sırasında oluşan herhangi bir hata işlenmeyen bir özel durumla sonuçlandığı için kullanıcı dostu değildi. Örneğin, ürünün adını atlayarak veya bir ürünü düzenlerken Çok uygun fiyatlı! fiyat değeri girilmesi bir özel durum oluşturur. Bu özel durum koda yakalanmadığından, ASP.NET çalışma zamanına kadar kabarcık oluşturur ve ardından özel durumun ayrıntılarını web sayfasında görüntüler.
bir ASP.NET Sayfasında BLL- ve DAL-Level Özel Durumlarını İşleme öğreticisinde gördüğümüz gibi, İş Mantığı veya Veri Erişim Katmanları'nın derinliklerinden bir özel durum oluşturulursa, özel durum ayrıntıları ObjectDataSource'a ve ardından GridView'a döndürülür. ObjectDataSource veya GridView için olay işleyicileri oluşturarak veya Updated olay işleyicileri oluşturarakRowUpdated, bir özel durumu denetleyerek ve ardından özel durumun işlendiğini belirterek bu özel durumların düzgün bir şekilde nasıl işleneceğini gördük.
Ancak DataList öğreticilerimiz, verileri güncelleştirmek ve silmek için ObjectDataSource kullanmıyor. Bunun yerine, doğrudan BLL'ye karşı çalışıyoruz. BLL veya DAL'den kaynaklanan özel durumları algılamak için, ASP.NET sayfamızın arkasındaki kod içinde özel durum işleme kodu uygulamamız gerekir. Bu öğreticide, düzenlenebilir bir DataList güncelleştirme iş akışı sırasında oluşan özel durumları daha dikkatli bir şekilde nasıl işleyebileceğimizi göreceğiz.
Not
DataList öğreticisindeki Verileri Düzenleme ve Silmeye Genel Bakış öğreticisinde, DataList'te verileri düzenleme ve silmeye yönelik farklı teknikleri ele aldık. Güncelleştirme ve silme için ObjectDataSource'un kullanılmasıyla ilgili bazı teknikler. Bu teknikleri uygularsanız, ObjectDataSource veya Updated olay işleyicileri aracılığıyla BLL veya Deleted DAL özel durumlarını işleyebilirsiniz.
1. Adım: Düzenlenebilir DataList Oluşturma
Güncelleştirme iş akışı sırasında oluşan özel durumları işleme konusunda endişelenmeden önce düzenlenebilir bir DataList oluşturalım. klasöründeki sayfayı ErrorHandling.aspxEditDeleteDataList açın, Tasarımcı'ya bir DataList ekleyin, özelliğini olarak IDayarlayın Products ve adlı ProductsDataSourceyeni bir ObjectDataSource ekleyin. ObjectDataSource'ı kayıtları seçmek için sınıf ProductsBLL yöntemini kullanacak GetProducts() şekilde yapılandırın; INSERT, UPDATE ve DELETE sekmelerindeki açılan listeleri (Yok) olarak ayarlayın.
Şekil 1: Yöntemi Kullanarak GetProducts() Ürün Bilgilerini Döndürme (Tam boyutlu görüntüyü görüntülemek için tıklayın)
ObjectDataSource sihirbazını tamamladıktan sonra Visual Studio, DataList için otomatik olarak bir ItemTemplate oluşturur. Bunu, her ürünün adını ve fiyatını görüntüleyen ve bir Düzenle düğmesi içeren bir değerle ItemTemplate değiştirin. Ardından ad ve fiyat ile Güncelleştir ve İptal düğmeleri için TextBox Web denetimine sahip bir EditItemTemplate oluşturun. Son olarak DataList s RepeatColumns özelliğini 2 olarak ayarlayın.
Bu değişikliklerden sonra sayfanızın bildirim temelli işaretlemesi aşağıdakine benzer olmalıdır. Düzenle, İptal ve Güncelleştir düğmelerinin CommandName özelliklerinin sırasıyla Düzenle, İptal ve Güncelleştir olarak ayarlandığından emin olmak için iki kez denetleyin.
<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>
Not
Bu öğretici için DataList görünüm durumunun etkinleştirilmesi gerekir.
İlerleme durumumuzu bir tarayıcı üzerinden görüntülemek için biraz zaman ayırın (bkz. Şekil 2).
Şekil 2: Her Ürün Bir Düzenle Düğmesi içerir (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Şu anda Düzenle düğmesi yalnızca geri göndermeye neden olur ve ürünü henüz düzenlenebilir hale getirmez. Düzenlemeyi etkinleştirmek için DataList EditCommandCancelCommand, ve UpdateCommand olayları için olay işleyicileri oluşturmamız gerekir.
EditCommand ve CancelCommand olayları yalnızca DataList özelliğini EditItemIndex güncelleştirir ve verileri DataList'e yeniden bağlamaz:
Protected Sub Products_EditCommand(source As Object, e As DataListCommandEventArgs) _
Handles Products.EditCommand
' 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()
End Sub
Protected Sub Products_CancelCommand(source As Object, e As DataListCommandEventArgs) _
Handles Products.CancelCommand
' Set the DataList's EditItemIndex property to -1
Products.EditItemIndex = -1
' Rebind the data to the DataList
Products.DataBind()
End Sub
Olay UpdateCommand işleyicisi biraz daha karmaşıktır. Içindeki TextBoxes ProductIDürün adı ve fiyatıyla birlikte koleksiyondaki DataKeys düzenlenmiş ürünlerde EditItemTemplate okuması ve DataList'i düzenleme öncesi durumuna döndürmeden önce sınıfın ProductsBLL yöntemini çağırması UpdateProduct gerekir.
Şimdilik UpdateCommand öğreticisindeki olay işleyicisinden tam olarak aynı kodu kullanalım. 2. adımda özel durumları düzgün bir şekilde işlemek için kodu ekleyeceğiz.
Protected Sub Products_UpdateCommand(source As Object, e As DataListCommandEventArgs) _
Handles Products.UpdateCommand
' Read in the ProductID from the DataKeys collection
Dim productID As Integer = Convert.ToInt32(Products.DataKeys(e.Item.ItemIndex))
' Read in the product name and price values
Dim productName As TextBox = CType(e.Item.FindControl("ProductName"), TextBox)
Dim unitPrice As TextBox = CType(e.Item.FindControl("UnitPrice"), TextBox)
Dim productNameValue As String = Nothing
If productName.Text.Trim().Length > 0 Then
productNameValue = productName.Text.Trim()
End If
Dim unitPriceValue As Nullable(Of Decimal) = Nothing
If unitPrice.Text.Trim().Length > 0 Then
unitPriceValue = Decimal.Parse(unitPrice.Text.Trim(), _
System.Globalization.NumberStyles.Currency)
End If
' Call the ProductsBLL's UpdateProduct method...
Dim productsAPI As New ProductsBLL()
productsAPI.UpdateProduct(productNameValue, unitPriceValue, productID)
' Revert the DataList back to its pre-editing state
Products.EditItemIndex = -1
Products.DataBind()
End Sub
Hatalı biçimlendirilmiş birim fiyat, -$5,00 gibi geçersiz birim fiyat değeri veya ürün adının atlanması şeklinde olabilecek geçersiz girişler karşısında bir özel durum oluşturulur.
UpdateCommand Olay işleyicisi bu noktada herhangi bir özel durum işleme kodu içermediğinden, özel durum son kullanıcıya görüntüleneceği ASP.NET çalışma zamanına kadar kabarcık oluşturur (bkz. Şekil 3).
Şekil 3: İşlenmeyen Bir Özel Durum Oluştuğunda, Son Kullanıcı Bir Hata Sayfası Görür
2. Adım: UpdateCommand Olay İşleyicisi'nde Özel Durumları Düzgün bir Şekilde İşleme
Güncelleştirme iş akışı sırasında olay işleyicisinde, BLL'de veya DAL'de UpdateCommand özel durumlar oluşabilir. Örneğin, bir kullanıcı Çok pahalı bir fiyat girerse, Decimal.Parse olay işleyicisindeki UpdateCommand deyimi bir FormatException özel durum oluşturur. Kullanıcı ürünün adını atlarsa veya fiyatın negatif bir değeri varsa DAL bir özel durum oluşturur.
Bir özel durum oluştuğunda, sayfanın içinde bilgilendirici bir ileti görüntülemek istiyoruz. olarak ayarlanmış IDolan sayfaya ExceptionDetails bir Etiket Web denetimi ekleyin. Etiket metnini, özelliğini CssClass dosyada tanımlanan CSS sınıfına atayarak Warning kırmızı, fazladan büyük, kalın ve italik yazı tipiyle Styles.css görüntülenecek şekilde yapılandırın.
Bir hata oluştuğunda, Etiketin yalnızca bir kez görüntülenmesini istiyoruz. Yani, sonraki geri göndermelerde Etiket uyarı iletisi kaybolmalıdır. Bu, Olay işleyicisinde Label s Text özelliğini temizleyerek veya özelliğini Visible olarak ayarlayarak False (Page_Load yaptığımız gibi) veya Etiket görünüm durumu desteği devre dışı bırakılarak gerçekleştirilebilir. İkinci seçeneği kullanalım.
<asp:Label ID="ExceptionDetails" EnableViewState="False" CssClass="Warning"
runat="server" />
Özel durum oluştuğunda, özel durumun ayrıntılarını Etiket denetiminin ExceptionDetails özelliğine Text atarız. Görünüm durumu devre dışı bırakıldığından, sonraki geri göndermelerde özelliğin Text programlı değişiklikleri kaybolur ve varsayılan metne (boş bir dize) geri döner ve böylece uyarı iletisi gizlenir.
Sayfada yararlı bir ileti görüntülemek için bir hatanın ne zaman tetiklendiğini belirlemek için olay işleyicisine Try ... Catch bir UpdateCommand blok eklememiz gerekir. Bölümü Try bir özel duruma yol açabilecek kod içerirken Catch , blok bir özel durum karşısında yürütülen kodu içerir. Blok hakkında daha fazla bilgi için .NET Framework belgelerindeki Try ... Catch bölümüne bakın.
Protected Sub Products_UpdateCommand(source As Object, e As DataListCommandEventArgs) _
Handles Products.UpdateCommand
' Handle any exceptions raised during the editing process
Try
' Read in the ProductID from the DataKeys collection
Dim productID As Integer = _
Convert.ToInt32(Products.DataKeys(e.Item.ItemIndex))
... Some code omitted for brevity ...
Catch ex As Exception
' TODO: Display information about the exception in ExceptionDetails
End Try
End Sub
Blok içindeki kod tarafından herhangi bir tür özel durumu oluştuğunda TryCatch , blok kodu yürütülür. , , DbExceptionNoNullAllowedExceptionvb. oluşan ArgumentExceptionözel durumun türü, hatanın ilk etapta tam olarak ne olduğuna bağlıdır. Veritabanı düzeyinde bir sorun varsa, bir DbException oluşturulur. "UnitPrice, UnitsInStock, UnitsOnOrder veya ReorderLevel alanları için geçersiz bir değer girilirse, bir ArgumentException oluşturulur çünkü bu alan değerlerini doğrulamak için ProductsDataTable sınıfında kod ekledik (bkz. İş Mantığı Katmanı Oluşturma öğreticisi)."
İleti metnini yakalanan özel durum türüne göre temel alarak son kullanıcıya daha yararlı bir açıklama sağlayabiliriz. Önceki ASP.NET Sayfasında BLL ve DAL-Level Özel Durumlarını İşleme öğretisinde neredeyse aynı biçimde kullanılan aşağıdaki kod, bu düzeydeki ayrıntıyı sağlar:
Private Sub DisplayExceptionDetails(ByVal ex As Exception)
' Display a user-friendly message
ExceptionDetails.Text = "There was a problem updating the product. "
If TypeOf ex Is System.Data.Common.DbException Then
ExceptionDetails.Text += "Our database is currently experiencing problems." + _
"Please try again later."
ElseIf TypeOf ex Is System.Data.NoNullAllowedException Then
ExceptionDetails.Text+="There are one or more required fields that are missing."
ElseIf TypeOf ex Is ArgumentException Then
Dim paramName As String = CType(ex, ArgumentException).ParamName
ExceptionDetails.Text+=String.Concat("The ", paramName, " value is illegal.")
ElseIf TypeOf ex Is ApplicationException Then
ExceptionDetails.Text += ex.Message
End If
End Sub
Bu öğreticiyi DisplayExceptionDetails tamamlamak için yakalanan örnekte ( ) geçen Catch bloktan Exception yöntemini çağırmanız yeterlidirex.
Try ... Catch Blok uygulandığında, Şekiller 4 ve 5 gösterildiği gibi kullanıcılara daha bilgilendirici bir hata iletisi sunulur. Bir özel durum karşısında DataList'in düzenleme modunda kaldığını unutmayın. Bunun nedeni, özel durum oluştuğunda denetim akışının datalist'i ön düzenleme durumuna döndüren kodu atlayarak hemen bloğa yeniden yönlendirilmesidir Catch .
Şekil 4: Kullanıcı Gerekli Bir Alanı Atlarsa Hata İletisi Görüntülenir (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Şekil 5: Negatif Fiyat Girilirken Hata İletisi Görüntüleniyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Özet
GridView ve ObjectDataSource, güncelleştirme ve silme iş akışı sırasında oluşturulan özel durumlar hakkında bilgi içeren son düzey olay işleyicilerinin yanı sıra özel durumun işlenip işlenmediğini gösterecek şekilde ayarlanabilen özellikler sağlar. Ancak bu özellikler DataList ile çalışırken ve BLL'yi doğrudan kullanırken kullanılamaz. Bunun yerine, özel durum işlemeyi uygulamaktan sorumluyuz.
Bu öğreticide, olay işleyicisine bir Try ... Catch blok ekleyerek düzenlenebilir bir DataList güncelleştirme iş akışına özel durum işlemenin UpdateCommand nasıl ekleneceğini gördük. Güncelleştirme iş akışı sırasında bir özel durum oluşursa blok Catch kodu yürütülür ve Etikette ExceptionDetails yararlı bilgiler görüntülenir.
Bu noktada, DataList ilk etapta özel durumların oluşmasını önlemek için hiçbir çaba harcamaz. Negatif bir fiyatın özel duruma neden olacağını bilmemize rağmen, bir kullanıcının bu tür geçersiz girişler girmesini proaktif olarak önlemek için henüz herhangi bir işlev eklemedik. Sonraki öğreticimizde, öğesine doğrulama denetimleri ekleyerek geçersiz kullanıcı girişinin neden olduğu özel durumları azaltmaya EditItemTemplatenasıl yardımcı olduğumuzu göreceğiz.
Mutlu Programlama!
Daha Fazla Bilgi
Bu öğreticide ele alınan konular hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:
- Özel Durumlar için Tasarım Yönergeleri
- Hata Günlüğü Modülleri ve İşleyicileri (ELMAH) (günlük hataları için açık kaynak kitaplığı)
- .NET Framework 2.0 için Kurumsal Kitaplık (Özel Durum Yönetimi Uygulama Bloğunu içerir)
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.
Özel Teşekkürler
Bu öğretici serisi birçok yararlı gözden geçiren tarafından gözden geçirildi. Bu öğreticinin baş gözden geçireni Ken Pespisa'ydı. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, mitchell@4GuysFromRolla.com'a bir mesaj bırakın.