2015-06-26 15 views
5

Ho un filtro personalizzato che ho utilizzato per anni per la gestione di RequestValidationException s in un modo più user-friendly. Funziona senza problemi in tutti gli scenari fino a quando mi presento Spazio:ASP.NET Gestione MVC RequestValidationException nell'area

public class HandleHttpRequestValidationExceptionAttribute : HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext filterContext) 
    { 
     //base.OnException(filterContext); 

     if (!(filterContext.Exception is HttpRequestValidationException)) 
      return; 

     const string viewName = "~/Views/Errors/HttpRequestValidationException.cshtml"; 

     var result = new ViewResult 
     { 
      ViewName = viewName, 
      ViewData = { Model = filterContext.Exception.Message } 
     }; 

     //result.ViewBag.StatusCode = 200; 

     filterContext.Result = result; 
     filterContext.RouteData.Values["area"] = ""; 
     filterContext.ExceptionHandled = true; 
     filterContext.HttpContext.Response.Clear(); 
     filterContext.HttpContext.Response.StatusCode = 200; 
     filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; 
     filterContext.HttpContext.Server.ClearError(); 
    } 
} 

... registrati in FilterConfig:

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     //filters.Add(new HandleErrorAttribute()); 
     filters.Add(new HandleMemberIsNotActivatedOrWaiveredAttribute()); 
     filters.Add(new HandleMemberNotAuthorizedException()); 
     filters.Add(new HandleHttpRequestValidationExceptionAttribute()); 
    } 
} 

Qualsiasi RequestValidationException gettato ottiene maneggiato senza problemi (ho la mia pagina di errore abbastanza con una descrizione descrittiva di ciò che è accaduto e che cosa fare a riguardo) eccetto se uno è stato gettato in un'area. In tal caso, ottengo una risposta vuota con customErrors = "On" (e il YSOD dettagliato se customErrrors = "Off"). Se rimuovo il mio filtro, ricevo il YSOD senza dettagli (che è anche inutile). In ogni caso, Application_Error in Global.asax.cs non viene attivato. Inoltre, tutti i miei altri filtri personalizzati e la gestione globale delle eccezioni funziona senza problemi, indipendentemente da dove viene generata l'eccezione.

Come posso gestire RequestValidationException in modo semplice, indipendentemente da dove proviene l'eccezione (indipendentemente dal fatto che venga generata o meno all'interno di uno Area)?

Aggiornamento: anche eseguire un risultato filterContext.Result = new RedirectResult("/"); nella stessa pagina vuota (e passarci attraverso indica che tutto va bene, ma nessuna risposta appropriata).

risposta

0

Credo che sarà necessario inoltrare il modello di errore dall'area al controllore degli errori per generare la vista. o dovrai indirizzare il tuo error controller all'area.

Guarda questo link. Redirect From Action Filter Attribute

+0

È già registrato a livello globale tramite FilterConfig (e quando viene eseguito il debug, lo attraversa correttamente). Stai dicendo che questo è un modo bizzarro per affrontare un'eccezione già incredibilmente bizzarra? – Ted

+0

E no. Non andare come previsto. Ancora una volta, la registrazione in FilterConfig lo registra già globalmente. Non c'è bisogno di lanciarlo come attributo su controller specifici quindi. – Ted

+0

Potrebbe essere una cosa pazzesca chiedere ma come si sta reindirizzando il percorso al di fuori dell'area per tornare alle viste principali. wouldnt ~/Views/Errors/HttpRequestValidationException.cshtml cerca quella vista nell'area. –