Share via


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

von Scott Mitchell

PDF herunterladen

In diesem Tutorial erfahren Sie, wie Sie eine benutzerfreundliche, informative Fehlermeldung anzeigen, falls während eines Einfüge-, Update- oder Löschvorgangs eines ASP.NET Datenwebsteuerelements eine Ausnahme auftritt.

Einführung

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

  1. Bestimmen Sie, welche Methode der Geschäftslogikebene aufgerufen werden muss und welche Parameterwerte sie ü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 die Bindung der Daten an ein Datenwebsteuerelement beinhalten. Bei BLL-Methoden, die Daten ändern, kann dies das Ausführen einer Aktion auf Der Grundlage eines Rückgabewerts oder die ordnungsgemäße Behandlung von Ausnahmen, die in Schritt 2 aufgetreten sind, umfassen.

Wie im vorherigen Tutorial gezeigt, stellen sowohl die ObjectDataSource- als auch die Datenwebsteuerelemente Erweiterbarkeitspunkte für die Schritte 1 und 3 bereit. GridView löst beispielsweise sein RowUpdating Ereignis aus, bevor die Feldwerte der ObjectDataSource-Auflistung UpdateParameters zugewiesen werden. Das RowUpdated Ereignis wird ausgelöst, nachdem objectDataSource den Vorgang abgeschlossen hat.

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

Um die Arbeit mit diesen Post-Level-Ereignissen zu veranschaulichen, erstellen wir eine Seite, auf der die Produkte in einer bearbeitbaren GridView aufgeführt sind. Wenn beim Aktualisieren eines Produkts eine Ausnahme ausgelöst wird, wird auf der Seite ASP.NET eine kurze Meldung über der GridView angezeigt, in der erläutert wird, dass ein Problem aufgetreten ist. Jetzt geht‘s los!

Schritt 1: Erstellen eines bearbeitbaren GridView of Products

Im vorherigen Tutorial haben wir eine bearbeitbare GridView mit nur zwei Feldern ProductName und UnitPriceerstellt. Dies erforderte das Erstellen einer zusätzlichen Überladung für die Methode der ProductsBLL Klasse UpdateProduct , die nur drei Eingabeparameter (Produktname, Stückpreis und ID) akzeptierte, im Gegensatz zu einem Parameter für jedes Produktfeld. In diesem Tutorial üben wir diese Technik erneut, indem sie eine bearbeitbare GridView erstellen, die den Namen, die Menge pro Einheit, den Stückpreis und die auf Lager verfügbaren Einheiten des Produkts anzeigt, aber nur den Namen, den Einzelpreis und die vorrätigen Einheiten bearbeiten lässt.

Für dieses Szenario benötigen wir eine weitere Überladung der Methode, die UpdateProduct vier Parameter akzeptiert: Name des Produkts, Stückpreis, Lagereinheiten und 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

Wenn diese Methode abgeschlossen ist, können Sie die ASP.NET Seite erstellen, die das Bearbeiten dieser vier bestimmten Produktfelder ermöglicht. Öffnen Sie die ErrorHandling.aspx Seite im EditInsertDelete Ordner, und fügen Sie der Seite über die Designer eine GridView hinzu. Binden Sie gridView an eine neue ObjectDataSource, und zuordnen Sie die Select() -Methode der -Methode der ProductsBLL -Klasse GetProducts() und die Update() -Methode der UpdateProduct gerade erstellten Überladung.

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

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

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

Analysieren Sie als Nächstes gridView so, dass nur die ProductName, , UnitPriceQuantityPerUnitund UnitsInStock BoundFields enthalten sind. Sie können auch alle Formatierungen auf Feldebene anwenden, die Sie für notwendig erahen (z. B. das Ändern der HeaderText Eigenschaften).

Im vorherigen Tutorial haben wir uns mit dem Formatieren von UnitPrice BoundField als Währung sowohl im schreibgeschützten Modus als auch im Bearbeitungsmodus befasst. Gehen wir hier genauso vor. Beachten Sie, dass hierfür die Eigenschaft von DataFormatString BoundField auf {0:c}, seine HtmlEncode Eigenschaft auf falseund auf ApplyFormatInEditModetruefestgelegt werden musste, wie in Abbildung 2 dargestellt.

Konfigurieren des UnitPrice BoundField-Werts für die Anzeige als Währung

