BLL ve DAL Düzeyi Özel Durumları İşleme (C#)

tarafından Scott Mitchell

PDF’yi İndir

Bu öğreticide, düzenlenebilir bir DataList'in güncelleştirme iş akışı sırasında ortaya konan ö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 pek 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 girildiğinde bir özel durum oluşturulur. 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 derinliğinden bir özel durum oluşursa, özel durum ayrıntıları ObjectDataSource'a ve sonra GridView'a döndürülür. ObjectDataSource veya GridView için olay işleyicileri oluşturarak Updated , RowUpdated özel durumu denetleyerek ve ardından özel durumun işlendiğini belirterek bu özel durumları düzgün bir şekilde işlemeyi gördük.

Ancak DataList öğreticilerimiz, verileri güncelleştirmek ve silmek için ObjectDataSource'u kullanmaz. 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üzenlemeye ve Silmeye Genel Bakış öğreticisinde DataList'ten verileri düzenleme ve silmeye yönelik farklı teknikleri ele aldık. Güncelleştirme ve silme için ObjectDataSource kullanan bazı teknikler. Bu teknikleri uygularsanız, ObjectDataSource veya olay işleyicileri aracılığıyla BLL veya Deleted DAL'den Updated özel durumları 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ım Aracı bir DataList ekleyin, özelliğini olarak Productsayarlayın ID ve adlı ProductsDataSourceyeni bir ObjectDataSource ekleyin. ObjectDataSource'u GetProducts() kayıtları seçmek için sınıfının yöntemini kullanacak ProductsBLL şekilde yapılandırın; INSERT, UPDATE ve DELETE sekmelerindeki açılan listeleri (Yok) olarak ayarlayın.

GetProducts() Yöntemini Kullanarak Ürün Bilgilerini Döndürme

Ş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 ile ItemTemplate değiştirin. Ardından ad ve fiyat ile Güncelleştir ve İptal düğmeleri için TextBox Web denetimi içeren bir EditItemTemplate oluşturun. Son olarak DataList özelliğini RepeatColumns 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).

Her Ürün bir Düzenle Düğmesi içerir

Şekil 2: Her Ürün Bir Düzenle Düğmesi içerir (Tam boyutlu resmi 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ı, DataList özelliğini EditItemIndex güncelleştirmeniz ve verileri DataList'e yeniden bağlamanız yeterlidir:

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

Olay UpdateCommand işleyicisi biraz daha karmaşıktır. DataList'i ön düzenleme durumuna döndürmeden önce koleksiyondaki DataKeys düzenlenmiş ürünlerdeProductID, textBoxes EditItemTemplateiçindeki ürün adı ve fiyatıyla birlikte okuması ve ardından sınıfın UpdateProduct yöntemini çağırması ProductsBLL gerekir.

Şimdilik DataList öğreticisindeki Verileri Düzenlemeye ve Silmeye Genel Bakış öğreticisindeki olay işleyicisinden tam olarak aynı kodu UpdateCommand kullanalım. 2. adımda özel durumları düzgün bir şekilde işlemek için kodu ekleyeceğiz.

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

Hatalı biçimlendirilmiş birim fiyat, -$5,00 gibi geçersiz birim fiyat değeri veya ürün adının atlanması gibi geçersiz girişler karşısında bir özel durum ortaya çıkar. Olay işleyicisi UpdateCommand bu noktada ö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).

İşlenmeyen Bir Özel Durum Oluştuğunda, Son Kullanıcı Bir Hata Sayfası Görür

Şekil 3: İşlenmeyen Bir Özel Durum Oluştuğunda, Son Kullanıcı Bir Hata Sayfası Görür

2. Adım: UpdateCommand Olay İşleyicisinde Ö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 değeri negatifse DAL bir özel durum oluşturur.

Bir özel durum oluştuğunda, sayfanın içinde bilgilendirici bir ileti görüntülemek isteriz. olarak ayarlanmış ExceptionDetailsolan sayfaya ID bir Etiket Web denetimi ekleyin. Etiket metnini, özelliğini Warning dosyada tanımlanan CSS sınıfına atayarak CssClass kırmızı, çok büyük, kalın ve italik yazı tipiyle Styles.css görüntülenecek şekilde yapılandırın.

Hata oluştuğunda Etiketin yalnızca bir kez görüntülenmesini isteriz. Yani, sonraki geri göndermelerde Etiket uyarı iletisinin kaybolması gerekir. Bu, olay işleyicisinde Label özelliğini Text temizleyerek veya özelliğini False olarak ayarlayarak Visible (bir ASP.NET Sayfasında İşleme BLL ve DAL-Level Özel Durumlar öğreticisinde yaptığımız gibi) veya Etiket görünüm durumu desteğini devre dışı bırakarak gerçekleştirilebilir.Page_Load İ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 Text özelliğine ExceptionDetails atarız. Görünüm durumu devre dışı bırakıldığından, sonraki geri göndermelerde özelliğin Text programlı değişiklikleri kaybolacak ve varsayılan metne (boş bir dize) geri dönerek uyarı iletisi gizlenecektir.

Sayfada yararlı bir ileti görüntülemek için bir hatanın ne zaman tetiklendiğini belirlemek için olay işleyicisine UpdateCommand bir Try ... Catch 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 Try ... Catch için .NET Framework belgelerindeki Özel Durum İşleme temelleri bölümüne bakın.

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

Blok içindeki kod tarafından herhangi bir tür özel durumu oluştuğunda TryCatch , blok kodu yürütülür. , , NoNullAllowedExceptionArgumentExceptionvb. oluşan DbExceptionözel durumun türü, hatayı ilk etapta tam olarak neyin çökelttiklerine bağlıdır. Veritabanı düzeyinde bir sorun varsa, bir DbException oluşturulur. , , UnitsInStockUnitsOnOrderveya ReorderLevel alanları için geçersiz bir değer girilirse, sınıfındaki UnitPriceProductsDataTable bu alan değerlerini doğrulamak için kod eklediğimiz için bir ArgumentException oluşturulur (bkz. İş Mantığı Katmanı Oluşturma öğreticisi).

İleti metnini yakalanan özel durum türüne dayandırarak son kullanıcıya daha yararlı bir açıklama sağlayabiliriz. bir ASP.NET Sayfasında BLL- ve DAL-Level Özel Durumlarını İşleme öğreticisinde neredeyse aynı biçimde kullanılan aşağıdaki kod bu ayrıntı düzeyini sağlar:

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

Bu öğreticiyi DisplayExceptionDetails tamamlamak için yakalanan Exception örnekte () geçen bloktan Catch 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 gösterilir. 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 düzenleme öncesi durumuna döndüren kodu atlayarak hemen bloğa yeniden yönlendirilmesidir Catch .

Kullanıcı Gerekli Bir Alanı Atlarsa Hata İletisi Görüntülenir

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

Negatif Fiyat Girilirken Hata İletisi Görüntüleniyor

Ş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, iş akışını güncelleştirme ve silme 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 uygulamak bizim sorumluluğumuz.

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, Catch blok 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 bir özel durumla sonuçlandığı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:

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ışmaktadır. Son kitabı Sams Teach Yourself ASP.NET 24 Hours 2.0'dır. Adresine adresinden veya adresinden ulaşabileceğiniz http://ScottOnWriting.NETblogu aracılığıyla ulaşabilirsinizmitchell@4GuysFromRolla.com.

Ö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, bana bir satır mitchell@4GuysFromRolla.combırakın.