如何为ASP.NET MVC3创建一个全局的自定义错误页面?
如何为ASP.NET MVC3创建一个全局的自定义错误页面?
我是全新接触ASP.NET 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);
}
在ASP.NET MVC3中创建全局自定义错误页面的方法
在我的项目中,我创建了一个BaseController并重写了OnException事件,代码如下:
protected override void OnException(ExceptionContext filterContext) { // 使用log4net进行日志记录,或者使用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 action filter。
注意:你应该在shared文件夹中有一个名为Error的视图。
更新:为了从Error视图中提取错误信息,你需要将Error视图绑定到HandleErrorInfo模型。
System.Web.Mvc.HandleErrorInfo
然后你可以在视图中的任何位置轻松访问异常:
.Exception
这真的很有趣。我该如何从视图中提取异常并显示它?
在ASP.NET MVC3中,我们如何创建一个全局的自定义错误页面?
问题的出现原因:
在ASP.NET MVC3中,默认情况下,当发生未处理的异常时,系统会自动显示一个包含异常信息的错误页面。但是,这个错误页面可能不符合我们的需求,我们可能希望显示一个自定义的错误页面来提供更好的用户体验。因此,我们需要找到一种方法来创建一个全局的自定义错误页面。
解决方法:
1. 首先,在Views\Shared文件夹中创建一个名为Error的视图页面。这个视图页面将用于显示自定义的错误信息。
2. 在捕获异常的代码块中,先记录错误日志,然后将操作重定向到Error视图页面。可以使用下面的代码来实现重定向:
catch (Exception ex) { // 记录错误日志 // ... // 重定向到Error视图页面 return RedirectToAction("Error", "Shared"); }
3. 如果你希望显示更复杂的错误信息,你可以创建一个Error模型,并将其传递给Error视图页面。或者,你也可以将错误信息放入ViewBag中,在视图页面中进行访问和显示。
除了上述方法外,如果你想了解关于未处理异常和HTTP错误的更多信息,可以参考Ropstah的帖子。
问题的原因是在ASP.NET MVC3中,没有默认的全局自定义错误页面。解决方法是在Global.asax
文件中实现Application_Error
方法来处理错误。实现的代码如下:
protected void Application_Error() { HttpContext ctx = HttpContext.Current; var error = ctx.Server.GetLastError(); ctx.Response.Clear(); ctx.Response.End(); }
同时,可以参考Error Handling in asp.net mvc 3来了解更多关于错误处理的信息。但需要注意的是,这种方法只能处理未处理的异常或HTTP错误,如404、500等。为了处理更具体的错误,可以根据需要在Application_Error
方法中添加适当的代码。