本教程的目标是解释操作筛选器。操作筛选器是一个属性,您可以将应用于控制器操作 — — 或整个控制器--,修改在其中执行操作的方式。ASP.NET MVC 框架包括几个操作筛选器:
您还可以创建您自己的自定义操作筛选器。例如,您可能想要创建自定义操作的筛选器,以执行自定义身份验证系统。或者,您可能想要创建操作筛选器来修改控制器操作所返回的视图数据。
在本教程中,您学习了如何建立从地面操作筛选器。我们创建登录到 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"); } } }
如果您反复调用Index()
行动通过您的浏览器在地址栏中输入 URL /Data/Index 和多次击中刷新按钮,然后您将看到同一时间为 10 秒。Index()
操作的输出的高速缓存为 10 秒 (见图 1)。
在清单 1 中,一个单一操作筛选器 — — OutputCache
操作筛选器 — — 应用于Index()
方法。如果您需要,您可以对相同的操作,应用多个操作筛选器。例如,你可能想要将OutputCache
和HandleError
操作筛选器应用于相同的操作。
清单 1 中的OutputCache
操作筛选器应用于Index()
行动。您还可以应用此属性DataController
类本身。在这种情况下,由控制器所公开的任何操作返回的结果会缓存 10 秒。
ASP.NET MVC 框架支持四种不同类型的筛选器:
IAuthorizationFilter
属性。IActionFilter
属性。IResultFilter
属性。IExceptionFilter
属性。筛选器的执行上面列出的顺序。例如,授权筛选器将总是在操作筛选器之前执行,异常筛选器将始终执行后每个其他类型的筛选器。
授权筛选器用于实现身份验证和授权的控制器操作。例如,授权筛选器是一个示例授权筛选器。
操作筛选器包含执行之前和之后的控制器操作执行的逻辑。你可以使用操作筛选器,例如,修改控制器操作返回的视图数据。
结果筛选器包含的逻辑,执行之前和之后执行视图结果。例如,您可能想要修改视图结果右视图呈现到浏览器之前。
异常筛选器筛选器运行的最后一个类型。您可以使用异常筛选器来处理您的控制器操作或控制器操作结果由引发的错误。此外可以使用异常筛选器来记录错误。
每种不同类型的筛选器按特定的顺序执行。如果你想要控制在其中执行相同类型的筛选器的顺序你可以设置一个筛选器的 Order 属性。
所有操作筛选器的基类是System.Web.Mvc.FilterAttribute
类。如果您想要执行特定类型的筛选器,然后,您需要创建一个类,从筛选器基类继承并实现一个或更多的IAuthorizationFilter
、 IActionFilter
、IResultFilter
或ExceptionFilter
接口。
为了使您更轻松地实现自定义操作筛选器,ASP.NET MVC 框架包括ActionFilterAttribute
的基类。此类实现的IActionFilter
和IResultFilter
接口,并从Filter
的类继承。
这里的术语不是完全一致的。从技术上讲,从 ActionFilterAttribute 的类继承的类是操作筛选器和结果筛选器。然而,在松散的感觉,word 操作筛选器用来对任何类型的 ASP.NET MVC 框架中的筛选器,请参阅。
ActionFilterAttribute
类的基类具有下列方法,您可以重写:
在下一节中,我们将看到如何可以实现每一种不同的方法。
为了说明如何您可以生成一个自定义操作筛选器,我们将创建一个自定义操作筛选器,日志处理到 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)。
主控制器在清单 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 输出窗口的控制器操作日志操作筛选器。