2009-03-23 3 views
1

Einer der Filter in einer Anwendung, die ich entwickle, überprüft, ob ein Benutzer das Element besitzt, das er zu ändern versucht. Die Aktion wird durch das Attribut [RequiresOwnership] geschmückt, und innerhalb der Attributlogik überprüfe ich, ob der Benutzer das Element besitzt, und falls nicht, werfe ich eine UnauthorizedAccessException.Wie eine Ausnahme zu fangen, die von einem Filter in .NET MVC ausgelöst wird?

Meine Frage ist das: Wo kann ich diese Ausnahme fangen? Ich möchte den Benutzer im Idealfall auf eine Seite umleiten, die erklärt, warum das, was sie zu tun versuchten, nicht erlaubt war, anstatt nur eine Ausnahmeseite anzuzeigen. Ich glaube nicht, dass ich die Ausnahme in der Aktion fangen würde, die durch das Attribut geschmückt ist. Gibt es also einen Basisbereich der Anwendung, in dem ich Ausnahmen, die höher geworfen werden, im .NET MVC-Modell behandeln kann?

EDIT: Mir ist klar, dass ich über den Filter selbst auf eine Seite umleiten kann, aber das scheint mir ein bisschen hacky zu sein. Es wäre schön, Ausnahmen über Attribute zu werfen und einen Standardplatz zu haben, an dem sie abgefangen und behandelt werden können.

Antwort

2

Ich denke, was Sie wollen, ist das [HandleError] -Attribut auf Ihrem Controller, der einen optionalen Pfad zu einer Fehlerbehandlung verwendet. Der Standardwert ist ~/Views/Shared/Error.aspx; Sie könnten dort zusätzliche Unterstützung für Ihre spezielle Ausnahme hinzufügen.

0

Ich hatte dieses Problem, und die Art und Weise, wie ich es löste, war, die Ausnahme zu der TempData-Sammlung des FilterContext hinzuzufügen, anstatt sie zu werfen. Anschließend können Sie es in Ihrer Aktionsmethode überprüfen, es erneut werfen und angemessen damit umgehen:

Im Attribute:

if (/*some error condition*/) 
    filterContext.Controller.TempData["Err"] = new Exception("An error"); 

Und in der Aktionsmethode:

var e = TempData["Err"] as Exception; 
if (e != null) 
    throw e; 

Es ist eine weniger als ideale Lösung, aber wie Sie bereits erwähnt haben, gibt es keinen nützlichen Ort, um Ausnahmen von Attributen abzufangen.

+0

* "Es gibt keinen nützlichen Ort, um Ausnahmen von Attributen abzufangen." * Was ist los mit @ GalacticCowboys Antwort? – seebiscuit

Verwandte Themen