Tengo un código básico para determinar errores en mi aplicación MVC. Actualmente en mi proyecto tengo un controlador llamado Error
con métodos de acción HTTPError404()
, HTTPError500()
y General()
. Todos aceptan un parámetro de cadena error
. Usando o modificando el código a continuación. ¿Cuál es la forma mejor / adecuada de pasar los datos al controlador de errores para su procesamiento? Me gustaría tener una solución lo más sólida posible.
protected void Application_Error(object sender, EventArgs e)
{
Exception exception = Server.GetLastError();
Response.Clear();
HttpException httpException = exception as HttpException;
if (httpException != null)
{
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Error");
switch (httpException.GetHttpCode())
{
case 404:
// page not found
routeData.Values.Add("action", "HttpError404");
break;
case 500:
// server error
routeData.Values.Add("action", "HttpError500");
break;
default:
routeData.Values.Add("action", "General");
break;
}
routeData.Values.Add("error", exception);
// clear error on server
Server.ClearError();
// at this point how to properly pass route data to error controller?
}
}
fuente
Para responder a la pregunta inicial "¿cómo pasar correctamente los datos de ruta al controlador de errores?":
Luego, en su clase ErrorController, implemente una función como esta:
Esto empuja la excepción a la Vista. La página de visualización debe declararse de la siguiente manera:
Y el código para mostrar el error:
Aquí está la función que recopila todos los mensajes de excepción del árbol de excepciones:
fuente
Encontré una solución para el problema de ajax señalado por Lion_cl.
global.asax:
ErrorPagesController
AjaxRedirectResult
AjaxRequestExtension
fuente
Luché con la idea de centralizar una rutina de manejo de errores global en una aplicación MVC antes. Tengo una publicación en los foros de ASP.NET .
Básicamente, maneja todos los errores de su aplicación en global.asax sin la necesidad de un controlador de errores, decorar con el
[HandlerError]
atributo o jugar con elcustomErrors
nodo en web.config.fuente
Quizás una mejor forma de manejar los errores en MVC es aplicar el atributo HandleError a su controlador o acción y actualizar el archivo Shared / Error.aspx para hacer lo que desee. El objeto Model de esa página incluye una propiedad Exception, así como ControllerName y ActionName.
fuente
404
Entonces, ¿ cómo manejará un error? ya que no hay ningún controlador / acción designado para eso?Perhaps a better way of handling errors
suena más o menos como Todos los errores y no solo 500.Application_Error tiene problemas con las solicitudes de Ajax. Si el error se manejó en la Acción que llamó Ajax, se mostrará su Vista de error dentro del contenedor resultante.
fuente
Esta puede no ser la mejor manera para MVC ( https://stackoverflow.com/a/9461386/5869805 )
A continuación se muestra cómo renderiza una vista en Application_Error y la escribe en la respuesta http. No es necesario utilizar la redirección. Esto evitará una segunda solicitud al servidor, por lo que el enlace en la barra de direcciones del navegador permanecerá igual. Esto puede ser bueno o malo, depende de lo que quieras.
Global.asax.cs
Ver
fuente
Brian, este enfoque funciona muy bien para solicitudes que no son de Ajax, pero como dijo Lion_cl, si tiene un error durante una llamada de Ajax, su vista Share / Error.aspx (o su vista de página de error personalizada) se devolverá al llamador de Ajax. -El usuario NO será redirigido a la página de error.
fuente
Utilice el siguiente código para redireccionar en la página de ruta. Usar excepción Mensaje a instancias de excepción. La cadena de consulta de excepción de Coz da error si extiende la longitud de la cadena de consulta.
fuente
Tengo un problema con este enfoque de manejo de errores: en el caso de web.config:
El controlador de errores está buscando en la vista Error.shtml y el paso de flujo de control en Application_Error global.asax solo después de la excepción
Entonces
httpException es siempre nulo, luego customErrors mode = "On" :( Es engañoso Entonces
<customErrors mode="Off"/>
o<customErrors mode="RemoteOnly"/>
los usuarios ven customErrors html, Entonces customErrors mode = "On" este código también es incorrectoOtro problema de este código que
Devuelve la página con el código 302 en lugar del código de error real (402,403, etc.)
fuente