MVC 拦截指定的action

有时,我们需要在特定的一些aciton中做校验。比如:验证是否登录。实现方式有两种:

一、编写一个公共的方法专门用于实现是否登录的验证,然后在每个需要进行验证的aciton的头部去调用该方法,根据方法的返回值做进一步处理

二、定义一个特性类,在特性类中去判断当前是否登录。然后在需要验证登录的aciton上加入定义的特性

本文主要说下如何实现第二种方式。


1、定义一个特性类,使之继承System.Web.Mvc.FilterAttribute, System.Web.Mvc.IActionFilter

      System.Web.Mvc.FilterAttribute:筛选特性的抽象基类

      System.Web.Mvc.IActionFilter:筛选器接口

2、在特性类中实现OnActionExecuting方法。

      在System.Web.Mvc.IActionFilter中定义了两个方法:

      OnActionExecuted:在action执行后执行的方法

      OnActionExecuting:在aciton执行前执行的方法

3、在需要进行特性过滤、拦截的action上加入定义的特性 [你的特性类]


给大家参考下,我的项目中特性筛选应用。用于验证视图页面权限

1)自定义的筛选特性:ValidateUrl ,完整代码如下:

using Easyman.Managers;
using Easyman.Sys;
using System;
using System.Web.Mvc;

namespace Easyman.Common.Mvc
{
    public class ValidateUrl : System.Web.Mvc.FilterAttribute, System.Web.Mvc.IActionFilter
    {

        #region 执行action后执行这个方法
        /// <summary>
        /// 执行action后执行这个方法
        /// </summary>
        /// <param name="filterContext"></param>
        void System.Web.Mvc.IActionFilter.OnActionExecuted(System.Web.Mvc.ActionExecutedContext filterContext)
        {

        }
        #endregion


        #region 执行action前执行这个方法 
        /// <summary>
        /// 执行action前执行这个方法
        /// </summary>
        /// <param name="filterContext"></param>
        void System.Web.Mvc.IActionFilter.OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext)
        {

            string url = filterContext.HttpContext.Request.Url.ToString();//url路径
            string path = filterContext.HttpContext.Request.Path;//目录
            var urlRoot = url.Split(new[] { path }, StringSplitOptions.None)[0];
            var curUrl = System.Web.HttpUtility.UrlDecode(url).Substring(urlRoot.Length + 1);
            //从ioc容器中获取当前待使用接口的实例
            var _modulesService = Abp.Dependency.IocManager.Instance.Resolve<IModulesAppService>();
            var result = _modulesService.ValidateUrlRole(curUrl);
            if(!result)
            {
                filterContext.Result = new RedirectToRouteResult(new System.Web.Routing.RouteValueDictionary(new { controller = "Home", action = "NoAccess" }));  //重定向
            }
        }
        #endregion
    }
}
View Code

2)在action上使用自定义的筛选特性:

原文地址:https://www.cnblogs.com/senyier/p/7500136.html