MVC之特性

1.创建自定义特性

  类继承于Attribute类,并且自定义特性的命名规则于:XXXXAttriubute

1  /// <summary>
2     /// 跳过登陆 标记:任何类 或者方法 有此标记,则不再验证是否有Session
3     /// </summary>
4     public class SkipLoginAttribute:Attribute
5     {
6     }


2.给方法或类写上特性

  可以写上多个特性,以逗号分开

  

  [HttpGet,MyAttr.SkipLogin]
        public ActionResult Login()
        {
            //Request.HttpMethod=="get"
            return View();
        }

3.创建自定义全局过滤器

  在Filters文件夹里面写上自定义过滤器

  

/// <summary>
    /// 自定义 Action 过滤器
    /// </summary>
    public class IsLoginAttribute : ActionFilterAttribute
    {
        /// <summary>
        /// 在当前mvc网站的 任何一个 控制器类 的 任何一个 Action方法被请求时 都会先调用 OnActionExecuting
        /// </summary>
        /// <param name="filterContext">过滤器上下文对象</param>
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //0.检查 被请求 的 类 或者 方法 是否有 MyAttr.SkipLogin 标记,如果有,则不需要验证
            Type skipLoginType = typeof(MyAttr.SkipLoginAttribute);
            //0.1检查 被请求的【方法-ActionDescriptor】是否有 贴 标记
            if (!filterContext.ActionDescriptor.IsDefined(skipLoginType, false) //ActionDescriptor 是被请求的方法描述器
                //0.2检查 被请求的 方法所在的【控制器类-ControllerDescriptor】是否 有标记
                 && !filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(skipLoginType, false))
            {

                //1.判断用户Session是否存在,如果不存在,则跳转到登陆页面
                if (filterContext.HttpContext.Session == null || filterContext.HttpContext.Session["uinfo"] == null)
                {
                    //filterContext.HttpContext.Response.Redirect("/user/login?nologin");
                    //filterContext.Result = new RedirectResult("/user/login?nologin");
                    //当在过滤器中 为 过滤器上下文的 Result属性赋值后,之后的 Action方法执行 等操作都会 被 取消!
                    //而是 在这个 过滤器中 直接 生成 响应报文
                    filterContext.Result = new ContentResult()
                    {
                        Content = "<script>alert('对不起,你好像木有登陆哦~~~~~~');window.location='/user/login';</script>",
                        ContentType = "text/html"
                    };
                }
            }
        }
    }


4.添加全局过滤器

  在APP_Start文件夹里面的过滤器配置类上,添加自定义过滤器

  

public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
            //添加 自定义 全局过滤器
            filters.Add(new P01MVC.Filters.IsLoginAttribute());
        }
    }
原文地址:https://www.cnblogs.com/huanglexian/p/3622306.html