C# 如何为ASP.NET MVC3创建全局自定义错误页?

C# 如何为ASP.NET MVC3创建全局自定义错误页?,c#,asp.net,asp.net-mvc,asp.net-mvc-3,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 3,我是ASP.NET MVC3的新手。如何为MVC3创建全局自定义错误页?一般的想法是,当抛出异常时,它将向用户显示一条通用消息,并将异常记录到数据库中,供开发人员稍后进行调查 提前感谢你的帮助 下面是我在global.asax.cs中最终做的事情: protected void Application_Error() { var exception = Server.GetLastError(); Log.Error("Exception", e

我是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);
    }

Global.asax
文件中,执行
Application\u Error
方法:

    protected void Application_Error() { 
        HttpContext ctx = HttpContext.Current; 
        var error = ctx.Server.GetLastError();
        ctx.Response.Clear(); 
        ctx.Response.End(); 
    }
跟进Maess的评论:


阅读以下内容:

创建一个名为Error的视图,并将其添加到您的Views\Shared文件夹中。然后在catch块中,记录错误后,将操作重定向到error视图。如果要显示复杂的消息,请创建错误模型并将其传递给视图,或将信息放入ViewBag


有关未处理的异常和HTTP错误的信息,请参阅Ropstah的帖子。

我在项目中所做的是创建了一个
BaseController
,并覆盖了
OneException
事件,如下所示

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);
}
我还删除了在
Global.asax.cs
中注册的
HandleError
操作过滤器

注意:共享文件夹中应有一个名为
Error
的视图

更新:要从
错误
视图中提取错误信息,必须将
错误
视图绑定到模型
HandleErrorInfo

@model System.Web.Mvc.HandleErrorInfo
然后,您可以在视图中的任何位置轻松访问异常,如下所示

@Model.Exception

很好,但这只会处理未经处理的异常或HTTP错误,如404500等。@Maess:我添加了一些非常有趣的更具体的信息。如何从视图中提取异常以便显示它?