引言:
APS.NET MVC中(以下简称“MVC”)的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前前后后如果想再加一些额外的逻辑处理。这时候就用到了过滤器。MVC支持的过滤器类型有四种,分别是:Authorization(授权),Action(行为),Result(结果)和Exception(异常)。如下表,
过滤器类型 | 接口 | 描述 |
Authorization | IAuthorizationFilter | 此类型(或过滤器)用于限制进入控制器或控制器的某个行为方法 |
Exception | IExceptionFilter | 用于指定一个行为,这个被指定的行为处理某个行为方法或某个控制器里面抛出的异常 |
Action | IActionFilter | 用于进入行为之前或之后的处理 |
Result | IResultFilter | 用于返回结果的之前或之后的处理 |
但是默认实现它们的过滤器只有三种,分别是Authorize(授权),ActionFilter,HandleError(错误处理);各种信息如下表所示
过滤器 | 类名 | 实现接口 | 描述 |
ActionFilter | AuthorizeAttribute | IAuthorizationFilter | 此类型(或过滤器)用于限制进入控制器或控制器的某个行为方法 |
HandleError | HandleErrorAttribute | IExceptionFilter | 用于指定一个行为,这个被指定的行为处理某个行为方法或某个控制器里面抛出的异常 |
自定义 | ActionFilterAttribute | IActionFilter和IResultFilter | 用于进入行为之前或之后的处理或返回结果的之前或之后的处理 |
在这里我主要介绍一下自定义过滤器 以实现登录为例子。测试环境:VS2017 MVC。
登录具体功能:未登录的用户则返回登录界面,已登录的用户则通过!
首先:新建一个类:LoginHelper
public class LoginHelper:ActionFilterAttribute//继承自定义过滤器接口:ActionFilterAttribute
{
//OnActionExecuting方法是在Action执行之前会被触发执行的一个方法。重写该方法!
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
**********这里放自己的逻辑代码Start************/
string result = "";
if (HttpContext.Current.Session["userName"]!= null)//验证session是否有值,用以判断是否登录
{
result = HttpContext.Current.Session["userName"].ToString();
}
if (result == "")
{
//未登录则返回登录界面
filterContext.HttpContext.Response.Write("<script>alert('当前会话已失效,请重新登录!');window.top.location.href='/Logins/Index'</script>");
}
**********这里放自己的逻辑代码End************/
}
}
自定义过滤器已经定义好了,但是怎么使用呢?比如说,我想让它过滤指定的Action或者方法怎么办呢!
第一种方法:直接定义在方法或者Action上。
//比如这是一个后台的修改页面,只有通过登录后才能访问该页面,则可以这样写!
[LoginHelper]
public ActionResult Update_Page()
{
return View();
}
这样是可以的,但很麻烦,我们不可能每个方法都去定义一个过滤器吧。
第二种方法:定义在类上。
/// <summary>
/// 这是一个继承了Controller类的控制器
/// </summary>
[LoginHelper]//在控制器上加过滤器,则该控制器中所有方法都会进行过滤。
public class HomeController : Controller
{
}
好啦,这样子就Ok啦。(本人才疏学浅,大佬路过勿喷!)
原文地址: