我是ASP.NET MVC3的新手。如何为MVC3创建全局自定义错误页面?一般的想法是当抛出异常时它会向用户显示一条通用消息,它会将异常记录到数据库中供开发人员稍后调查。
提前感谢您的帮助。
以下是我最终在global.asax.cs中所做的事情:
protected void Application_Error()
{
var exception = Server.GetLastError();
Log.Error("Exception", exception);
var httpException = exception as HttpException;
Response.Clear();
Server.ClearError();
var routeData = new RouteData();
routeData.Values["controller"] = "Error";
routeData.Values["action"] = "General";
routeData.Values["exception"] = exception;
Response.StatusCode = 500;
if (httpException != null)
{
Response.StatusCode = httpException.GetHttpCode();
switch (Response.StatusCode)
{
case 403:
routeData.Values["action"] = "Http403";
break;
case 404:
routeData.Values["action"] = "Http404";
break;
}
}
IController errorsController = new ErrorController();
var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
errorsController.Execute(rc);
}
答案 0 :(得分:1)
在Global.asax
文件中实施Application_Error
方法:
protected void Application_Error() {
HttpContext ctx = HttpContext.Current;
var error = ctx.Server.GetLastError();
ctx.Response.Clear();
ctx.Response.End();
}
跟进Maess的评论:
答案 1 :(得分:1)
我在项目中所做的是创建BaseController
并覆盖OnException
事件,如下所示
protected override void OnException(ExceptionContext filterContext)
{
// do some logging using log4net or signal to ELMAH
filterContext.ExceptionHandled = true;
var exModel = new HandleErrorInfo(filterContext.Exception,
filterContext.RouteData.Values["controller"].ToString(),
filterContext.RouteData.Values["action"].ToString());
View("Error", exModel).ExecuteResult(ControllerContext);
}
我还删除了HandleError
中注册的Global.asax.cs
操作过滤器。
注意:共享文件夹中应该有一个名为Error
的视图。
更新:要从Error
视图中提取错误信息,您必须将Error
视图绑定到模型HandleErrorInfo
。
@model System.Web.Mvc.HandleErrorInfo
然后,您可以轻松地在视图中的任何位置访问该异常
@Model.Exception
答案 2 :(得分:0)
创建一个名为Error的视图,并将其添加到Views \ Shared文件夹中。然后在您的catch块中,在您记录错误后,将操作重定向到错误视图。如果要显示复杂消息,请创建错误模型并将其传递给视图,或将信息放入ViewBag。
有关未处理的异常和HTTP错误的信息,请参阅Ropstah的帖子。