2011-09-01 17 views
10

Ho installato pagine di errore personalizzate utilizzandoMVC InvalidOperationException con pagine di errore personalizzate

<customErrors mode="On" defaultRedirect="~/Home/Error"> 
    <error statusCode="404" redirect="~/Home/PageNotFound" /> 
</customErrors> 

ho creato una pagina che lancia e l'eccezione e vengo reindirizzato alle pagine di errore corretto.

Comunque sto notando questi errori nel ELMAH sul web server di produzione:

System.InvalidOperationException è stato non trovata La vista 'errore' o il suo padrone o nessun motore di visualizzazione supporta le posizioni ricercate. Sono stati cercati i seguenti punti: ~/Aree/Calcio/Visualizzazioni/Bozza/Errore.aspx ~/Aree/Calcio/Visualizzazioni/Bozza/Errore.ascx ~/Aree/Calcio/Visualizzazioni/Condivise/Errore.aspx ~/Aree/Calcio/Viste/Condivise/Error.ascx ~/Views/Draft/Error.aspx ~/Views/Draft/Error.ascx ~/Views/Shared/Error.aspx ~/Views/Shared/Error. ascx ~/Areas/Football/Views/Draft/Error.cshtml ~/Areas/Football/Views/Draft/Error.vbhtml ~/Areas/Football/Views/Shared/Error.cshtml ~/Areas/Football/Views /Shared/Error.vbhtml ~/Views/Draft/Error.cshtml ~/Views/Draft/Error.vbhtml ~/Views/Shared/Error.cshtml ~/Views/Shared/Error.vbhtml

Perché sta cercando la pagina di errore altrove? Ho cancellato ~/Views/Shared/Error.cshtml e ho aggiunto la mia pagina di errore personalizzata su ~/Home/Error poiché ho specificato un nuovo valore predefinito nel mio file di configurazione.

Qualche idea?

Grazie.

+0

Dal 'customErrors' è offerte ASP.NET qualcosa con (non ASP .NET MVC), non è lo strumento migliore per il lavoro. Richard Dingwall ha un post eccellente su questo: http://richarddingwall.name/2008/08/17/strategies-for-resource-based-404-errors-in-aspnet-mvc/ –

risposta

26

progetti MVC per impostazione predefinita aggiunge il HandleErrorAttribute nel Global.asax.cs file di

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorAttribute()); 
    } 

Questo filtro viene eseguito quando viene generata un'eccezione non gestita. Imposta la vista come Error. Quindi il runtime MVC tenta di rendere quella vista. Ma nel tuo caso, non esiste una tale visione. Quindi lancia nuovamente un'altra eccezione che viene gestita dal runtime di ASP.NET e mostra la pagina di errore che è stata configurata nel file Web.Config.

È possibile creare il proprio filtro di eccezione e registrarlo.

+0

Grazie hai ragione che sembra essere esattamente cosa sta succedendo. Ho ripristinato la vista di errore predefinita e ho generato un'eccezione, ovvero l'errore relativo alla mancata visualizzazione della vista predefinita è scomparso. Tuttavia elmah non registra l'eccezione. Sto bene usando la vista predefinita, ma come mai elmah non registra gli errori? Registra 404 bene, ma non gli errori del server 500. –

+2

@Aros - È necessario implementare una versione speciale di HandleErrorAttribute per Elmah. Puoi trovare un exmaple qui: http://www.hanselman.com/blog/ELMAHErrorLoggingModulesAndHandlersForASPNETAndMVCToo.aspx –

+0

Grazie per ora ho commentato la riga nella risposta, e mi sto affidando agli errori personalizzati di reindirizzamento da web.config. Userò la risposta qui se ciò causa problemi. http://stackoverflow.com/questions/766610/how-to-get-elmah-to-work-with-asp-net-mvc-handleerror-attribute/779961#779961 Qualcuno sa perché non vorrei commentare quella linea di codice fuori? –

5

Ho finito per prendere la registrazione di HandleErrorAttribute in Global.asax e solo utilizzando la sezione <customErrors>. ELMAH ora registra correttamente gli errori e sono in grado di specificare pagine di errore personalizzate.

mi sto perdendo qualcosa?

+0

Sembra funzionare per me, mi rende leggermente nervoso ma non riesce a vedere nulla di sbagliato in esso. – andrewb

+0

Ha funzionato per me utilizzando errori personalizzati con StackExchange.Exceptional anziché Elmah. – Gareth

0

Per i futuri lettori di questo post, si noti che Elmah aggiunge il proprio HandleErrorAttribute quindi si aspetta anche la vista Error.cshtml. Nota che ho anche installato il pacchetto NuGet Elmah.MVC ma che è appena stato usato per configurarlo correttamente.

Sì, appena notato il nuget.org che Elmah.MVC è responsabile per l'aggiunta del HandleErrorAttribute:

indolore integrazione della funzionalità ELMAH in ASP.NET MVC applicazione. Basta rilasciare il pacchetto all'interno dell'ASP.Applicazione NET MVC e accesso/elmah URL. Installa inoltre il filtro HandleError globale, , che garantisce la registrazione di tutti gli errori non gestiti (anche se CustomError diventa "On").

1

È anche possibile fare in modo che il HandleErrorAttribute non è inserito di rimozione dai filtri globali, utilizzando il metodo Remove:

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Remove(new HandleErrorAttribute()); 
     /* ... your other filters */ 
    } 
} 
Problemi correlati