Abbildung 2: Konfigurieren des UnitPrice BoundField-Werts für die Anzeige als Währung (Klicken Sie hier, um das bild in voller Größe anzuzeigen)

Das Formatieren von UnitPrice als Währung in der Bearbeitungsschnittstelle erfordert das Erstellen eines Ereignishandlers RowUpdating für das GridView-Ereignis, das die währungsformatierte Zeichenfolge in einen decimal Wert analysiert. Denken Sie daran, dass der RowUpdating Ereignishandler aus dem letzten Tutorial ebenfalls überprüft hat, um sicherzustellen, dass der Benutzer einen UnitPrice Wert bereitgestellt hat. In diesem Tutorial erlauben wir dem Benutzer jedoch, den Preis wegzulassen.

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, aber dieses BoundField sollte nur zu Anzeigezwecken sein und sollte vom Benutzer nicht bearbeitbar sein. Um dies anzuordnen, legen Sie einfach die BoundFields-Eigenschaft ReadOnly auf fest true.

QuantityPerUnit BoundField schreibgeschützt

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

Aktivieren Sie abschließend das Kontrollkästchen Bearbeitung aktivieren über das Smarttag von GridView. Nach Abschluss dieser Schritte sollte die ErrorHandling.aspx Designer der Seite ähnlich wie Abbildung 4 aussehen.

Entfernen Sie alle außer den erforderlichen BoundFields, und aktivieren Sie das Kontrollkästchen Bearbeitung aktivieren.

Abbildung 4: Entfernen Sie alle außer den erforderlichen BoundFields, und aktivieren Sie das Kontrollkästchen Bearbeitung aktivieren (Klicken Sie hier, um das bild in voller Größe anzuzeigen)

An diesem Punkt verfügen wir über eine Liste aller Felder der Produkte ProductName, QuantityPerUnit, UnitPriceund UnitsInStock . Allerdings können nur die ProductNameFelder , UnitPriceund UnitsInStock bearbeitet werden.

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

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

Schritt 2: Ordnungsgemäße Behandlung DAL-Level Ausnahmen

Während unser bearbeitbares GridView wunderbar funktioniert, wenn Benutzer rechtliche Werte für den Namen, den Preis und die Einheiten des bearbeiteten Produkts auf Lager eingeben, führt die Eingabe illegaler Werte zu einer Ausnahme. Wenn Sie z. B. den ProductName Wert weglassen, wird eine NoNullAllowedException ausgelöst, da die ProductName Eigenschaft in der ProductsRow Klasse AllowDBNull auf falsefestgelegt ist. Wenn die Datenbank ausgefallen ist, wird vom TableAdapter beim Versuch, eine Verbindung mit der Datenbank herzustellen, ausgelöst SqlException . Ohne Maßnahmen zu ergreifen, werden diese Ausnahmen von der Datenzugriffsebene zur Geschäftslogikebene, dann zur seite ASP.NET und schließlich zur ASP.NET Runtime weitergeleitet.

Je nachdem, wie Ihre Webanwendung konfiguriert ist und ob Sie die Anwendung von aus localhostaufrufen oder nicht, kann eine nicht behandelte Ausnahme entweder zu einer generischen Serverfehlerseite, einem detaillierten Fehlerbericht oder einer benutzerfreundlichen Webseite führen. Weitere Informationen dazu, wie die ASP.NET Runtime auf eine nicht ausgeführte Ausnahme reagiert, finden Sie unter Webanwendungsfehlerbehandlung in ASP.NET und dem customErrors-Element .

Abbildung 6 zeigt den Bildschirm beim Versuch, ein Produkt ohne Angabe des ProductName Werts zu aktualisieren. Dies ist der standardmäßige detaillierte Fehlerbericht, der beim Durchlaufen localhostangezeigt wird.

Beim Weglassen des Produktnamens werden Ausnahmedetails angezeigt.

Abbildung 6: Weglassen des Produktnamens werden Ausnahmedetails angezeigt (Klicken, um das bild in voller Größe anzuzeigen)

Während solche Ausnahmedetails beim Testen einer Anwendung hilfreich sind, ist die Darstellung eines solchen Bildschirms für einen Endbenutzer angesichts einer Ausnahme weniger als ideal. Ein Endbenutzer weiß wahrscheinlich nicht, was ein NoNullAllowedException ist und warum es verursacht wurde. Ein besserer Ansatz besteht darin, dem Benutzer eine benutzerfreundlichere Nachricht zu präsentieren, in der erklärt wird, dass probleme beim Versuch aufgetreten sind, das Produkt zu aktualisieren.

