MVC 过滤器

    CSDN广告是越来越多了,所有博客笔记不再更新,新网址 DotNet笔记

  • 什么是过滤器
过滤器:把附加逻辑注入到请求管道



  • MVC支持的过滤器类型有四种,分别是:Authorization(授权),Action(行为),Result(结果)和Exception(异常)。

如下表:


现在先看一下这些默认实现类都继承了什么东西


如果我们实现了FilterAttribute以及对应的接口,是否可以创建“自定义的过滤器”?答案是肯定的。下面看一下例子,简单权限过滤器的实现,和异常过滤器的实现。

先看一下系统提供的FilterAttribute类,有个印象就行

namespace System.Web.Mvc
{
    // 摘要: 
    //     表示操作和结果筛选器特性的基类。
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
    public abstract class FilterAttribute : Attribute, IMvcFilter
    {
        // 摘要: 
        //     初始化 System.Web.Mvc.FilterAttribute 类的新实例。
        protected FilterAttribute();

        // 摘要: 
        //     获取或设置一个值,该值指示是否可指定筛选器特性的多个实例。
        //
        // 返回结果: 
        //     如果可指定筛选器特性的多个实例,则为 true;否则为 false。
        public bool AllowMultiple { get; }
        //
        // 摘要: 
        //     获取或者设置执行操作筛选器的顺序。
        //
        // 返回结果: 
        //     执行操作筛选器的顺序。默认值为-1  越小越优先执行
        public int Order { get; set; }
    }
}

从上面系统提供的代码中,可以看到,他们提供了一个Order属性,用来指定帅选顺序,如果我们自定义的过滤器继承了这个类

那么我们就可以直接使用这个order属性了如:

        [MyException(Order=1)]//使用自定义的异常类,并制定顺序
        public ActionResult About()
        {
            ViewBag.Message = "Your app description page.";
            return View();
        }





权限过滤器

    public class MyAuthorAttribute : FilterAttribute, IAuthorizationFilter
    {
        /// <summary>
        /// 这两个自定义的属性用来接受我们传递的值,传递方式:
        /// [MyAuthor(admin="adm",password="123")]  
        /// 如果不需要,也可以不传递,如: [MyAuthor],当然如果用不到,你也可以不定义这两个属性
        /// </summary>
        public string admin;
        public string  password;

        public void OnAuthorization(AuthorizationContext filterContext)
        {
            /*
             * 
             * 
               这里写自己的判断逻辑,读数据库,session ,Cookes等等
             * 
             *  
             */

            if (1 > 0)//可在这里判断验证结果,如果失败啊...成功啊...等等
            {
                //跳转到登陆页面
                filterContext.Result = new RedirectResult("/admin/login?" + admin);
            }
            else
            {

            }

        }
    }

权限过滤器在控制器中使用方式

        [MyAuthor(admin = "admin", password = "123456")]
        public ActionResult About()
        {
            ViewBag.Message = "Your app description page.";
            return View();
        }


自定义异常过滤器类的简单实现

    public class MyExceptionAttribute : FilterAttribute, IExceptionFilter
    {
        void IExceptionFilter.OnException(ExceptionContext filterContext)
        {
            //出现异常后,设置一下操作结果
            filterContext.Result = new RedirectResult("/admin/error");
            //设定一个值,用来指定其为已处理异常,这个地方必须设置
            filterContext.ExceptionHandled = true;
        }
    }

自定义异常过滤器在控制器中的使用方式

        [MyAuthor(admin = "admin", password = "123456",Order=1)]
        [MyException]
        public ActionResult Index(string str)
        {
            ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";
            int s = str.Length;
            return View();
        }

        [MyException(Order=1)]//使用自定义的异常类,并制定顺序
        public ActionResult About()
        {
            ViewBag.Message = "Your app description page.";
            return View();
        }




使用全局过滤器

当需要让过滤器应用于MVC应用程序的所有动作方法上的时候,可以考虑全局过滤器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace MvcApplication1
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);

            //我们只要在这个函数里添加一个过滤器就行了
            //这一句话的意思是,注册过滤器为全局的
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AuthConfig.RegisterAuth();
        }
    }
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());//默认的
            filters.Add(new MyExceptionAttribute());//自定义的.本行为自己添加的

            //其实,异常过滤器我们不必重写,一般只需要修改一下默认的异常控制器类的属性就行了
            /*
            filters.Add(new HandleErrorAttribute() { 
            ExceptionType=typeof(Exception),View="error"
            });
             */
        }
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值