了解操作筛选器 (C#)

Microsoft

下载 PDF

本教程的目的是说明操作筛选器。 操作筛选器是可应用于控制器操作(或整个控制器)的属性,可修改操作的执行方式。

了解操作筛选器

本教程的目的是说明操作筛选器。 操作筛选器是可应用于控制器操作(或整个控制器)的属性,可修改操作的执行方式。 ASP.NET MVC 框架包括多个操作筛选器:

  • OutputCache – 此操作筛选器将控制器操作的输出缓存指定的时间量。
  • HandleError – 此操作筛选器处理执行控制器操作时引发的错误。
  • 授权 - 此操作筛选器使你能够限制对特定用户或角色的访问。

还可以创建自己的自定义操作筛选器。 例如,可能需要创建自定义操作筛选器,以实现自定义身份验证系统。 或者,你可能想要创建一个操作筛选器,用于修改控制器操作返回的视图数据。

本教程介绍如何从头开始构建操作筛选器。 我们将创建一个日志操作筛选器,该筛选器将操作的不同处理阶段记录到 Visual Studio 输出窗口。

使用操作筛选器

操作筛选器是一个属性。 可以将大多数操作筛选器应用于单个控制器操作或整个控制器。

例如,清单 1 中的数据控制器公开一个名为 Index() 的操作,该操作返回当前时间。 此操作使用 OutputCache 操作筛选器进行修饰。 此筛选器会导致操作返回的值缓存 10 秒。

列表 1 – Controllers\DataController.cs

using System;
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
     public class DataController : Controller
     {
          [OutputCache(Duration=10)]
          public string Index()
          {
               return DateTime.Now.ToString("T");
          }
     }
}

如果通过在浏览器的地址栏中输入 URL /Data/Index 并多次点击“刷新”按钮来重复调用 Index() 操作,则会看到 10 秒的相同时间。 操作的 Index() 输出将缓存 10 秒, (请参阅图 1) 。

缓存时间

图 01:缓存时间 (单击以查看全尺寸图像)

在清单 1 中,单个操作筛选器( OutputCache 操作筛选器)应用于 Index() 方法。 如果需要,可以将多个操作筛选器应用于同一操作。 例如,你可能希望将 和 HandleError 操作筛选器都OutputCache应用于同一操作。

在清单 1 中, OutputCache 操作筛选器应用于 Index() 操作。 还可以将此属性应用于 DataController 类本身。 在这种情况下,控制器公开的任何操作返回的结果将缓存 10 秒。

不同类型的筛选器

ASP.NET MVC 框架支持四种不同类型的筛选器:

  1. 授权筛选器 - 实现 IAuthorizationFilter 属性。
  2. 操作筛选器 – 实现 IActionFilter 属性。
  3. 结果筛选器 – 实现 IResultFilter 属性。
  4. 异常筛选器 – 实现 IExceptionFilter 属性。

筛选器按上面列出的顺序执行。 例如,授权筛选器始终在操作筛选器之前执行,而异常筛选器始终在每种类型的筛选器之后执行。

授权筛选器用于实现控制器操作的身份验证和授权。 例如,授权筛选器是授权筛选器的示例。

操作筛选器包含执行控制器操作之前和之后执行的逻辑。 例如,可以使用操作筛选器修改控制器操作返回的视图数据。

结果筛选器包含在执行视图结果之前和之后执行的逻辑。 例如,你可能想要在视图呈现到浏览器之前修改视图结果。

异常筛选器是最后一种要运行的筛选器。 可以使用异常筛选器来处理控制器操作或控制器操作结果引发的错误。 还可以使用异常筛选器来记录错误。

每个不同类型的筛选器都按特定顺序执行。 如果要控制执行同一类型的筛选器的顺序,可以设置筛选器的 Order 属性。

