关于过滤器的方式

Posted xiaoyangshu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于过滤器的方式相关的知识,希望对你有一定的参考价值。

技术图片

1.创建过滤类  

技术图片
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace P01MVCFilter.Filters
{
    /// <summary>
    /// Action方法 过滤器 类
    /// </summary>
    public class MyActionFilterAttribute : ActionFilterAttribute
    {
        /// <summary>
        /// 在  Action方法之前 调用
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //1. RouteData 中 保存了 当前请求 匹配的 路由信息和路由对象
            //             如果本次请求 是请求了某个 区域 里的 控制器方法,还可以通过filterContext.RouteData.DataTokens["area"]获取区域名

            //string strArea = filterContext.RouteData.DataTokens["area"].ToString();
            string strController = filterContext.RouteData.Values["controller"].ToString();
            string strAction = filterContext.RouteData.Values["action"].ToString();
            //filterContext.RouteData.GetRequiredString

            //2.另一种方式 获取 请求的 类名和方法名
            string strAction2 = filterContext.ActionDescriptor.ActionName;
            string strController2 = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;

            //2.1检查 被请求方法 是否 加了 MoneyAttribute 特性
            if (filterContext.ActionDescriptor.IsDefined(typeof(Filters.MoneyAttribute), false))
            {
                //直接为 请求 设置 返回结果,而不执行 对应的 Action 方法,也不执行 OnActionExcuted,但是,会执行 Result过滤器和 生成视图
                filterContext.Result = new ContentResult() { Content = "<br/>哈哈哈,直接被跳过了吧~~~!<br/>" };
            }
            

            

            filterContext.HttpContext.Response.Write("哇哈哈哈~!OnActionExecuting<br/>");
            base.OnActionExecuting(filterContext);
        }

        /// <summary>
        /// 在  Action方法之后 调用
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            filterContext.HttpContext.Response.Write("哇哈哈哈~!OnActionExecuted<br/>");
            base.OnActionExecuted(filterContext);
        }
    }
}
View Code

2.给需要过滤的方法打上标签

技术图片
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace P01MVCFilter.Controllers
{
    //[Filters.MyActionFilter]//2.将 过滤器 加到当前类上
    public class HomeController : Controller
    {
        public HomeController()
        {
            System.Web.HttpContext.Current.Response.Write(" HomeController 构造函数<br/> ");
        }

        //[Filters.MyActionFilter]//1.将 过滤器 加到方法上
        //[Filters.Money]
        [Filters.MyResultFilter]
        [Filters.MyAuthorize]
        public ActionResult Index()
        {
            Response.Write("Index 方法<br/>");
            ViewBag.name = "时间:" + DateTime.Now;
            return View();
        }

        public ActionResult GetDate()
        {
            return View();
        }

        //[Filters.MyHandleError]
        public ActionResult GetErr()
        {
            int a = 0;
            int b = 1 / a;
            return View();
        }

    }
}
View Code

3.或者全局打上标签  +FilterConfig

using System.Web;
using System.Web.Mvc;

namespace P01MVCFilter
{
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            //filters.Add(new HandleErrorAttribute());

            //3. 添加全局过滤器
            filters.Add(new Filters.MyActionFilterAttribute());

            filters.Add(new Filters.MyHandleErrorAttribute());
        }
    }
}

 

以上是关于关于过滤器的方式的主要内容,如果未能解决你的问题,请参考以下文章

为什么我不能在此片段中生成唯一对象数组?

关于片段生命周期

关于过滤器的方式

关于js----------------分享前端开发常用代码片段

关于在各浏览器中插入音频文件的html代码片段

关于 Shiro 的权限匹配器和过滤器