Mehrere meiner Controller-Aktionen haben einen Standardsatz von Fehlerbehandlungsverhalten. Im Allgemeinen möchte ich:
- Laden eines Objekts auf der Grundlage der Routendaten (IDs und dergleichen)
- Wenn die Routendaten nicht auf ein gültiges Objekt verweisen (z.B. durch URL-Hacking), dann informieren Sie den Benutzer über das Problem und geben eine HTTP 404 Not Found zurück.
- Überprüfen, ob der aktuelle Benutzer die richtigen Berechtigungen für das Objekt hat
- Wenn der Benutzer keine Berechtigung hat, informieren Sie den Benutzer über das Problem und geben Sie eine HTTP 403 Forbidden
- Wenn die obigen Schritte erfolgreich sind, dann tun Sie etwas mit diesem Objekt, das aktionsspezifisch ist (d.h.: rendern Sie es in einer Ansicht).
Diese Schritte sind so standardisiert, dass ich wiederverwendbaren Code zur Implementierung des Verhaltens haben möchte.
Mein derzeitiger Plan war es, eine Hilfsmethode zu haben, um so etwas zu tun:
public static ActionResult HandleMyObject(this Controller controller,
Func<MyObject,ActionResult> onSuccess) {
var myObject = MyObject.LoadFrom(controller.RouteData).
if ( myObject == null ) return NotFound(controller);
if ( myObject.IsNotAllowed(controller.User)) return NotAllowed(controller);
return onSuccess(myObject);
}
# NotAllowed() is pretty much the same as this
public static NotFound(Controller controller){
controller.HttpContext.Response.StatusCode = 404
# NotFound.aspx is a shared view.
ViewResult result = controller.View("NotFound");
return result;
}
Das Problem hier ist, dass Controller.View() eine geschützte Methode ist und daher nicht von einem Helfer zugänglich ist. Ich habe mir überlegt, eine neue ViewResult-Instanz explizit zu erstellen, aber es gibt so viele Eigenschaften, dass ich vorsichtig bin, ohne die Fallstricke vorher zu kennen.
Was ist der beste Weg, um ein ViewResult von außerhalb eines bestimmten Controllers zu erstellen?