所有操作筛选器的基类都是 System.Web.Mvc.FilterAttribute 类。 如果要实现特定类型的筛选器,则需要创建一个从基 Filter 类继承的类,并实现一个或多个 IAuthorizationFilterIActionFilterIResultFilterIExceptionFilter 接口。

Base ActionFilterAttribute 类

为了更轻松地实现自定义操作筛选器,ASP.NET MVC 框架包含一个基 ActionFilterAttribute 类。 此类实现 和 接口,IActionFilter并从 类继承FilterIResultFilter

此处的术语并不完全一致。 从技术上讲,从 ActionFilterAttribute 类继承的类既是操作筛选器,也是结果筛选器。 但是,从松散意义上说,“操作筛选器”一词用于引用 ASP.NET MVC 框架中的任何类型的筛选器。

ActionFilterAttribute 类具有以下可替代的方法:

  • OnActionExecuting – 在执行控制器操作之前调用此方法。
  • OnActionExecuted – 在执行控制器操作后调用此方法。
  • OnResultExecuting – 在执行控制器操作结果之前调用此方法。
  • OnResultExecuted – 在执行控制器操作结果后调用此方法。

在下一部分中,我们将了解如何实现每种不同的方法。

创建日志操作筛选器

为了说明如何生成自定义操作筛选器,我们将创建一个自定义操作筛选器,用于将处理控制器操作的阶段记录到 Visual Studio 输出窗口。 我们的 LogActionFilter 内容包含在清单 2 中。

清单 2 – ActionFilters\LogActionFilter.cs

using System;
using System.Diagnostics;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1.ActionFilters
{
     public class LogActionFilter : ActionFilterAttribute

     {
          public override void OnActionExecuting(ActionExecutingContext filterContext)
          {
               Log("OnActionExecuting", filterContext.RouteData);       
          }

          public override void OnActionExecuted(ActionExecutedContext filterContext)
          {
               Log("OnActionExecuted", filterContext.RouteData);       
          }

          public override void OnResultExecuting(ResultExecutingContext filterContext)
          {
               Log("OnResultExecuting", filterContext.RouteData);       
          }

          public override void OnResultExecuted(ResultExecutedContext filterContext)
          {
               Log("OnResultExecuted", filterContext.RouteData);       
          }


          private void Log(string methodName, RouteData routeData)
          {
               var controllerName = routeData.Values["controller"];
               var actionName = routeData.Values["action"];
               var message = String.Format("{0} controller:{1} action:{2}", methodName, controllerName, actionName);
               Debug.WriteLine(message, "Action Filter Log");
          }

     }
}

在清单 2 中, OnActionExecuting()OnActionExecuted()OnResultExecuting()OnResultExecuted() 方法都调用 Log() 方法。 方法的名称和当前路由数据将 Log() 传递到 方法。 方法 Log() 将消息写入 Visual Studio 输出窗口, (见图 2) 。

写入 Visual Studio 输出窗口

图 02:写入 Visual Studio 输出窗口 (单击以查看全尺寸图像)

清单 3 中的主控制器演示了如何将日志操作筛选器应用于整个控制器类。 每当调用主控制器公开的任何操作( Index() 方法或 About() 方法)时,处理操作的阶段都会记录到 Visual Studio 输出窗口。

清单 3 – Controllers\HomeController.cs

using System.Web.Mvc;
using MvcApplication1.ActionFilters;

namespace MvcApplication1.Controllers
{
     [LogActionFilter]
     public class HomeController : Controller
     {
          public ActionResult Index()
          {
               return View();
          }

          public ActionResult About()
          {
               return View();
          }
     }
}

总结

本教程介绍了 ASP.NET MVC 操作筛选器。 你了解了四种不同类型的筛选器:授权筛选器、操作筛选器、结果筛选器和异常筛选器。 你还了解了基 ActionFilterAttribute 类。

最后,你了解了如何实现简单的操作筛选器。 我们创建了一个日志操作筛选器,该筛选器将处理控制器操作的阶段记录到 Visual Studio 输出窗口。