2009-06-15 15 views
15

Creo que he configurado nuestra aplicación MVC para usar correctamente el [HandleError]. Este es mi controlador:ASP.NET MVC HandleError no funciona (customErrors está establecido en "On")

[HandleError] 
public class SupportController : BaseController { 

    public ActionResult Toss() { 
     throw new Exception("uh oh"); 
    } 
    // snip 
} 

Y haber puesto mi etiqueta customErrors en web.config en "On":

<customErrors mode="On"></customErrors> 

Sin embargo, todavía estoy recibiendo la pantalla amarilla de la muerte de excepciones. Establecer un punto de interrupción en mi acción Toss() muestra que HttpContext.IsCustomErrorEnabledes establecido en verdadero.

No estamos haciendo nada con el motor de visualización, y el BaseController no se mezcla con nada (y otros controladores que no lo extienden tienen el mismo problema).

Estoy desarrollando en Windows XP y tengo el mismo problema cuando la aplicación se implementa en un cuadro de servidor 2003 (IIS 6).

No creo que hay una excepción en la página error.aspx:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"> 
</asp:Content> 

<asp:Content ID="errorContent" ContentPlaceHolderID="MainContent" runat="server"> 
    <h2> 
     Sorry, an error occurred while processing your request. 
    </h2> 
</asp:Content> 

Una cosa que puede ser diferente es que esta aplicación fue creada atrás cuando MVC Beta fue la última versión, y se actualizó a la RC y luego RTM cuando fueron lanzados. ¿Habría sido algún ajuste extraño que queda de allí?

Puedo hacer que esto funcione en otras aplicaciones, así que estoy un poco desconcertado.

+0

¿Su página de error.aspx está en ~ \ Views \ Support o ~ \ Views \ Shared? – Talljoe

+0

~ \ views \ Shared - incluso trató [HandleError (Ver = "~/Views/Shared/Error.aspx")] (no funcionó) – swilliams

Respuesta

19

Esto tiende a suceder si hay un problema al procesar la página de error ... si depura la aplicación, inmediatamente después de la excepción inicial, se golpeará con otro problema (excepción de la página de error) .. Tuve esto y la razón para mí fue porque tenía una página maestra fuertemente tipada, la página de error usaba esta página maestra y como la página maestra comparte el mismo modelo que la página real, la página maestra obtenía un modelo HandlerErrorInfo, en lugar del modelo mecanografiado Esperaba ...

Personalmente, creo que este es un diseño pobre en el asp.net mvc (junto con el resto), pero puede evitar esto fácilmente al no usar la misma página maestra (incluso podría hacer herencia de página maestra donde tienes una página maestra fuertemente tipada heredada que puramente yo Hereda la capa del tipo sin tipear.

De lo contrario, este es un tipo de excepción que ocurre en la vista de error ... (más probable).

+1

No eran 100% correcto, pero me puso en el camino correcto . La Página maestra no tiene un modelo, pero sí hace algunas cosas que supuestamente arrojaban una excepción de referencia nula. Usar una vista paginada no maestra funciona. ¡Gracias! – swilliams

+1

feliz de ayudar, un montón de puntos de dolor de cabeza en asp.net mvc, que parecen mantener la búsqueda de ellos y pensé que debería salvar a alguien alguna 'a la cabeza de impacto teclado' acciones. :) – meandmycode

+0

pasado un tiempo desde este post pero era útil debido para mí, así – Craig

2

Otra razón para este problema puede ser,

En plantillas de aplicaciones de MVC (generada por VS2008/VS2008 Express), Error.aspx (generado por VS) utiliza página maestra.

Si la página maestra accede a cualquier ViewData arrojará excepción de referencia nula, entonces el error.aspx no se mostrará.

Usar este código simple como su Error.aspx, que va a resolver el problema, (junto con CustomErrors = On)

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %> 
<%= Model.Exception.Message %> 
+0

Sí, ese fue el problema para mí, gracias. –

0

Después de mucho tirones de pelo, me encontré con que mi problema no cae en la categoría general de "lanzar una excepción desde el código solo para arrojar otro error al renderizar la vista de error"."Antes había escrito una página de error fuertemente tipada esperando una excepción System.Exception, luego cuando cambié al uso del atributo [HandleError], el filtro pasaba a la página de error un System.HandleErrorInfo. La segunda excepción ocurrió en esta línea (en default.aspx.cs):.

httpHandler.ProcessRequest(HttpContext.Current); 

confuso

1

que tenía un mismo problema, y ​​después de investigar, descubrí que estaba actualizando el archivo web.Debug.config bajo web.config

Entonces creó el. la etiqueta CustomErrors en el archivo web.config y estaba trabajando g por mi

0

Me encontré con un problema similar. Pude obtener un resultado deseable con este "truco".

Como todos mis controladores extienden un BaseController, esto funciona en todas partes.

public class BaseController : Controller 
{ 
    protected override void OnException(ExceptionContext filterContext) 
    { 

     Response.Write("<pre>" + filterContext.Exception.StackTrace + "</pre>"); 

     base.OnException(filterContext); 

    } 

} 
1

me encontré con un problema similar recientemente. Resultó que el método en el controlador que produce la excepción (HomeController) estaba siendo llamado por un método en un controlador diferente (DispatchController).

Tuvimos que colocar la propiedad [HandleError] en el controlador de llamada para conseguir que funcione.

[HandleError(ExceptionType = typeof(SessionExpireException), View = "ErrorSessionExpired")] 
public class DispatchController : Controller 
{ 

También colocamos la vista de error personalizado en la estructura de carpetas para el controlador que realiza la llamada.
View folder showing custom error view in the Dispatch controller folder

Cuestiones relacionadas