Verarbeiten von Ausnahmen auf BLL- und DAL-Ebene in einer ASP.NET-Seite (VB)
von Scott Mitchell
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:
- 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.
- Rufen Sie die Methode auf.
- 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 UnitPrice
erstellt. 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.
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
, , UnitPrice
QuantityPerUnit
und 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 false
und auf ApplyFormatInEditMode
true
festgelegt werden musste, wie in Abbildung 2 dargestellt.
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
.
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.
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
, UnitPrice
und UnitsInStock
. Allerdings können nur die ProductName
Felder , UnitPrice
und UnitsInStock
bearbeitet werden.
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 false
festgelegt 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 localhost
aufrufen 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 localhost
angezeigt wird.
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 Warning
fest, 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.
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 ExceptionDetails
Visible
-Eigenschaft auf false
festgelegt. 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 false
und 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 false
festlegenEnableViewState
). 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.
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 vonnull
ExceptionHandled
ein boolescher Wert, der angibt, ob die Ausnahme imRowUpdated
Ereignishandler behandelt wurde oder nicht. Wennfalse
(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. Wennfalse
(Standard), wird die GridView-Zeile wieder in den schreibgeschützten Modus zurückgesetzt.
Unser Code sollte dann überprüfen, ob Exception
dies nicht null
der 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.Exception
null
ist. 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).
Abbildung 9: Das ProductName
BoundField muss einen Wert enthalten (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
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 true
hat 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.
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.