He leído una docena de preguntas similares en StackOverflow, pero parece que no entiendo esto. Con respecto al nodo de errores personalizados en web.config y HandleErrorAttribute, ¿cómo se llama a Error.cshtml? En última instancia, la respuesta a esta pregunta puede ser la respuesta a una de esas varias preguntas que ya existen sobre el manejo de errores ASP.NET MVC. Pero, el hecho es que no sé cuál.¿Cómo se llama Error.cshtml en ASP.NET MVC?
62
A
Respuesta
82
Dentro de su Global.asax que tiene el siguiente método:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
Esto registra el HandleErrorAttribute como filtro de acción global. Esto significa que este controlador se aplica automáticamente a todas las acciones del controlador. Ahora vamos a echar un vistazo a cómo este atributo es implementado por mirar el código fuente:
[SuppressMessage("Microsoft.Performance", "CA1813:AvoidUnsealedAttributes", Justification = "This attribute is AllowMultiple = true and users might want to override behavior.")]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class HandleErrorAttribute : FilterAttribute, IExceptionFilter {
private const string _defaultView = "Error";
private readonly object _typeId = new object();
private Type _exceptionType = typeof(Exception);
private string _master;
private string _view;
public Type ExceptionType {
get {
return _exceptionType;
}
set {
if (value == null) {
throw new ArgumentNullException("value");
}
if (!typeof(Exception).IsAssignableFrom(value)) {
throw new ArgumentException(String.Format(CultureInfo.CurrentCulture,
MvcResources.ExceptionViewAttribute_NonExceptionType, value.FullName));
}
_exceptionType = value;
}
}
public string Master {
get {
return _master ?? String.Empty;
}
set {
_master = value;
}
}
public override object TypeId {
get {
return _typeId;
}
}
public string View {
get {
return (!String.IsNullOrEmpty(_view)) ? _view : _defaultView;
}
set {
_view = value;
}
}
public virtual void OnException(ExceptionContext filterContext) {
if (filterContext == null) {
throw new ArgumentNullException("filterContext");
}
if (filterContext.IsChildAction) {
return;
}
// If custom errors are disabled, we need to let the normal ASP.NET exception handler
// execute so that the user can see useful debugging information.
if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled) {
return;
}
Exception exception = filterContext.Exception;
// If this is not an HTTP 500 (for example, if somebody throws an HTTP 404 from an action method),
// ignore it.
if (new HttpException(null, exception).GetHttpCode() != 500) {
return;
}
if (!ExceptionType.IsInstanceOfType(exception)) {
return;
}
string controllerName = (string)filterContext.RouteData.Values["controller"];
string actionName = (string)filterContext.RouteData.Values["action"];
HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
filterContext.Result = new ViewResult {
ViewName = View,
MasterName = Master,
ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
TempData = filterContext.Controller.TempData
};
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.StatusCode = 500;
// Certain versions of IIS will sometimes use their own error page when
// they detect a server error. Setting this property indicates that we
// want it to try to render ASP.NET MVC's error page instead.
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
}
}
El código fuente contiene comentarios y es más que explica por sí mismo. Lo primero que verifica es si ha habilitado errores personalizados en su web.config (es decir, <customErrors mode="On">
). Si no lo tiene, no hace nada => YSOD. Si ha habilitado los errores personalizados, entonces hace que la vista de Error le pase un modelo que contiene la excepción stacktrace y otra información útil.
Cuestiones relacionadas
- 1. ASP.NET MVC Controller.OnException no se llama
- 2. ASP.NET MVC no llama a global.asax 'EndRequest
- 3. ¿Cómo se borra User.Identity.Name en ASP.NET MVC?
- 4. asp.net mvc: cómo detectar cuándo se llama a una página usando ajax
- 5. ASP MVC: ¿Cuándo se llama IController Dispose()?
- 6. ¿Cómo pruebo un ActionFilter en ASP.NET MVC?
- 7. cliente Web de devolución de llamada asincrónica no se llama en ASP.NET MVC
- 8. ¿Cómo se usa WebAPI sin ASP.NET MVC?
- 9. ¿Cómo se compara Asp.Net MVC con Java MVC frameworks?
- 10. ¿ASP.Net MVC se ejecuta sobre ASP.NET 2.0?
- 11. ASP.NET MVC - ¿Cómo explicarlo?
- 12. ¿Cómo se llama eso?
- 13. Application_End no se llama en el servicio Web asp.net
- 14. Temas Asp.Net MVC, ¿cómo?
- 15. ¿Cómo se puede enumerar un formcollection en ASP.NET MVC?
- 16. ¿Cómo se evitan las vulnerabilidades XSS en ASP.Net (MVC)?
- 17. ¿Cómo se burla del objeto de caché en asp.net mvc?
- 18. ¿Cómo se ve realmente el principio DRY en ASP.NET MVC?
- 19. ¿Cómo se usan los manipuladores genéricos (ASHX) en ASP.NET MVC?
- 20. ¿cómo se organiza el código de modelo en asp.net-mvc?
- 21. ¿Cómo se indica visualmente la página actual en ASP.NET MVC?
- 22. ¿Cómo se envía una lista desplegable en asp.net mvc
- 23. Html.TextAreaFor en asp.net mvc
- 24. ASP.NET MVC en IIS6
- 25. Personificación en ASP.NET MVC
- 26. LinkButton en ASP.NET MVC
- 27. ReturnUrl en ASP.NET MVC
- 28. HTML.Button en ASP.NET MVC
- 29. ASP.net MVC ValidationSummary siempre que se queden
- 30. ¿Cómo puedo usar los datos colocados en un ViewBag por un filtro en mi vista Error.cshtml?
Todavía soy bastante nuevo en ASP.NET MVC, pero pensé que cada Vista tenía que corresponder a la acción de algún controlador. ¿Cuál es el controlador y la acción aquí y cómo sabe ir a Compartido para la vista? Parece que este mecanismo está aquí para interrumpir e intercambiar en la vista Error. – LJM
Sí, cada vista debe corresponder a una acción de controlador. La acción del controlador en este caso es la que se está ejecutando y que arroja una excepción. Podría ser cualquier acción del controlador. Esta excepción es interceptada por el filtro de acción global (que en este caso es un filtro de excepción) y representa la vista de Error. Dado que la excepción se produce dentro de la acción del controlador, esta acción nunca regresa, simplemente deja de ejecutarse en estas etapas y maneja la ejecución al controlador de errores que a su vez representa la vista. –
Gracias. Eso lo hace. – LJM