在ASP.NET MVC自定义错误页面

异常处理跳转页面

第一步,在项目的Web.config文件中找到节点<system.web>

在此节点下添加配置(Error为定义的控制器也可以多添加些error标签用于区分不同的错误)

<customErrors mode="On" defaultRedirect="~/Error/index">
          <error statusCode="404" redirect="~/Error/Error404" />
 </customErrors>

   CustomErrors Mode的值可以是Off、On、RemoteOnly,不同的值定义研发阶段或产品发布后的行为。

   On:开启自定义错误处理。

   Off:关闭自定义错误处理,当发生异常时,就会看到ASP.NET的黄页信息。
   RemoteOnly:如果在服务器上运行程序(http://localhost),当发生异常时,不会看到自定义异常信息,如果通过其他机器访问该程序,会看到自定义异常信息。该选项常用    于开发人员调试程序,如果出现异常,开发人员可以通过本地访问来查看异常详细信息,而远程访问的用户看到的是自定义的异常。
  

第二步,针对404错误在页面上设置状态码

第三步,在App_Start文件下找到FilterConfig文件打开之后注释掉下图代码

 public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
           // filters.Add(new HandleErrorAttribute());
        }

注意点

   如果控制器使用了[HandleError]特性,并且启用了CustomError,当有未处理的异常发生时,MVC在被执行的HttpRequest的上下文中查找”Error”视图(当前Controler对     应的View文件夹中或Shared文件夹中),并呈现给用户。在这种情况下,CustomError的”defaultRedirect”和”redirect”属性会失效。注意:如果找不到Error视图,会使       用”defaultRedirect”和”redirect”的定向

 如果控制器没有使用[HandleError],并且启用了CustomError,当有未处理的异常发生时,会重定向到”defaultRedirect”和”redirect”属性指定的url,如上例的/Error/

提示:

 ASP.N.NET MVC3以后中,默认对所有的Controller注册全局HandleError,因此不用担心应用程序中的Controller没有使用HandleError。在之前版本中没有全局过滤器,HandleError必须对每个action或controller手工定义。MVC3版本 Global.cs 文件下的 RegisterGlobalFilters,MVC4以后的在在App_Start文件下找到FilterConfig文件中

其他:

 在web.config的CustomError中,也可以设置当异常出现重新定向到一个静态页面,如下:

  <customErrors mode="On" defaultRedirect="Custom404.htm">
  </customErrors>
  注意:静态页面需要放到web网站根目录下,否则无法定向到

 

异常处理时执行其他功能的方法:

 
1、重写Controller的OnException方法
如果我们不仅仅在出现异常时显示自定义的错误页面,需要记录错误日志,那么可以通过继承Controller类并重些OnException方法实现。如果我们MVC程序的所有Controller都需要记录日志,可以创建一个BaseController,重写OnExcetion方法,然后其他需要记录日志的Controller继承BaseController即可。例如:
  public class BaseController : Controller
  {
        protected override void OnException(ExceptionContext filterContext)
       {
            // 此处进行异常记录,可以记录到数据库或文本,也可以使用其他日志记录组件。
            // 通过filterContext.Exception来获取这个异常。
            string filePath = @"D:\Temp\Exceptions.txt";
            StreamWriter sw = System.IO.File.AppendText(filePath);
            sw.Write(filterContext.Exception.Message);
            sw.Close();
            // 执行基类中的OnException
            base.OnException(filterContext);

 }

那么其他继承自BaseController的Controller就会实现记录错误日志的功能。

2、创建FilterAttribute

通过FilterAttribute,并把它添加到全局过滤器集合中就可以提供给整个应用程序使用,如果只需要在某几个Action中使用,可以在Controller的Action中添加此特性。

Filter定义如下:

public class LogExceptionFilterAttribute : FilterAttribute, IExceptionFilter


{
    public void OnException(ExceptionContext filterContext)
    {
        // 添加记录日志代码
    }
}
 
如果要应用给所有的Controller的所有Action,在Global.asax.cs中实现下面代码即可:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new LogExceptionFilterAttribute());
    filters.Add(new HandleErrorAttribute());
}
  
或者给只需要使用此特性的Controller或Action添加 :
 
[LogExceptionFilter()]
public ActionResult About()
{
    throw new Exception("出错.");
}

原文链接:http://www.myexception.cn/web/1130191.html

转载于:https://www.cnblogs.com/wangboke/p/5855510.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值