Freigeben über


Verarbeiten von Ausnahmen auf BLL- und DAL-Ebene in einer ASP.NET-Seite (VB)

von Scott Mitchell

PDF herunterladen

In diesem Lernprogramm wird gezeigt, wie eine freundliche, informative Fehlermeldung angezeigt wird, wenn während eines Einfüge-, Aktualisierungs- oder Löschvorgangs eines ASP.NET Datenwebsteuerelements eine Ausnahme auftritt.

Einleitung

Das Arbeiten mit Daten aus einer ASP.NET Webanwendung mithilfe einer mehrstufigen Anwendungsarchitektur umfasst die folgenden drei allgemeinen Schritte:

  1. Bestimmen Sie, welche Methode der Geschäftslogik aufgerufen werden soll und welche Parameterwerte übergeben werden sollen. Die Parameterwerte können hartcodiert, programmgesteuert zugewiesen oder vom Benutzer eingegebene Eingaben sein.
  2. Rufen Sie die Methode auf.
  3. Verarbeiten sie die Ergebnisse. Beim Aufrufen einer BLL-Methode, die Daten zurückgibt, kann dies das Binden der Daten an ein Datenwebsteuerelement umfassen. Bei BLL-Methoden, die Daten ändern, kann dies einige Aktionen auf der Grundlage eines Rückgabewerts oder die ordnungsgemäße Behandlung einer Ausnahme umfassen, die in Schritt 2 aufgetreten ist.

Wie wir im vorherigen Lernprogramm gesehen haben, bieten sowohl objectDataSource als auch die Datenwebsteuerelemente Erweiterungspunkte für die Schritte 1 und 3. Das GridView-Objekt, beispielsweise, löst sein RowUpdating Ereignis aus, bevor es seine Feldwerte der ObjectDataSource-Auflistung UpdateParameters zuweist. Das RowUpdated Ereignis wird ausgelöst, nachdem die ObjectDataSource den Vorgang abgeschlossen hat.

Wir haben bereits die Ereignisse untersucht, die während Schritt 1 ausgelöst werden, und haben gesehen, wie sie verwendet werden können, um die Eingabeparameter anzupassen oder den Vorgang abzubrechen. In diesem Tutorial widmen wir uns den Ereignissen, die ausgelöst werden, nachdem der Vorgang abgeschlossen ist. Mit diesen Ereignishandlern auf Post-Ebene können wir unter anderem ermitteln, ob während des Vorgangs eine Ausnahme aufgetreten ist, und sie ordnungsgemäß behandeln, indem wir eine freundliche, informative Fehlermeldung auf dem Bildschirm anzeigen, anstatt die Standard-ASP.NET-Ausnahmeseite zu verwenden.

Um die Arbeit mit diesen Ereignissen auf Post-Ebene zu veranschaulichen, erstellen wir eine Seite, auf der die Produkte in einer bearbeitbaren Rasteransicht aufgelistet werden. Wenn beim Aktualisieren eines Produkts eine Ausnahme ausgelöst wird, zeigt unsere ASP.NET-Seite eine kurze Meldung oberhalb der GridView an, in der erläutert wird, dass ein Problem aufgetreten ist. Fangen wir an!

Schritt 1: Erstellen einer bearbeitbaren GridView von Produkten

Im vorherigen Lernprogramm haben wir eine bearbeitbare GridView mit nur zwei Feldern, ProductName und UnitPrice, erstellt. Dies erforderte das Erstellen einer zusätzlichen Überladung für die Methode der ProductsBLL Klasse UpdateProduct , eine, die nur drei Eingabeparameter (name, Einzelpreis und ID des Produkts) im Gegensatz zu einem Parameter für jedes Produktfeld akzeptierte. In diesem Tutorial praktizieren wir diese Technik erneut, indem wir ein bearbeitbares GridView-Steuerelement erstellen, das den Namen des Produkts, die Menge pro Einheit, den Einzelpreis und die Lagereinheiten anzeigt, aber nur den Namen, den Einzelpreis und die Lagereinheiten bearbeiten lässt.

Um dieses Szenario zu berücksichtigen, benötigen wir eine weitere Überladung der UpdateProduct-Methode, die vier Parameter akzeptiert: den Namen des Produkts, den Einzelpreis, die Lagereinheiten und die ID. Fügen Sie der ProductsBLL-Klasse die folgende Methode hinzu:

