• ASP.NET MVC 过滤器(五)


     

    ASP.NET MVC 过滤器(五)

    前言

    上篇对了行为过滤器的使用做了解说,假设在控制器行为的运行中遇到了异常怎么办呢?没关系,还好框架给我们提供了异常过滤器,在本篇中将会对异常过滤器的使用做一个大概的解说。

    ASP.NET MVC过滤器

    • 过滤器在系统框架中的总体对象模型
    • IAuthorizationFilter授权认证过滤器的运行过程
    • 使用IAuthorizationFilter过滤器
    • IActionFilter行为过滤器的运行过程
    • 自己定义实现IActionFilter行为过滤器
    • 异常过滤器的使用

    异常过滤器的使用

    在使用异常过滤器之前,我们要看一下它们的结构:

        public interface IExceptionFilter
        {
            void OnException(ExceptionContext filterContext);
        }

    IExceptionFilter接口类型是异常过滤器必须实现的接口。当然了还有FilterAttribute特性类型这是必需要实现的。

    在此不正确FilterAttribute特性类型做什么介绍。

    我们看一下IExceptionFilter接口类型中的OnException()方法中的有个ExceptionContext类型的參数,ExceptionContext类型是遗产过滤器參数上下文对象。继承自ControllerContext类型。这样的编程模式在MVC框架中随处可见了不做多的解释了。

    在MVC框架中给我们默认的提供了一个异常过滤器类型:

    代码1-1

        public class HandleErrorAttribute : FilterAttribute, IExceptionFilter
        {
            // 摘要:
            //     初始化 System.Web.Mvc.HandleErrorAttribute 类的新实例。
            public HandleErrorAttribute();
            public Type ExceptionType { get; set; }
            public string Master { get; set; }
            public string View { get; set; }
            public virtual void OnException(ExceptionContext filterContext);
        }

    ExceptionType属性相应要处理的异常类型。假设设置某种异常类型值那么异常过滤器仅仅会针对这个类型的异常来进行做处理,默认值是处理全部异常类型。

    Master属性则是设置在处理异常之后所要显示视图所用的布局。

    View属性是设置在处理异常之后所要显示的视图名称。

    来看演示样例:

    演示样例还是接着上个篇幅的演示样例。没看过前篇的朋友也没什么影响非常easy的演示样例。

    代码1-2

            public ActionResult Index()
            {
                int i = 0;
                int j = 3 / i;
                return View(_DataStandard.GetProducts());   
            }

    首先我们在控制器的Index()方法中定义个错误处理,0是不能作为除数的处理到这必须报异常的。执行的结果如图1所看到的。

    图1

    非常明白的报出了异常的所在。这是我们不希望的看见的,接下来我们把异常过滤器给使用上:

    代码1-3

            [HandleError]
            public ActionResult Index()
            {
                int i = 0;
                int j = 3 / i;
                return View(_DataStandard.GetProducts());   
            }

    这时你会发现执行的结果和图1中所看到的的一样,这是坑爹呢??!。!

    !当然不是我们须要在Web.config文件的中的<system.web>节点下做相相应的配置才干够。

    代码1-4

    <customErrors  mode="On"" />

    须要加入代码1-4中的内容到system.web节点下,这是我们再来看一下执行的结果图。

    图2

    为什么会显示这个页面,这跟HandleErrorAttribute类型中的OnException(ExceptionContext filterContext)方法默认实现有关系。它默认设置就是server错误信息,那我们怎么自己定义的指定我们想显示的页面,或者是看到我们想具体看到的错误信息呢?我们再来重写一下OnException()方法吧。

    代码1-5

    public class MyCustomHandleErrorAttribute : HandleErrorAttribute
        {
            public override void OnException(ExceptionContext filterContext)
            {
                if (filterContext == null)
                {
                    throw new ArgumentNullException("filterContext");
                }
                if (filterContext.Exception!=null)
                {
                    Exception innerException = filterContext.Exception;
                    if (!filterContext.ExceptionHandled)
                    {
                        string controllerName = (string)filterContext.RouteData.Values["controller"];
                        string actionName = (string)filterContext.RouteData.Values["action"];
                        HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
                        ViewResult result = new ViewResult
                        {
                            ViewName = "Error",
                            MasterName = this.Master,
                            ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
                            TempData = filterContext.Controller.TempData
                        };
                        filterContext.Result = result;
                        filterContext.ExceptionHandled = true;
                    }
                }
    
            }
        }

    在上面的MyCustomHandleErrorAttribute类型实现中。我们仅仅须要关注ExceptionContext filterContext參数中的Result的设置,在代码1-5中我们指定了Error这个视图,而且还实例化了HandleErrorInfo类型作为视图模型传递到视图中,我们如今要新建一个视图,在当前控制器的目录下View/[controllername]/Error.cshtml新建这个视图文件,而且选择为强类型视图,类型则为HandleErrorInfo类型,我们看一下视图的定义。

    代码1-6:

    @model HandleErrorInfo
    @{
        ViewBag.Title = "Error";
    }
    <h2>
        Error</h2>
    <p>
        异常类型:<b>@Model.Exception.GetType().Name</b>
        异常所在控制器:<b>@Model.ControllerName</b>
        异常所在控制器行为:<b>@Model.ActionName</b>
    </p>
    <p>
        具体信息:<b>@Model.Exception.Message</b>
    </p>

    如今我们改动一下代码1-3中的所使用的过滤器,改动为我们代码1-5中定义的自己定义类型。再看一下执行结果:

    到这里异常过滤器的基础使用也就解说完成了。另一种结果过滤器就不做解说了。基础结构和行为过滤器近乎同样使用方式也是,使用一下便知其使用方法。

     

     

     

    作者:金源

  • 相关阅读:
    线性dp 打鼹鼠
    区间dp 能量项链 洛谷p1063
    洛谷 CF1012C Hills (动态规划)
    交作业了 动态规划 木棍加工
    最短路之Floyd
    最小生成树
    寒假集训并查集初级版
    【倍增DP】——保卫王国
    bootstrap四部分概述
    zrender初识
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5078146.html
Copyright © 2020-2023  润新知