2012-03-31 24 views
0

Ich erstellte eine benutzerdefinierte Ausnahme und ich werfe eine Instanz dieser Klasse immer dann, wenn ich bedenke, dass meine Anwendung in einem "Ausnahmezustand" ist. Diese Ausnahme wird in einer Anwendungslogikklasse (in meinem Fall Dienst) ausgelöst. Jetzt habe ich auch die Standard - ASP MVC - Ausnahmeumleitung an Ort und Stelle, aber im Falle dieser benutzerdefinierten Ausnahmen möchte ich nicht, dass es auf die 'Error' Seite umleiten, sondern um eine Nachricht in einem div (z. B. in meine Layout.cshtml Seite). Ich dachte über das Hinzufügen der Ausnahmebedingungsnachricht zu TempData ["ApplicationError"] nach. Ich möchte diesen Code nur einmal schreiben, nicht alle meine Controller-Aktionsmethoden. Also, in meiner Basis-Controller Klasse überschrieben I protected void OnException (ExceptionContext filterContext) und mein Code sieht wie folgt aus:Benutzerdefinierte Ausnahmebedingungsnachricht in ASP MVC

protected override void OnException(ExceptionContext filterContext) 
    { 
     if (filterContext.Exception is InvalidOperationException) 
      TempData["ApplicationError"] = filterContext.Exception.Message; 
     else 
      base.OnException(filterContext); 
    } 

Mein Problem ist, dass ich immer noch auf die Standardfehlerseite umgeleitet werden, wenn diese Ausnahme ausgelöst wird . Ich möchte nicht, dass das passiert. Was ich will, ist die Nachricht der benutzerdefinierten Ausnahme in einem freundlichen Div in der gleichen Ansicht anzuzeigen, auf der der Benutzer ist. Haben Sie Ideen, wie ich das erreichen kann?

Antwort

0

Was ich in einer ähnlichen Situation in gemacht habe, fügte ich eine Eigenschaft zu meinem ViewModel (ich hinzugefügt, um die Basisklasse, wo alle anderen Viewmodels erben von) für Fehlermeldung und Erfolgsmeldung. Immer wenn ein Fehler auftritt (entweder Anwendung/System) setze ich Wert auf diese Eigenschaft und zeige dies in meiner Sicht an. Ich werde immer das Viewmodel vom Controller zurückgeben, damit die Fehlerseite nicht angezeigt wird.

public class BaseViewModel 
{ 
    public string ErrorMessage { set;get;} 
    public string SuccessMessage {set;get;} 
    public bool IsValid { set;get;} 
} 

public class UserViewModel: BaseViewModel 
{ 
    // user properties 
} 

Und in meinem Controller

public ActionResult Get(int id) 
{ 

    UserViewModel ovjUser; 
    try 
    { 
    objUser=MyService.GetUser(id); 
    if(!objUser.IsValid) 
    { 
     objUser.ErrorMessage="This User Account is not Valid"; 
    } 
    } 
    catch(Exception ex) 
    { 
    // log error 
    objUser.ErrorMessage="Application is buzy now!.Pls try later"; 
    } 
    return View(objUser); 
} 
+0

Danke. Mein Problem mit diesem Ansatz ist, dass ich try-cacth-AddError in allen Methoden, die diese Ausnahme auslösen, kopieren/einfügen muss. Ich will das nicht. Ich brauche so etwas wie einen zentralen (infrastrukturellen) Ort, um das immer zu bewältigen. In den meisten Fällen habe ich nicht einmal ein Ansichtsmodell, das meine Ansichtsdaten unterstützt. –

+0

Ein ViewModel ist eine bessere Idee, weil es stark typisierte Ansichten gibt. – Shyju

+0

Ich brauche die VMs jetzt einfach nicht, besonders wenn sie mein Problem zu lösen scheinen. –

0

Versuchen an, dass Sie die Ausnahme behandelt werden durch die ExceptionHandled-Eigenschaft:

protected override void OnException(ExceptionContext filterContext) 
{ 
    if (filterContext.Exception is InvalidOperationException) 
    { 
     filterContext.ExceptionHandled = true; 
     var viewResult = new ViewResult(); 
     viewResult.ViewData["ApplicationError"] = filterContext.Exception.Message; 
     filterContext.Result = viewResult; 
    } 
} 

Ein wichtiger Aspekt ist, dass da war es eine Ausnahme innerhalb Die Controller-Aktion kam nicht zu dem Punkt, an dem ein Aktionsergebnis zurückgegeben wurde. Sie wissen also nicht mehr, ob die Aktion eine Sicht rendern, JSON zurückgeben, umleiten oder was auch immer. Sie könnten also davon ausgehen, dass eine Ansicht gerendert werden soll, indem Sie die Eigenschaft filterContext.Result festlegen. Wenn Sie dieser Ansicht ein Ansichtsmodell zugeordnet haben, können Sie es natürlich nicht rekonstruieren. Stellen Sie also sicher, dass Ihre Ansicht so organisiert ist, dass, wenn etwas darin ist, nicht einmal versucht wird, etwas mit Ihrem Ansichtsmodell zu tun, da Sie es nicht haben werden => denken Sie daran, dass Ihre Anwendung mitten in der Ausführung abgestürzt ist die Aktion.

+0

Danke, ich habe einen Haltepunkt in der Ausnahmebehandlung gesetzt, es kommt dorthin, aber ich bekomme immer noch gelben Bildschirm des Todes mit der Ausnahme ... Ich weiß nicht, ob ich das noch sehen sollte, wenn ich es lokal ausführe (localhost/...)? –