Wenn beim Ausführen des Vorgangs eine Ausnahme auftritt, bieten die Post-Level-Ereignisse sowohl im ObjectDataSource- als auch im Datenwebsteuerelement eine Möglichkeit, sie zu erkennen und die Ausnahme vom Sprudeln auf die ASP.NET Runtime abzubrechen. In unserem Beispiel erstellen wir einen Ereignishandler für das GridView-Ereignis RowUpdated , der bestimmt, ob eine Ausnahme ausgelöst wurde, und wenn ja, die Ausnahmedetails in einem Label-Websteuerelement anzeigt.

Fügen Sie zunächst eine Bezeichnung zur seite ASP.NET hinzu, legen Sie die ID -Eigenschaft auf ExceptionDetails fest und löschen Sie die Text -Eigenschaft. Um den Blick des Benutzers auf diese Nachricht zu lenken, legen Sie seine CssClass Eigenschaft auf Warningfest, die eine CSS-Klasse ist, die wir der Styles.css Datei im vorherigen Tutorial hinzugefügt haben. Denken Sie daran, dass diese CSS-Klasse dazu führt, dass der Text des Labels in einer roten, kursiven, fetten und extra großen Schriftart angezeigt wird.

Hinzufügen eines Label-Websteuerelements zur Seite

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

Da dieses Label-Websteuerelement nur unmittelbar sichtbar sein soll, nachdem eine Ausnahme aufgetreten ist, legen Sie seine 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 für das Steuerelement auf der ersten Seite der Besuchs- und nachfolgenden Postbacks seine ExceptionDetailsVisible -Eigenschaft auf falsefestgelegt. Angesichts einer Ausnahme auf DAL- oder BLL-Ebene, die wir im GridView-Ereignishandler RowUpdated erkennen können, legen wir die ExceptionDetails Eigenschaft des Steuerelements Visible auf true fest. Da Websteuerelement-Ereignishandler nach dem Page_Load Ereignishandler im Seitenlebenszyklus auftreten, wird die Bezeichnung angezeigt. Beim nächsten Postback rückgängig machen der Page_Load Ereignishandler die Visible -Eigenschaft jedoch wieder zurück zu falseund versteckt sie wieder in der Ansicht.

Hinweis

Alternativ können wir die Notwendigkeit zum Festlegen der ExceptionDetails -Eigenschaft des Steuerelements in Page_Load entfernen, indem wir seine Visible Eigenschaft false in der deklarativen Syntax zuweisen und den Ansichtszustand Visible deaktivieren (die -Eigenschaft auf falsefestlegenEnableViewState). Wir verwenden diesen alternativen Ansatz in einem zukünftigen Tutorial.

Nachdem das Label-Steuerelement hinzugefügt wurde, besteht unser nächster Schritt darin, den Ereignishandler für das GridView-Ereignis RowUpdated zu erstellen. Wählen Sie gridView im Designer aus, wechseln Sie zum Eigenschaftenfenster, und klicken Sie auf das Blitzsymbol, um die Ereignisse von GridView aufzulisten. Es sollte bereits einen Eintrag für das GridView-Ereignis RowUpdating vorhanden sein, da wir zuvor in diesem Tutorial 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 am Anfang der CodeBehind-Klassendatei erstellen. Wählen Sie in der Dropdownliste links die GridView-Liste und das RowUpdated Ereignis auf der rechten Seite aus.

Beim Erstellen dieses Ereignishandlers wird der CodeBehind-Klasse der ASP.NET Seite den folgenden Code 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 über drei Eigenschaften verfügt, die für die Behandlung von Ausnahmen von Interesse sind:

  • Exception ein Verweis auf die ausgelöste Ausnahme; wenn keine Ausnahme ausgelöst wurde, hat diese Eigenschaft den Wert von null
  • ExceptionHandled ein boolescher Wert, der angibt, ob die Ausnahme im RowUpdated Ereignishandler behandelt wurde oder nicht. Wenn false (standard) die Ausnahme erneut ausgelöst wird, wird die Ausnahme bis zur ASP.NET Runtime erfasst.
  • KeepInEditMode wenn festgelegt ist, true dass die bearbeitete GridView-Zeile im Bearbeitungsmodus verbleibt. Wenn false (Standard), wird die GridView-Zeile wieder in den schreibgeschützten Modus zurückgesetzt.

