Kurz gesagt, die Art und Weise kann zu gehen, um die HandleErrorAttribute zu verlängern, wie folgt aus:
public class OncHandleErrorAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext context)
{
// Elmah-Log only handled exceptions
if (context.ExceptionHandled)
ErrorSignal.FromCurrentContext().Raise(context.Exception);
if (context.HttpContext.Request.IsAjaxRequest())
{
// if request was an Ajax request, respond with json with Error field
var jsonResult = new ErrorController { ControllerContext = context }.GetJsonError(context.Exception);
jsonResult.ExecuteResult(context);
context.ExceptionHandled = true;
}
else
{
// if not an ajax request, continue with logic implemented by MVC -> html error page
base.OnException(context);
}
}
}
entfernen Elmah Logging-Code Zeile, wenn Sie es nicht brauchen. Ich benutze einen meiner Controller, um einen json basierend auf einem Fehler und Kontext zurückzugeben. Hier ist das Beispiel:
public class ErrorController : Controller
{
public ActionResult GetJsonError(Exception ex)
{
var ticketId = Guid.NewGuid(); // Lets issue a ticket to show the user and have in the log
Request.ServerVariables["TTicketID"] = ticketId.ToString(); // Elmah will show this in a nice table
ErrorSignal.FromCurrentContext().Raise(ex); //ELMAH Signaling
ex.Data.Add("TTicketID", ticketId.ToString()); // Trying to see where this one gets in Elmah
return Json(new { Error = String.Format("Support ticket: {0}\r\n Error: {1}", ticketId, ex.ToString()) }, JsonRequestBehavior.AllowGet);
}
Ich füge einige Ticket Info oben hinzu, können Sie dies ignorieren. Aufgrund der Art und Weise der Filter implementiert ist (der Standard HandleErrorAttributes erweitert) können wir entfernen dann HandleErrorAttribute aus den globalen Filter:
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new GlobalAuthorise());
filters.Add(new OncHandleErrorAttribute());
//filters.Add(new HandleErrorAttribute());
}
Das es im Grunde ist. Sie können my blog entry für weitere Informationen lesen, aber für die Idee, sollte oben ausreichen.
Ich habe das versucht, aber wenn die HandleJsonErrorAttribute OnException-Methode aufgerufen wird, ist die filterContext.ExceptionHandled-Eigenschaft immer true, wenn es ein HandleErrorAttribute für die Controller-Klasse gibt, zu der die Aktion gehört. Sollten die Aktionsmethoden handleerror Priorität haben und zuerst aufgerufen werden? –