asp.net-mvc asp.net-mvc-3 error-handling ninject

asp.net-mvc - razor c#



Manejo de errores en asp.net mvc 3 (5)

Creo que la forma más fácil es utilizar el atributo ExceptionHandler, ya que está listo para usar en cualquier momento que cree un nuevo proyecto ASP.NET MVC 3. Todavía puede configurar Web.config para usar una página de error personalizada y manejar excepciones en el método Global Application_Error como de costumbre, pero cuando ocurre una excepción, la URL no se muestra tan bien como el nuevo MVC 3.

¿Existe una forma integrada o una forma adecuada de manejar los errores en asp.net mvc 3?

Esto es lo que quiero hacer:

  1. Si la aplicación falla o arroja un error, va a una página de error específica.
  2. Puedo lanzar mi propio error desde la acción del controlador. (y va a una página de error).

Encontré las siguientes maneras:

  1. Veo que hay un largo camino para hacerlo here . (para v1 y v2, pero también se aplica a v3).
  2. Usando el atributo errorhandle here .

¿Cómo manejo esto de la manera correcta?

Si la solución es similar o se parece al número 1 en la lista anterior, estoy usando ninject y no he creado una clase base. ¿Cómo sigo haciendo esto?



Sugiero implementar un filtro de acción HandleErrorAttribute personalizado.

Vea este enlace para más detalles:
http://msdn.microsoft.com/en-us/library/dd410203%28v=vs.90%29.aspx

La configuración de un filtro de acción HandleErrorAttribute le brinda control total sobre las acciones que maneja el filtro, y es fácil de configurar en el nivel del controlador, o incluso en el nivel del sitio configurándolo en un controlador base personalizado, y teniendo todas sus acciones los controladores heredan del controlador base.

Otra cosa que hago con esto, es que tengo un HandleJsonErrorAttribute separado que responde a las llamadas Ajax devolviendo una respuesta Json, en lugar de la página personalizada.

ACTUALIZAR:

Debajo de algunas preguntas a continuación, he aquí un ejemplo de HandleJsonErrorAttribute que utilizo:

public class HandleJsonErrorAttribute : HandleErrorAttribute { public override void OnException(ExceptionContext filterContext) { var serviceException = filterContext.Exception as ServiceException; filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError; filterContext.Result = new JsonResult { Data = new { message = serviceException == null ? "There was a problem with that request." : serviceException.Message } }; filterContext.ExceptionHandled = true; } }

Y aquí está el jQuery que utilizo para manejar estas excepciones sin mano:

$(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) { showPopdown($.parseJSON(jqXHR.responseText).message); });

Esto permite que mis métodos Ajax sean muy livianos: solo manejan el Json normal que regresa, y en el caso de una excepción sin manos, un mensaje con un código de estado de error se envuelve en Json y se devuelve.

Además, en mi implementación, tengo una ServiceException personalizada que lanzo desde los servicios, y esto envía el mensaje desde la capa de servicio en lugar de un mensaje genérico.



Para el manejo de errores globales
Todo lo que tiene que hacer es cambiar el modo customErrors = "On" en la página web.config
El error se mostrará a través de Error.cshtml reside en la carpeta compartida.

Asegúrese de que Error.cshtml Layout no sea nulo .
[Sería algo así como: @ {Layout = "~ / Views / Shared / _Layout.cshtml"; }
O elimine Layout = bloque de código nulo]
Un marcado de muestra para Error.cshtml: -

@{ Layout = "~/Views/Shared/_Layout.cshtml"; } @model System.Web.Mvc.HandleErrorInfo <!DOCTYPE html> <html> <head> <title>Error</title> </head> <body> <h2> Sorry, an error occurred while processing your request. </h2> <p>Controller Name: @Model.ControllerName</p> <p>Action Name : @Model.ActionName</p> <p>Message: @Model.Exception.Message</p> </body> </html>

Para manejo de errores específicos
Agregue el atributo HandleError a una acción específica en la clase de controlador. Proporcione ''Ver'' y ''ExceptionType'' para ese error específico.
Un ejemplo de controlador de excepción no disponible:

public class MyController: Controller { [HandleError(View = "NotImplErrorView", ExceptionType=typeof(NotImplementedException))] public ActionResult Index() { throw new NotImplementedException("This method is not implemented."); return View(); } }