Unser Code sollte dann überprüfen, ob Exception dies nicht nullder Wert ist, was bedeutet, dass beim Ausführen des Vorgangs eine Ausnahme ausgelöst wurde. Wenn dies der Fall ist, möchten wir:

  • Anzeigen einer benutzerfreundlichen Nachricht in der ExceptionDetails Bezeichnung
  • Geben Sie an, dass die Ausnahme behandelt wurde.
  • Behalten Sie die GridView-Zeile im Bearbeitungsmodus.

Mit diesem folgenden Code werden die folgenden Ziele erreicht:

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.Exceptionnullist. Wenn dies nicht der Fall ist, wird die ExceptionDetails Label-Eigenschaft Visible auf true und ihre Text Eigenschaft auf "Es gab ein Problem beim Aktualisieren des Produkts" festgelegt. Die Details der tatsächlich ausgelösten Ausnahme befinden sich in der e.Exception Eigenschaft des InnerException Objekts. Diese innere Ausnahme wird untersucht, und wenn sie von einem bestimmten Typ ist, wird eine zusätzliche hilfreiche Nachricht an die ExceptionDetails Label-Eigenschaft Text angefügt. Schließlich sind die ExceptionHandled Eigenschaften und KeepInEditMode auf festgelegt true.

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

Das ProductName BoundField muss einen Wert enthalten.

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

Negative UnitPrice-Werte sind nicht zulässig.

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

Durch Festlegen der e.ExceptionHandled -Eigenschaft auf truehat der RowUpdated Ereignishandler angegeben, dass er die Ausnahme behandelt hat. Daher wird die Ausnahme nicht an die ASP.NET Runtime weitergegeben.

Hinweis

Abbildungen 9 und 10 zeigen eine ordnungsgemäße Möglichkeit, Ausnahmen aufgrund ungültiger Benutzereingaben zu behandeln. Im Idealfall erreicht eine solche ungültige Eingabe jedoch nie die Geschäftslogikebene, da die ASP.NET Seite sicherstellen sollte, dass die Eingaben des Benutzers gültig sind, bevor die Methode der ProductsBLL Klasse UpdateProduct aufgerufen wird. In unserem nächsten Tutorial erfahren Sie, wie Sie den Bearbeitungs- und Einfügeschnittstellen Validierungssteuerelemente hinzufügen, um sicherzustellen, dass die an die Geschäftslogikebene übermittelten Daten den Geschäftsregeln entsprechen. Die Validierungssteuerelemente 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 BLL-Level Ausnahmen

Beim Einfügen, Aktualisieren oder Löschen von Daten löst die Datenzugriffsebene möglicherweise eine Ausnahme aufgrund eines datenbezogenen Fehlers aus. Die Datenbank ist möglicherweise offline, für eine erforderliche Datenbanktabellenspalte wurde möglicherweise kein Wert angegeben, oder eine Einschränkung auf Tabellenebene wurde möglicherweise verletzt. Zusätzlich zu streng datenbezogenen Ausnahmen kann die Geschäftslogikebene Ausnahmen verwenden, um anzugeben, wenn gegen Geschäftsregeln verstoßen wurde. Im Tutorial Erstellen einer Geschäftslogikebene haben wir beispielsweise der ursprünglichen UpdateProduct Überladung eine Überprüfung der Geschäftsregel hinzugefügt. Insbesondere, wenn der Benutzer ein Produkt als eingestellt gekennzeichnet hat, verlangten wir, dass das Produkt nicht das einzige produkt ist, das von seinem Lieferanten bereitgestellt wurde. Wenn diese Bedingung verletzt wurde, wurde ein ApplicationException ausgelöst.

Für die UpdateProduct in diesem Tutorial erstellte Überladung fügen wir eine Geschäftsregel hinzu, die verhindert, dass das UnitPrice Feld auf einen neuen Wert festgelegt wird, der mehr als doppelt so viel wie der ursprüngliche UnitPrice Wert ist. Um dies zu erreichen, passen Sie die UpdateProduct Überladung so an, dass diese Überprüfung ausgeführt wird und eine ApplicationException ausgelöst wird, 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

