MyAuthorizeAttribute : AuthorizeAttribute 2 { [] allowedUsers; [] users) 5 { , , }; 7 } AuthorizeCore(HttpContextBase httpContext) 10 { 11 return httpContext.Request.IsAuthenticated &&allowedUsers.Contains(httpContext.User.Identity.Name, 12 StringComparer.InvariantCultureIgnoreCase); 13 } 14 }
2.4、使用动作过滤器动作过滤器是可以以用于任何目的的多用途过滤器,创建自定义动作过滤器需要实现IActionFilter接口,该接口代码如下所示:
实现OnActionExecting方法
ActionDescriptor
Result
我们可以用过滤器来取消一个请求,通过设置Result属性即可。代码如下所示:
MyActionFilterAttribute : FilterAttribute, IActionFilter 2 { OnActionExecuting(ActionExecutingContext filterContext) 4 { 5 if(filterContext.HttpContext.Request.IsLocal) 6 { 7 filterContext.Result = new HttpNotFoundResult(); 8 } 9 } OnActionExecuted(ActionExecutedContext filterContext) 11 { } 14 }
实现OnActionExecuted方法
我们也可以通过OnActionExecuted方法来执行一些跨越动作方法的任务,下面这个例子是计算动作方法运行的时间,代码如下:
MyActionFilterAttribute : FilterAttribute, IActionFilter 2 { 3 private Stopwatch timer; OnActionExecuting(ActionExecutingContext filterContext) 5 { 6 timer = Stopwatch.StartNew(); 7 } OnActionExecuted(ActionExecutedContext filterContext) 9 { 10 timer.Stop(); 11 if (filterContext.Exception == null) 12 { 13 filterContext.HttpContext.Response.Write( , 15 timer.Elapsed.TotalSeconds)); 16 } 17 } 18 } 19 }
2.5、使用结果过滤器
结果过滤器是多用途的过滤器,他会对动作方法所产生结果进行操作,结果过滤器实现IResultFilter接口,创建自定义结果过滤器需要现IResultFilter接口,该接口代码如下所示:
下面这个例子是计算动作方法返回结果运行的时间,代码如下:
MyResultFilterAttribute : FilterAttribute, IResultFilter 2 { 3 private Stopwatch timer; OnResultExecuting(ResultExecutingContext filterContext) 5 { 6 timer = Stopwatch.StartNew(); 7 } OnResultExecuted(ResultExecutedContext filterContext) 9 { 10 timer.Stop(); , timer.Elapsed.TotalSeconds)); 12 } 13 }
需要注意的是:动作过滤器是运行在页面输出之前,结果过滤器是运行在页面输出之后。
2.6、使用异常过滤器异常过滤器只有在调用一个动作方法而抛出未处理的异常才会运行,这种异常来自以下位置:
A、另一种过滤器(授权、动作、或结果过滤器)。
B、动作方法本身。
C、当动作结果被执行时。
使用内置的异常过滤器
HandleErrorAttribute(
1.ExceptionType
2.View:
3.Master:呈递的视图页的母板页,如果不指定,视图会用其默认的母版页
此过滤器还会给视图传递一个HandleErrorInfo类型的对象给视图,以便视图可以显示一些额外的关于错误的信息。下面是使用异常过滤器的示例。
应用到Index动作方法上: