Ich schreibe eine asp.net 4.5-Anwendung mit den neuen Routing-Funktionen. Ich habe eine Seite, auf der Informationen zu einem Artikel angezeigt werden. Im Page_Load
Ereignis überprüfe ich die Routendaten (Artikel-ID) und Benutzerberechtigungen, und wenn etwas nicht stimmt (z. B. die ID für ein gelöschtes Objekt), verwende ich Response.RedirectToRoute
, um sie packen, direkt zurück auf die Homepage. Überhole GO nicht, sammle keine $ 200 ein.Korrekte Möglichkeit, die Seitenausführung nach Response.RedirectToRoute zu überspringen
Das machte Sinn, bis ich versuchte, auf ein gelöschtes Objekt zuzugreifen, und anstelle der Homepage bekam ich eine Fehlerseite. Ich habe etwas graben und festgestellt, dass auch nach der Verwendung von RedirectToRoute
(im Gegensatz zu der Standard Redirect
Methode) der Rest der Seite Code continues to execute, die zumindest verschwenderisch scheint (da ich nur die Ergebnisse wegwerfen werde) und Fehler wirft wenn die notwendigen Daten nicht existieren.
Ich habe ein wenig mehr SO Bergbau und entdeckte die unglaubliche evil das ist Response.End()
. Es tut, was ich brauche, aber selbst die MSDN page sagt mir, dass Response.End
ist das Bastard Kind einer alten verfluchten Sprache und ist nicht geeignet, um das Licht des Tages zu sehen. Der primäre Einwand scheint die Tatsache zu sein, dass Response.End eine Ausnahme auslöst, und das ist schlecht für die Leistung. Ich bin nicht der erfahrenste Entwickler, daher verstehe ich das Problem nicht vollständig, aber ich habe Schwierigkeiten zu glauben, dass das Auslösen einer Ausnahme teurer ist als das Laden der gesamten Webseite. Die workarounds scheinen für eine so einfache Aufgabe ziemlich komplex und übertrieben zu sein, zumal die meisten Seiten eine Art Gültigkeitsprüfung erfordern.
Was soll ich in dieser Situation tun? Benutze Response.End
und bitte um Verzeihung für meine Unverschämtheit? Cobble zusammen ein hässlicher Workaround? Oder ist meine Perspektive auf das Problem alles falsch? Ich würde es wirklich gerne wissen.
Update: Nun, da ich es ein wenig mehr überlegt habe, frage ich mich, ob ich die falsche Perspektive auf das Problem habe. Vielleicht ist eine sofortige Weiterleitung nicht die beste Antwort für die Benutzererfahrung. Wäre es besser, alle Steuerelemente in einem Panel zu verpacken und so etwas zu verwenden?
Private Sub Page_Init(sender As Object, e As EventArgs) Handles Me.Init
'Validation Code
If notValid Then
ControlsPanel.Visible = false
ErrorPanel.Visible = true
End If
End Sub
Danke für die Folge oben. Mir ist nicht aufgefallen, dass du mit einem Fehlercode antworten und die Seite trotzdem laden kannst. Das werde ich mir in Zukunft unbedingt merken. –