Mit dieser Änderung führt jedes Preisupdate, das mehr als das Doppelte des vorhandenen Preises ist, dazu, dass ein ApplicationException ausgelöst wird. Genau wie die Ausnahme, die von der DAL ausgelöst wird, kann diese BLL-ausgelöste ApplicationException im GridView-Ereignishandler RowUpdated erkannt und behandelt werden. Tatsächlich erkennt der RowUpdated Code des Ereignishandlers, wie er geschrieben wurde, diese Ausnahme ordnungsgemäß und zeigt den Eigenschaftswert des ApplicationException-Objekts Message an. Abbildung 11 zeigt einen Screenshot, wenn ein Benutzer versucht, den Preis von Chai auf 50,00 USD zu aktualisieren, was mehr als dem Doppelten des aktuellen Preises von 19,95 USD entspricht.

Die Geschäftsregeln lassen Preiserhöhungen nicht zu, die den Preis eines Produkts mehr als verdoppeln.

Abbildung 11: Die Geschäftsregeln lassen Preiserhöhungen nicht zu, die den Preis eines Produkts mehr als verdoppeln (Klicken Sie, um das bild in voller Größe anzuzeigen)

Hinweis

Im Idealfall werden unsere Geschäftslogikregeln aus den UpdateProduct Methodenüberladungen in eine gemeinsame Methode umgestaltet. Dies bleibt als Übung für den Leser.

Zusammenfassung

Während der Einfüge-, Aktualisierungs- und Löschvorgänge wurden sowohl das Datenwebsteuerelement als auch das ObjectDataSource-Ereignis ausgelöst, das den tatsächlichen Vorgang gebucht hat. Wie wir in diesem Tutorial und im vorherigen Tutorial gesehen haben, wird beim Arbeiten mit einem bearbeitbaren GridView-Ereignis das GridView-Ereignis RowUpdating ausgelöst, gefolgt vom ObjectDataSource-Ereignis, an dem der Aktualisierungsbefehl Updating für das zugrunde liegende Objekt von ObjectDataSource ausgeführt wird. Nach Abschluss des Vorgangs wird das ObjectDataSource-Ereignis Updated ausgelöst, gefolgt vom GridView-Ereignis RowUpdated .

Wir können Ereignishandler für die Vorebenenereignisse erstellen, um die Eingabeparameter oder die Ereignisse nach der Ebene anzupassen, um die Ergebnisse des Vorgangs zu überprüfen und darauf zu reagieren. Ereignishandler nach der Ebene werden am häufigsten verwendet, um zu erkennen, ob während des Vorgangs eine Ausnahme aufgetreten ist. Angesichts einer Ausnahme können diese Post-Level-Ereignishandler die Ausnahme optional selbst behandeln. In diesem Tutorial haben wir erfahren, wie eine solche Ausnahme behandelt wird, indem eine benutzerfreundliche Fehlermeldung angezeigt wird.

Im nächsten Tutorial erfahren Sie, wie Sie die Wahrscheinlichkeit von Ausnahmen reduzieren können, die sich aus Datenformatierungsproblemen ergeben (z. B. eingabe eines negativen UnitPrice). Insbesondere wird erläutert, wie Sie den Bearbeitungs- und Einfügeschnittstellen Validierungssteuerelemente hinzufügen.

Viel Spaß beim Programmieren!

Zum Autor

Scott Mitchell, Autor von sieben ASP/ASP.NET-Büchern und Gründer von 4GuysFromRolla.com, arbeitet seit 1998 mit Microsoft-Webtechnologien. Scott arbeitet als unabhängiger Berater, Trainer und Autor. Sein neuestes Buch ist Sams Teach Yourself ASP.NET 2.0 in 24 Stunden. Er kann unter mitchell@4GuysFromRolla.comoder über seinen Blog erreicht werden, der unter http://ScottOnWriting.NETzu finden ist.

Besonderen Dank an

Diese Tutorialreihe wurde von vielen hilfreichen Prüfern überprüft. Lead Reviewer für dieses Tutorial war Liz Shulok. Möchten Sie meine anstehenden MSDN-Artikel lesen? Wenn dies der Fall ist, legen Sie eine Zeile unter abmitchell@4GuysFromRolla.com.