2010-01-14 4 views
8

Ich muss meine Benutzer global umleiten, wenn ein benutzerdefinierter Fehler in meiner Anwendung ausgelöst wird. Ich habe versucht, etwas Logik in meine global.asax-Datei zu setzen, um nach meinem benutzerdefinierten Fehler zu suchen, und wenn er ausgelöst wird, führe eine Weiterleitung durch, aber meine Anwendung trifft nie meine global.asax-Methode. Es gibt mir einen Fehler, der besagt, dass meine Ausnahme vom Benutzercode nicht behandelt wurde.Redirect asp.net mvc, wenn benutzerdefinierte Ausnahme ausgelöst wird

hier ist, was ich in meinem globalen haben.

protected void Application_Error(object sender, EventArgs e) 
{ 
    if (HttpContext.Current != null) 
    { 
     Exception ex = HttpContext.Current.Server.GetLastError(); 
     if (ex is MyCustomException) 
     { 
      // do stuff 
     } 
    } 
} 

und meine Ausnahme ausgelöst wird, wie folgt:

if(false) 
    throw new MyCustomException("Test from here"); 

, wenn ich das aus der Datei in einen Try-Catch stellen die Ausnahme zu werfen, meine Application_Error Methode nie erreicht wird. Jeder hat ein paar Vorschläge, wie ich das global handhaben kann (mit meiner benutzerdefinierten Ausnahme umgehen)?

danke.

1/15/2010 bearbeiten: Hier ist, was ist in // Dinge tun.

RequestContext rc = new RequestContext(filterContext.HttpContext, filterContext.RouteData); 
string url = RouteTable.Routes.GetVirtualPath(rc, new RouteValueDictionary(new { Controller = "Home", action = "Index" })).VirtualPath; 
filterContext.HttpContext.Response.Redirect(url, true); 
+0

+1 für die Do Stuff Bit – stuartdotnet

Antwort

10

Sie möchten einen Kundenfilter für Ihre Controller/Aktionen erstellen. Sie müssen von FilterAttribute und IExceptionFilter erben.

Etwas wie folgt aus:

public class CustomExceptionFilter : FilterAttribute, IExceptionFilter 
{ 
    public void OnException(ExceptionContext filterContext) 
    { 
     if (filterContext.Exception.GetType() == typeof(MyCustomException)) 
     { 
      //Do stuff 
      //You'll probably want to change the 
      //value of 'filterContext.Result' 
      filterContext.ExceptionHandled = true; 
     } 
    } 
} 

Sobald Sie es erstellt haben, können Sie dann wenden Sie das Attribut auf einen Base, die alle Ihre anderen Controllern von erben, um es breite Funktionalität zu machen Website.

könnten diese beiden Artikel helfen:

+0

ok Ich werde dies geben. Wenn ich es zu Testzwecken direkt zu einem meiner Controller hinzufügen möchte, wie würde ich das machen? Sorry für die newbness:/ – Kyle

+0

Ich habe versucht, das Attribut "[CustomExceptionFilter]" an der Spitze meiner Controller-Klasse und dann eine Ausnahme zu werfen und es scheint nicht von diesem Filter erwischt werden. Es wirft nicht den gleichen Fehler wie zuvor, aber es trifft nicht meinen benutzerdefinierten Ausnahmefilter. Ich habe auch versucht, es auf die Action-Methode zu setzen, die ich treffe, die die Ausnahme werfen sollte, und es funktioniert auch nicht dort ... irgendwelche Ideen? – Kyle

+0

Scratch mein letzter Kommentar, ich hatte vergessen, meinen Wurf zurück zu setzen. Als ich das tat, bekomme ich den gleichen Fehler wie zuvor "meine Ausnahme wurde vom Benutzercode nicht behandelt". Brauche ich es in einem Versuch zu fangen? – Kyle