ASP.NET MVC——自定义过滤器Filter

简介:过滤器是对控制器方法前或者后添加的一些判断、本文主要介绍自定义过滤器


1.过滤器的分类

①Authorize(授权):该过滤器用来限制进入控制器的行为

②HandleError(处理错误):该过滤器用来制定一个行为、该行为用来处理某个方法中跑出的异常

2.过滤器的三种应用方式

1.应用到动作方法上:作用于该动作方法

2.应用到控制器上:作用于所有动作方法

3.应用到整个程序中:作用于所有动作方法

     filters.Add(new HandleErrorAttribute());

3.自定义过滤器必须满足的条件

1)实现任意一个或多个过滤器接口

2)继承FilterAttribue类

3)实现如下

  public class LogExceptionFilter : FilterAttribute, IExceptionFilter
    {
        public void OnException(ExceptionContext filterContext)
        {
            //定义日志文件路径
            string filePath = filterContext.HttpContext.Server.MapPath(@"~\log.txt");
            //写入日志信息
            using (StreamWriter sw = File.AppendText(filePath))
            {
                sw.WriteLine("时间:{0}", DateTime.Now.ToString());
                sw.WriteLine("控制器:{0}", filterContext.RouteData.Values["Controller"]);
                sw.WriteLine("动作方法:{0}", filterContext.RouteData.Values["Action"]);
                sw.WriteLine("异常信息:{0}", filterContext.Exception.Message);
            }
        }
    }

4.自定义过滤器的使用

1.作为特性添加在某个控制器方法上

      [LogExceptionFilter]//在指定的动作方法定义自定义过滤器
        [HttpPost]
        public ActionResult Register(Customer objCustomer, string validateCode)
        {
       
            if (ModelState.IsValid)
            {
                if (String.Compare(TempData["ValidateCode"].ToString(), validateCode, true) != 0)
                {
                    ModelState.AddModelError("ValidateCode", "验证码不正确,请重新输入!");
                    return View("Register");
                }              
                CustomerManager cManager = new CustomerManager();
                if (!cManager.Register(objCustomer))
                {
                    ModelState.AddModelError("doubleUser", "当前用户名已被使用,请重新输入!");
                    return View("Register");
                }
                else
                {
                    return Content("<script>alert('注册成功,请继续购物!');window.location='" 
                        + Url.Content("~/") + "'</script>");
                }
            }
            else re

5.过滤器的优先级

1.控制器类的过滤器优先于动作方法上的过滤器

2.控制器可以用Order参数进行排序

3.在控制器中重写过滤器方法优先级最高

本文作为学习记录、如有错误之处请斧正。

猜你喜欢

转载自blog.csdn.net/qq_35574190/article/details/89102311