动作过滤器
动作过滤器是可以被用作任何目的的多用途过滤器。创建这种过滤器需要实现IActionFilter接口。该接口定义了两个方法:OnActionExecuting()和OnActionExecuted()。前者会在动作方法之前执行,后者会在动作方法之后执行。
public class CustomActionAttribute : FilterAttribute, IActionFilter
{
/// <summary>
/// 在动作方法之后执行
/// </summary>
/// <param name="filterContext"></param>
public void OnActionExecuted(ActionExecutedContext filterContext)
{
//throw new NotImplementedException();
}
/// <summary>
/// 在动作方法之前执行
/// </summary>
/// <param name="filterContext"></param>
public void OnActionExecuting(ActionExecutingContext filterContext)
{
var ActionName = filterContext.ActionDescriptor.ActionName;
var ControllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
filterContext.Result = new HttpNotFoundResult(); //方法结果返回404页面
}
}
实现自定义的动作过滤器,还需要实现FilterAttribute接口。
在OnActionExecuting方法的参数中有个Result属性,你可以通过它来控制返回的结果。
结果过滤器
结果过滤器是多用途过滤器,它会对动作方法产生的结果进行操作。结果过滤器实现IFilterResult接口。继承该接口需要实现OnResultExecuting和OnResultExecuted方法。
OnResultExecuting方法是在“指明意图”之后“执行意图”之前执行。OnResultExecuted方法是在“执行意图”之后执行。(指明意图和执行意图可以参考上面的“理解动作方法”一节)
全局过滤器
全局作用域会被运用于所有动作方法,设置它有一定的约定,我们首先在App_start添加FilterConfig.cs文件,写入以下内容:
namespace Filters
{
public class FilterConfig
{
/// <summary>
/// 全局过滤器
/// </summary>
/// <param name="filter"></param>
public static void RegisterGlobalFilter(GlobalFilterCollection filter)
{
filter.Add(new HandleErrorAttribute());
filter.Add(new CustomActionAttribute());
}
}
}
然后我们在Global.asax文件的Application_Start()添加以下内容:
FilterConfig.RegisterGlobalFilter(GlobalFilters.Filters);