zoukankan      html  css  js  c++  java
  • 在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:TempExceptions.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

  • 相关阅读:
    0309. Best Time to Buy and Sell Stock with Cooldown (M)
    0621. Task Scheduler (M)
    0106. Construct Binary Tree from Inorder and Postorder Traversal (M)
    0258. Add Digits (E)
    0154. Find Minimum in Rotated Sorted Array II (H)
    0797. All Paths From Source to Target (M)
    0260. Single Number III (M)
    0072. Edit Distance (H)
    0103. Binary Tree Zigzag Level Order Traversal (M)
    0312. Burst Balloons (H)
  • 原文地址:https://www.cnblogs.com/wangboke/p/5855510.html
Copyright © 2011-2022 走看看