2016-11-14 5 views
0

Ich habe ein seltsames Problem, oder ein erwartetes (nur habe ich es nicht bekommen)..NET Core-Ausnahmefilter stoppt die Controller-Ausführung

Ich habe einen Ausnahmefilter geschrieben, so dass er eine bestimmte Ausnahme abfangen und diese Ausnahmemeldung dem ModelState hinzufügen kann (um die Verwendung von try/catch-Blöcken in Controllern zu vermeiden).

Das Problem, das ich habe, ist, dass wenn die Ausnahme passiert, ich einen leeren Bildschirm anstelle der Ansicht bekomme. Es scheint nicht weiter zu gehen, wo es in der Steuerung geblieben ist, von der ich annehme, dass es sollte.

Der Filter:

public class ValidationFilter : ExceptionFilterAttribute 
{ 
    public override void OnException(ExceptionContext context) 
    { 
     context.ExceptionHandled = true; 
     context.ModelState.AddModelError("", context.Exception.Message); 
    } 
} 
+0

Siehe http://stackoverflow.com/a/24202011/43846 für einen alternativen Ansatz – stuartd

Antwort

1

Scheint mir eher logisch. Wenn Sie hier die Ausnahmebehandlung durchführen, müssen Sie sicherstellen, was Sie als Antwort zurückgeben, da der Ablauf unterbrochen wurde.

Ich nehme an, dies ist ein Modell, was los ist:

try 
{ 
    var model = SomeMethodThatThrowsException(); 
    return View(model); 
} 
catch 
{ 
} 

Nun, wie wäre es in der Lage sein, mit der Rückkehr eine Ansicht, um fortzufahren, wenn die erste Zeile eine Ausnahme ausgelöst hat, wenn Sie es genau dort handhaben und sagen, Was ist zu tun?

Ich bin nicht 100% sicher, es ist unmöglich zu tun, was Sie wollen, aber dies scheint eher logisch (zumindest nach der Arbeit mit früheren Versionen von ASP.NET) fließen.

Mögliche Lösungen

  • Redirect auf eine spezielle Fehlerseite mit Ausnahme als Modell z.B.
  • In JSON transformieren und das Ergebnis in SPA-Anwendung behandeln.
  • Wenn Sie die Fehler zur zurückgegebenen Ansicht hinzufügen müssen, können Sie Ihre Funktionsaufrufe entweder mit einem separaten Dienst oder einem einfachen Delegaten, z.
public void MyAction() 
{ 
    MyModel model = ExecuteSafely(SomeMethodThatThrowsException()); 
    return View(model); 
} 

private MyModel ExecuteSafely(Func<MyModel> action) 
{ 
    try 
    { 
     return action(); 
    } 
    catch 
    { 
     // Add what you need to a model/view/etc. here 
     return null; 
    } 
} 

Dies ist einige Beispiel, so wird wahrscheinlich nicht kompilieren, sondern nur einen Hinweis darauf geben, was ich meine.

+0

Der Grund, den ich brauche, um fortzufahren und die gleiche Ansicht statt einer Fehlerseite zu zeigen, ist, dass ich die Ausnahmemeldungen als Validierung behandeln muss Nachrichten, ohne den Benutzer auf eine andere Seite umzuleiten, damit er/sie das Problem beheben kann (wenn es reparierbar ist). –

+0

Ich verstehe, ich denke, Sie können Ihre Methode durch einen Dekorateur ausführen, der das tun wird. Sie müssen also versuchen, an der richtigen Stelle zu fangen, nicht im Filter. Ich werde die Antwort erweitern. –

Verwandte Themen