<System.ComponentModel.DataObjectMethodAttribute _
    (System.ComponentModel.DataObjectMethodType.Update, True)> _
Public Function UpdateProduct _
    (ByVal productName As String, ByVal unitPrice As Nullable(Of Decimal), _
ByVal unitsInStock As Nullable(Of Short), ByVal productID As Integer) As Boolean
    Dim products As Northwind.ProductsDataTable = _
        Adapter.GetProductByProductID(productID)
    If products.Count = 0 Then
        Return False
    End If
    Dim product As Northwind.ProductsRow = products(0)
    product.ProductName = productName
    If Not unitPrice.HasValue Then
        product.SetUnitPriceNull()
    Else
        product.UnitPrice = unitPrice.Value
    End If
    If Not unitsInStock.HasValue Then
        product.SetUnitsInStockNull()
    Else
        product.UnitsInStock = unitsInStock.Value
    End If
    Dim rowsAffected As Integer = Adapter.Update(product)
    Return rowsAffected = 1
End Function

Nachdem diese Methode abgeschlossen ist, können wir die ASP.NET Seite erstellen, die die Bearbeitung dieser vier speziellen Produktfelder ermöglicht. Öffnen Sie die ErrorHandling.aspx Seite im EditInsertDelete Ordner, und fügen Sie der Seite über den Designer eine GridView hinzu. Binden Sie die GridView an eine neue ObjectDataSource, indem Sie die Methode Select() der ProductsBLL Klasse mit der Methode GetProducts() und die Methode Update() mit der gerade erstellten Überladung UpdateProduct verbinden.

Verwenden der UpdateProduct-Methodenüberladung, die vier Eingabeparameter akzeptiert

Abbildung 1: Verwenden der Methodenüberladung, die UpdateProduct vier Eingabeparameter akzeptiert (Klicken, um das Bild in voller Größe anzuzeigen)

Dadurch wird eine ObjectDataSource mit einer UpdateParameters Auflistung mit vier Parametern und einer GridView mit einem Feld für jedes Produktfeld erstellt. Das deklarative Markup von ObjectDataSource weist der Eigenschaft OldValuesParameterFormatString den Wert original_{0} zu, was zu einer Ausnahme führt, da unsere BLL-Klasse keinen Eingabeparameter namens original_productID erwartet. Vergessen Sie nicht, diese Einstellung vollständig aus der deklarativen Syntax zu entfernen (oder auf den Standardwert festzulegen). {0}

Reduzieren Sie als Nächstes das GridView-Element, um nur die ProductName, QuantityPerUnit, UnitPrice und UnitsInStock BoundFields einzuschließen. Sie können auch beliebige Formatierungen auf Feldebene anwenden, die Sie als notwendig erahen (z. B. ändern die HeaderText Eigenschaften).

Im vorherigen Tutorial haben wir uns angesehen, wie das UnitPrice BoundField sowohl im schreibgeschützten Modus als auch im Bearbeitungsmodus als Währung dargestellt wird. Lassen Sie uns dies hier tun. Erinnern Sie sich daran, dass dies die Einstellung der Eigenschaft DataFormatString des BoundFields auf {0:c}, die Eigenschaft HtmlEncode auf false und die Eigenschaft ApplyFormatInEditMode auf true erforderte, wie in Abbildung 2 dargestellt.

Konfigurieren des

Abbildung 2: Konfigurieren des BoundField für die UnitPrice Anzeige als Währungsformat (Klicken, um das Bild in vollständiger Größe anzuzeigen)

Das Formatieren von UnitPrice als Währung in der Bearbeitungsoberfläche erfordert das Erstellen eines Ereignishandlers für das RowUpdating-Ereignis des GridView, um die währungsformatierte Zeichenfolge in einen decimal Wert zu konvertieren. Denken Sie daran, dass der RowUpdating Ereignishandler aus dem letzten Lernprogramm ebenfalls überprüft wurde, um sicherzustellen, dass der Benutzer einen UnitPrice Wert bereitgestellt hat. Lassen Sie den Benutzer für dieses Lernprogramm jedoch den Preis weglassen.

