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 ,完整代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 } }
2)在action上使用自定义的筛选特性: