- MVC过滤器的定义
- 怎么使用MVC过滤器
- MVC过滤器的优缺点
MVC过滤器定义
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 | 用于进入行为之前或之后的处理或返回结果的之前或之后的处理 |
怎么使用MVC过滤器
模拟菜单权限控制
public class AuthCheckFilter: ActionFilterAttribute
{
public bool isCheck { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!isCheck)
{
return;
}
//获取当前请求的控制器和方法
var controllerName =
filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
//获取当前请求的控制器和名称
var actionName = filterContext.ActionDescriptor.ActionName;
string path = ("/" + controllerName + "/" + actionName).ToLower();
//将这个”/控制器/方法“ 与当前登陆人能操作的菜单进行匹配
var Myurl = filterContext.HttpContext.Session["Myurl"] as List<string>;
if (!Myurl.Contains(path))
{
//如果查找没有,就跳转首页
filterContext.Result = new RedirectResult("/home/index");
}
}
}
在MVC 中的 APP_start中的FilterConfig.cs
定义一个方法
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
// 默认的过滤器
filters.Add(new HandleErrorAttribute());
//当ischeck为 true拦截 添加刚写的过滤器
filters.Add(new AuthCheckFilter() { isCheck = true });
}
MVC 过滤器的优缺点
MVC优点:
1.大型开发的时候容易维护,扩展性很好。
2.能够对HTML有完全的控制权限,对于前端来说很友好。
3.能够进行单元测试,保证功能的实现。
缺点:
1.没有那么多的现成控件使用,开发效率相对较低(特别是对于菜鸟来说)
2.对于大型数据的处理比较难,还是因为没有现成girdview控件。这个控件虽然生成的html结构异常复杂,但是对于处理大量而且复杂的数据来说是很不错的。不过一般网站是很少有这种大量且复杂的数据,很多菜鸟都是用这个大炮来打蚊子,浪费且低效率。对于网站开发来说这个控件应该不推荐使用。