Protected Sub GridView1_RowUpdating(ByVal sender As Object, _
    ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs) _
    Handles GridView1.RowUpdating
    If e.NewValues("UnitPrice") IsNot Nothing Then
        e.NewValues("UnitPrice") = _
            Decimal.Parse(e.NewValues("UnitPrice").ToString(), _
            System.Globalization.NumberStyles.Currency)
    End If

Unsere GridView enthält ein QuantityPerUnit BoundField, dieses BoundField sollte jedoch nur für Anzeigezwecke verwendet werden und nicht vom Benutzer bearbeitet werden können. Um dies anzuordnen, legen Sie einfach die BoundFields-Eigenschaft ReadOnly auf true.

Das QuantityPerUnit BoundField-Element auf schreibgeschützt setzen

Abbildung 3: Festlegen des QuantityPerUnit BoundField-Read-Only (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Aktivieren Sie schließlich das Kontrollkästchen "Bearbeitung aktivieren" aus dem Smarttag von GridView. Nach Abschluss dieser Schritte sollte der Designer der ErrorHandling.aspx Seite ähnlich aussehen wie in Abbildung 4.

Entfernen Sie alle überflüssigen BoundFields und aktivieren Sie das Kontrollkästchen

Abbildung 4: Entfernen aller Außer erforderlichen BoundFields und Aktivieren des Kontrollkästchens "Bearbeitung aktivieren" (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

An diesem Punkt haben wir eine Liste aller Produkte, ProductName, QuantityPerUnit, UnitPrice und UnitsInStock Felder; aber nur die ProductName-, UnitPrice- und UnitsInStock-Felder können bearbeitet werden.

Benutzer können jetzt ganz einfach die Namen, Preise und Einheiten von Produkten in Lagerfeldern bearbeiten.

Abbildung 5: Benutzer können jetzt ganz einfach die Namen, Preise und Einheiten in Lagerfeldern bearbeiten (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Schritt 2: Souveräne Behandlung von DAL-Level-Ausnahmen

Während unser editierbares GridView wunderbar funktioniert, wenn Benutzer gültige Werte für den Namen, den Preis und die Stückzahl des bearbeiteten Produkts eingeben, führt die Eingabe unzulässiger Werte zu einer Ausnahme. Wenn der ProductName Wert beispielsweise weggelassen wird, wird eine NoNullAllowedException ausgelöst, da die ProductName Eigenschaft in der ProductsRow Klasse auf ihre AllowDBNull Eigenschaft auf false festgelegt ist; wenn die Datenbank ausgefallen ist, wird eine Ausnahme vom TableAdapter ausgelöst, wenn versucht wird, eine Verbindung zur Datenbank herzustellen. Ohne weiteres Zutun steigen diese Ausnahmen von der Datenzugriffsebene zur Geschäftslogikebene, dann zur ASP.NET-Seite und schließlich zur ASP.NET-Laufzeitumgebung auf.

Je nachdem, wie Ihre Webanwendung konfiguriert ist und ob Sie die Anwendung von localhost besuchen oder nicht, kann eine unbehandelte Ausnahme entweder zu einer generischen Serverfehlerseite, einem detaillierten Fehlerbericht oder einer benutzerfreundlichen Webseite führen. Weitere Informationen darüber, wie die ASP.NET-Laufzeit auf eine nicht abgefangene Ausnahme reagiert, finden Sie unter "Webanwendungsfehlerbehandlung in ASP.NET" und im customErrors-Element.

Abbildung 6 zeigt den Bildschirm, der erscheint, wenn versucht wird, ein Produkt zu aktualisieren, ohne den Wert ProductName anzugeben. Dies ist der standardmäßige detaillierte Fehlerbericht, der beim Durchlauf von localhost angezeigt wird.

Wenn der Name des Produkts weggelassen wird, werden Ausnahmedetails angezeigt.

Abbildung 6: Auslassen des Produktnamens zeigt Ausnahmedetails an (Klicken, um das Bild in voller Größe anzuzeigen)

Während solche Ausnahmedetails beim Testen einer Anwendung hilfreich sind, ist es weniger ideal, einem Endbenutzer bei einer Ausnahme einen solchen Bildschirm zu präsentieren. Ein Endbenutzer weiß wahrscheinlich nicht, was ein NoNullAllowedException ist oder warum es verursacht wurde. Ein besserer Ansatz besteht darin, dem Benutzer eine benutzerfreundlichere Meldung zu präsentieren, in der erläutert wird, dass probleme beim Aktualisieren des Produkts aufgetreten sind.

Wenn beim Ausführen des Vorgangs eine Ausnahme auftritt, bieten die Ereignisse auf der Post-Ebene sowohl in der ObjectDataSource als auch im Daten-Websteuerelement eine Möglichkeit, sie zu erkennen und die Ausnahme daran zu hindern, bis zur ASP.NET-Laufzeit weiter verarbeitet zu werden. In unserem Beispiel erstellen wir einen Ereignishandler für das GridView-Ereignis RowUpdated, der bestimmt, ob eine Ausnahme ausgelöst wurde und falls dies der Fall ist, die Ausnahmedetails in einem Label-Websteuerelement anzeigt.

Fügen Sie zunächst der ASP.NET-Seite ein Label hinzu, setzen Sie dessen ID-Eigenschaft auf ExceptionDetails, und löschen Sie die Text-Eigenschaft. Um die Aufmerksamkeit des Benutzers auf diese Nachricht zu ziehen, legen Sie dessen CssClass-Eigenschaft auf Warning fest, eine CSS-Klasse, die wir der Styles.css-Datei im vorherigen Tutorial hinzugefügt haben. Denken Sie daran, dass diese CSS-Klasse bewirkt, dass der Text der Bezeichnung in einer roten, kursiven, fett formatierten, extra großen Schriftart angezeigt wird.

Hinzufügen eines Bezeichnungswebsteuerelements zur Seite

Abbildung 7: Hinzufügen eines Bezeichnungswebsteuerelements zur Seite (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Da dieses Bezeichnungswebsteuerelement nur unmittelbar angezeigt werden soll, nachdem eine Ausnahme aufgetreten ist, legen Sie die Visible Eigenschaft im Page_Load Ereignishandler auf "false" fest:

Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    ExceptionDetails.Visible = False
End Sub

Mit diesem Code wird beim ersten Seitenbesuch und den darauf folgenden Postbacks das ExceptionDetails-Steuerelement so eingestellt, dass seine Visible-Eigenschaft auf false gesetzt ist. Angesichts einer Ausnahme auf DAL- oder BLL-Ebene, die wir im RowUpdated-Ereignishandler des GridView erkennen können, legen wir die Eigenschaft des ExceptionDetails-Steuerelements Visible auf "true" fest. Da die Ereignishandler für Websteuerelemente im Seitenlebenszyklus nach dem Page_Load-Ereignishandler auftreten, wird das Label angezeigt. Beim nächsten Postback wird der Ereignishandler jedoch die Eigenschaft Page_Load auf Visible zurücksetzen, um sie wieder aus der Ansicht zu verbergen.

Hinweis

Alternativ könnten wir die Notwendigkeit zum Festlegen der ExceptionDetails Eigenschaft des Visible Steuerelements aufheben, indem wir seine Page_Load Eigenschaft Visible im deklarativen Syntax zuweisen und den Ansichtszustand deaktivieren (seine false Eigenschaft auf EnableViewState festlegen). Wir verwenden diesen alternativen Ansatz in einem zukünftigen Lernprogramm.

Nachdem das Bezeichnungssteuerelement hinzugefügt wurde, besteht der nächste Schritt darin, den Ereignishandler für das GridView-Ereignis RowUpdated zu erstellen. Wählen Sie im Designer die GridView aus, wechseln Sie zum Eigenschaftenfenster, und klicken Sie auf das Blitzsymbol, und zeigen Sie die Ereignisse von GridView auf. Es sollte bereits ein Eintrag für das GridView-Ereignis RowUpdating vorhanden sein, da wir zuvor in diesem Lernprogramm einen Ereignishandler für dieses Ereignis erstellt haben. Erstellen Sie auch einen Ereignishandler für das RowUpdated Ereignis.

Erstellen eines Ereignishandlers für das RowUpdated-Ereignis von GridView

Abbildung 8: Erstellen eines Ereignishandlers RowUpdated für das GridView-Ereignis

Hinweis

Sie können den Ereignishandler auch über die Dropdownlisten oben in der CodeBehind-Klassendatei erstellen. Wählen Sie das GridView in der Dropdown-Liste auf der linken Seite und das RowUpdated Ereignis in der Dropdown-Liste auf der rechten Seite aus.

Beim Erstellen dieses Ereignishandlers wird der Code der CodeBehind-Klasse der ASP.NET-Seite hinzugefügt.

Protected Sub GridView1_RowUpdated(ByVal sender As Object, _
    ByVal e As System.Web.UI.WebControls.GridViewUpdatedEventArgs) _
    Handles GridView1.RowUpdated
End Sub

Der zweite Eingabeparameter dieses Ereignishandlers ist ein Objekt vom Typ GridViewUpdatedEventArgs, das drei interessante Eigenschaften für die Behandlung von Ausnahmen aufweist:

  • Exception ein Verweis auf die ausgelöste Ausnahme; wenn keine Ausnahme ausgelöst wurde, hat diese Eigenschaft einen Wert von null
  • ExceptionHandled ein boolescher Wert, der angibt, ob die Ausnahme im RowUpdated Ereignishandler behandelt wurde. Wenn false (Standard), wird die Ausnahme erneut ausgelöst, sodass sie bis zur ASP.NET Laufzeit erfasst wird.
  • KeepInEditMode wenn sie auf true konfiguriert ist, bleibt die bearbeitete GridView-Zeile im Bearbeitungsmodus; wenn auf false (Standard) eingestellt, wird die GridView-Zeile wieder in den Lesemodus zurückgesetzt.

Unser Code sollte dann überprüfen, ob Exception nicht null ist, was bedeutet, dass während des Vorgangs eine Ausnahme ausgelöst wurde. Wenn dies der Fall ist, möchten wir:

  • Anzeigen einer benutzerfreundlichen Nachricht in der ExceptionDetails Bezeichnung
  • Angeben, dass die Ausnahme behandelt wurde
  • Beibehalten der GridView-Zeile im Bearbeitungsmodus

Dieser folgende Code erfüllt diese Ziele:

Protected Sub GridView1_RowUpdated(ByVal sender As Object, _
    ByVal e As System.Web.UI.WebControls.GridViewUpdatedEventArgs) _
    Handles GridView1.RowUpdated
    If e.Exception IsNot Nothing Then
        ExceptionDetails.Visible = True
        ExceptionDetails.Text = "There was a problem updating the product. "
        If e.Exception.InnerException IsNot Nothing Then
            Dim inner As Exception = e.Exception.InnerException
            If TypeOf inner Is System.Data.Common.DbException Then
                ExceptionDetails.Text &= _
                "Our database is currently experiencing problems." & _
                "Please try again later."
            ElseIf TypeOf inner _
             Is System.Data.NoNullAllowedException Then
                ExceptionDetails.Text += _
                    "There are one or more required fields that are missing."
            ElseIf TypeOf inner Is ArgumentException Then
                Dim paramName As String = CType(inner, ArgumentException).ParamName
                ExceptionDetails.Text &= _
                    String.Concat("The ", paramName, " value is illegal.")
            ElseIf TypeOf inner Is ApplicationException Then
                ExceptionDetails.Text += inner.Message
            End If
        End If
        e.ExceptionHandled = True
        e.KeepInEditMode = True
    End If
End Sub

Dieser Ereignishandler beginnt mit der Überprüfung, ob e.Exceptionnull ist. Wenn nicht, wird die Eigenschaft ExceptionDetails des Visible Labels auf true gesetzt und die Eigenschaft Text auf "Es gab ein Problem beim Aktualisieren des Produkts." festgelegt. Die Details der tatsächlichen Ausnahme, die ausgelöst wurde, befinden sich in der Eigenschaft e.Exception des InnerException Objekts. Diese innere Ausnahme wird untersucht und, wenn sie einen bestimmten Typ hat, wird eine zusätzliche, hilfreiche Nachricht an die Eigenschaft der ExceptionDetails Beschriftung Text angefügt. Schließlich werden sowohl die Eigenschaften ExceptionHandled als auch KeepInEditMode auf true gesetzt.

Abbildung 9 zeigt einen Screenshot dieser Seite, wenn der Name des Produkts weggelassen wird; Abbildung 10 zeigt die Ergebnisse beim Eingeben eines unzulässigen UnitPrice Werts (-50).

Das

Abbildung 9: Das ProductName BoundField muss einen Wert enthalten (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Negative Einzelpreiswerte sind nicht zulässig.

Abbildung 10: Negative UnitPrice Werte sind nicht zulässig (Klicken Sie, um das Bild in voller Größe anzuzeigen)

Durch das Festlegen der e.ExceptionHandled-Eigenschaft auf true hat der RowUpdated-Ereignishandler angegeben, dass er die Ausnahme behandelt hat. Daher wird die Ausnahme nicht bis zur ASP.NET Laufzeit weitergegeben.

Hinweis

Abbildung 9 und 10 zeigen eine ordnungsgemäße Möglichkeit zur Behandlung von Ausnahmen, die aufgrund ungültiger Benutzereingaben ausgelöst wurden. Im Idealfall erreicht diese ungültige Eingabe jedoch nie die Geschäftslogikebene an erster Stelle, da die ASP.NET Seite sicherstellen sollte, dass die Eingaben des Benutzers gültig sind, bevor die Methode der ProductsBLL Klasse UpdateProduct aufzurufen. Im nächsten Lernprogramm erfahren Sie, wie Sie der Bearbeitung und dem Einfügen von Schnittstellen Validierungssteuerelemente hinzufügen, um sicherzustellen, dass die an die Geschäftslogikebene übermittelten Daten den Geschäftsregeln entsprechen. Die Überprüfungssteuerelemente verhindern nicht nur den Aufruf der UpdateProduct Methode, bis die vom Benutzer bereitgestellten Daten gültig sind, sondern bieten auch eine informativere Benutzeroberfläche zum Identifizieren von Dateneingabeproblemen.

Schritt 3: Ordnungsgemäße Behandlung von BLL-Level Ausnahmen

Beim Einfügen, Aktualisieren oder Löschen von Daten löst die Datenzugriffsschicht möglicherweise eine Ausnahme aufgrund eines datenbezogenen Fehlers aus. Die Datenbank ist möglicherweise offline, eine erforderliche Datenbanktabellenspalte hatte möglicherweise keinen angegebenen Wert, oder eine Einschränkung auf Tabellenebene wurde verletzt. Zusätzlich zu streng datenbezogenen Ausnahmen kann die Geschäftslogikebene Ausnahmen verwenden, um anzugeben, wann Geschäftsregeln verletzt wurden. Im Lernprogramm Erstellung einer Geschäftslogikebene haben wir zum Beispiel eine Geschäftsregelüberprüfung zur ursprünglichen UpdateProduct Überladung hinzugefügt. Insbesondere, wenn der Benutzer ein Produkt als eingestellt markiert, verlangen wir, dass das Produkt nicht das einzige ist, das von seinem Lieferanten bereitgestellt wird. Wenn diese Bedingung verletzt wurde, wurde ein ApplicationException ausgelöst.

Für die UpdateProduct Überladung, die in diesem Lernprogramm erstellt wurde, fügen wir eine Geschäftsregel hinzu, die verhindert, dass das UnitPrice-Feld auf einen neuen Wert festgelegt wird, der mehr als das Doppelte des ursprünglichen UnitPrice-Wertes ist. Um dies zu erreichen, passen Sie die UpdateProduct Überladung so an, dass sie diese Prüfung durchführt und eine ApplicationException wirft, wenn die Regel verletzt wird. Die aktualisierte Methode folgt:

<System.ComponentModel.DataObjectMethodAttribute _
    (System.ComponentModel.DataObjectMethodType.Update, True)> _
    Public Function UpdateProduct(ByVal productName As String, _
    ByVal unitPrice As Nullable(Of Decimal), ByVal unitsInStock As Nullable(Of Short), _
    ByVal productID As Integer) As Boolean
    Dim products As Northwind.ProductsDataTable = Adapter.GetProductByProductID(productID)
    If products.Count = 0 Then
        Return False
    End If
    Dim product As Northwind.ProductsRow = products(0)
    If unitPrice.HasValue AndAlso Not product.IsUnitPriceNull() Then
        If unitPrice > product.UnitPrice * 2 Then
            Throw New ApplicationException( _
                "When updating a product price," & _
                " the new price cannot exceed twice the original price.")
        End If
    End If
    product.ProductName = productName
    If Not unitPrice.HasValue Then
        product.SetUnitPriceNull()
    Else
        product.UnitPrice = unitPrice.Value
    End If
    If Not unitsInStock.HasValue Then
        product.SetUnitsInStockNull()
    Else
        product.UnitsInStock = unitsInStock.Value
    End If
    Dim rowsAffected As Integer = Adapter.Update(product)
    Return rowsAffected = 1
End Function

Bei dieser Änderung wird ein ApplicationException ausgelöst, wenn jedes Preisupdate mehr als doppelt so groß ist wie der bestehende Preis. Genau wie die ausnahme, die vom DAL ausgelöst wurde, kann diese BLL-Ausgelöste ApplicationException erkannt und im GridView-Ereignishandler RowUpdated behandelt werden. Tatsächlich wird der Code des RowUpdated-Ereignishandlers, wie verfasst, diese Ausnahme korrekt erkennen und den Wert der ApplicationException-Eigenschaft von Message anzeigen. Abbildung 11 zeigt einen Screenshot, wenn ein Benutzer versucht, den Preis von Chai auf 50,00 $ zu aktualisieren, was mehr als doppelt sein aktueller Preis von 19,95 $ ist.

Die Geschäftsregeln verbieten Preiserhöhungen, die mehr als den doppelten Preis eines Produkts betragen

Abbildung 11: Die Geschäftsregeln verbieten Preiserhöhungen, die mehr als den doppelten Preis eines Produkts erhöhen (Klicken Sie, um das Bild in voller Größe zu sehen)

Hinweis

Idealerweise würden unsere Regeln der Geschäftslogik aus den UpdateProduct Methodenüberladungen herausgelöst und in eine gemeinsame Methode überführt oder refaktoriert. Dies ist eine Aufgabe für den Leser.

Zusammenfassung

Während des Einfügens, Aktualisierens und Löschens bei Vorgängen lösen sowohl das Daten-Websteuerelement als auch die ObjectDataSource prä- und post-Operationsevents aus, die den tatsächlichen Vorgang umrahmen. Wie wir in diesem Lernprogramm und dem vorherigen gesehen haben, wird beim Arbeiten mit einem bearbeitbaren GridView-Ereignis das GridView-Ereignis RowUpdating ausgelöst, gefolgt von dem ObjectDataSource-Ereignis Updating , an dem der Aktualisierungsbefehl an das zugrunde liegende Objekt von ObjectDataSource vorgenommen wird. Nachdem der Vorgang abgeschlossen ist, wird das ObjectDataSource-Ereignis ausgelöst, danach das GridView-Ereignis Updated.

Wir können Ereignishandler für die Ereignisse vor der Ebene erstellen, um die Eingabeparameter oder die Ereignisse nach der Ebene anzupassen, um die Ergebnisse des Vorgangs zu prüfen und darauf zu reagieren. Post-Level Ereignishandler werden typischerweise verwendet, um zu erkennen, ob während des Vorgangs eine Ausnahme aufgetreten ist. Angesichts einer Ausnahme können diese Ereignishandler auf der jeweiligen Ebene optional die Ausnahme eigenständig behandeln. In diesem Lernprogramm haben wir gesehen, wie wir eine solche Ausnahme behandeln, indem eine freundliche Fehlermeldung angezeigt wird.

Im nächsten Tutorial werden wir sehen, wie die Wahrscheinlichkeit von Fehlern/Exceptions verringert wird, die sich aus Datenformatierungsproblemen ergeben (z. B. das Eingeben eines negativen Werts UnitPrice). Genauer gesagt, erfahren Sie, wie Sie den Bearbeitungs- und Einfügeschnittstellen Überprüfungssteuerelemente hinzufügen.

Glückliche Programmierung!

Zum Autor

Scott Mitchell, Autor von sieben ASP/ASP.NET Büchern und Gründer von 4GuysFromRolla.com, arbeitet seit 1998 mit Microsoft Web Technologies zusammen. Scott arbeitet als unabhängiger Berater, Trainer und Schriftsteller. Sein neuestes Buch ist Sams Teach Yourself ASP.NET 2.0 in 24 Stunden. Er kann bei mitchell@4GuysFromRolla.comerreicht werden.

Besonderer Dank an

Diese Lernprogrammreihe wurde von vielen hilfreichen Prüfern überprüft. Leitender Prüfer für dieses Lernprogramm war Liz Shulok. Möchten Sie meine bevorstehenden MSDN-Artikel überprüfen? Wenn ja, schicken Sie mir eine Nachricht an mitchell@4GuysFromRolla.com.