写在前面的
经过这一版积分系统的重构,也对MVC中过滤器有了一些实际应用的经验,下面我就来结合我们的小项目中的一些具体事例,对MVC过滤器进行一下小小的研究。
什么是过滤器?
- 简单的来讲,就是MVC为了帮我们简化身份验证、异常和页面跳转的一套解决方案。拥有了过滤器的Action或者全局过滤器的项目会在上述的这些操作的效率会大大的提升。
过滤器的分类
全局过滤器 :顾名思义,对全局的controller中的action都加上符合该过滤器过滤规则,从而达到一些公共访问权限的配置。
局部过滤器 :
和全局相反,主要是加在某些需要特定过滤规则的controller的action上,只有当该action被激活以后或者将要激活之前,再来执行过滤器中的过滤规则。
实例
创建自定义的过滤器
当ACTION执行之后进行验证
- 简单的身份验证,从而进行页面跳转过滤器:
[AttributeUsage(AttributeTargets.All, AllowMultiple = true)] //让controller上的标签也起到作用
///需要继承ActionFilterAttribute,这样就可以实现过滤器相关的处理
public class FilterCharacter : ActionFilterAttribute
{
//OnActionExecuted表示该过滤器需要在ACTION执行之后进行规则过滤
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
//GetSession session = new GetSession();
//获取触发当前方法(OnActionExecuting)的Action名字(即:哪个Action方法被执行的时候触发的OnActionExecuting(ActionExecutingContext filterContext))
string actionName = filterContext.ActionDescriptor.ActionName;
//获取触发当前方法的的Action所在的控制器名字
string controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
// 对session进行非空判断
if (System.Web.HttpContext.Current.Session["username"] != null)
{ //进行页面跳转
System.Web.HttpContext.Current.Response.Write("<script type=javascript>window.onload=function(){window.top.location.href='/FrontPage/Index'}</script>");
}else
{
System.Web.HttpContext.Current.Response.Write("<script language=javascript>window.onload=function(){window.top.location.href='HomeBack/HomeIndex'}</script>");
}else
{
System.Web.HttpContext.Current.Response.Write("<script language=javascript>window.top.location.href='/Login/index'</script>");
}
}
}
}
当ACTION执行之前进行规则过滤
- 和上一个过滤器大体相同,只需要将OnActionExecuted改成OnActionExecuting即可。
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);//在调用方法之前进行的操作
.........
}
总结
- 总之,在MVC之后的几个版本里,都对过滤器的注册,执行过程作出了非常好的优化,省去了原来繁琐的JS前台代码的编写才能达到的用户验证、日志IO以及一些异常的处理等功能,所以,熟练掌握过滤器的一些使用规范和技巧,可以让项目开发事半功倍!