ASP.NET MVC - 过滤器

在ASP.NET MVC中,控制器定义通常与可能的用户交互具有一对一关系的操作方法,但有时您希望在调用操作方法之前或在操作方法运行之后执行逻辑./p>

为了支持这一点,ASP.NET MVC提供了过滤器. 过滤器是自定义类,提供声明式和编程式方法,用于向控制器操作方法添加操作前和操作后行为.

操作过滤器

操作过滤器是一种属性,可以应用于控制器操作或整个控制器,以修改操作的执行方式. ASP.NET MVC框架包括几个动作过滤器 :

  • OutputCache : 将控制器操作的输出缓存指定数量的
    时间.

  • HandleError : 处理执行控制器操作时引发的错误.

  • 授权 : 允许您限制对特定用户或角色的访问.

过滤器类型

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

  • 授权过滤器 : 实现IAuthorizationFilter属性.

  • 动作过滤器 : 实现IActionFilter属性.

  • 结果过滤器 : 实现IResultFilter属性.

  • 异常过滤器 : 实现IExceptionFilter属性.

过滤器按上面列出的顺序执行.例如,在操作过滤器和异常过滤器总是在每种其他类型的过滤器之后执行之前,始终执行授权过滤器.

授权过滤器用于实现控制器操作的身份验证和授权.例如,授权过滤器是授权过滤器的一个示例.

让我们通过创建一个新的ASP.Net MVC项目来看一个简单的例子.

第1步 : 打开Visual Studio,然后单击File → 新的 → 项目菜单选项.

打开一个新的项目对话框.

新项目菜单选项

第2步 : 从左侧窗格中,选择Templates →  Visual C# → 网站.

第3步 : 在中间窗格中,选择"ASP.NET Web应用程序".

步骤4 : 在Name字段中输入项目名称MVCFiltersDemo,然后单击ok继续,您将看到以下对话框,要求您设置ASP.NET项目的初始内容.

MVCFiltersDemo

第5步 : 为了简单起见,选择Empty选项并选中'Add folders and core references for'部分中的MVC复选框,然后单击Ok.

它将创建一个基本的MVC项目,其中预定义最少内容.

第6步 : 要添加控制器,请右键单击解决方案资源管理器中的控制器文件夹,然后选择Add → 控制器.

它将显示Add Scaffold对话框.

Controller Add Scaffold Dialog

第7步 : 选择MVC 5 Controller  -  Empty选项并单击"Add"按钮.

将出现Add Controller对话框.

添加控制器对话框

步骤8 : 将名称设置为HomeController并单击"添加"按钮.

您将在Controllers文件夹中看到一个新的C#文件"HomeController.cs",该文件在Visual Studio中也可以打开进行编辑.

应用操作过滤器

操作过滤器可以应用于单个控制器操作或整个控制器.例如,操作过滤器 OutputCache 应用于名为Index()的操作,该操作返回字符串.此过滤器使操作返回的值缓存15秒.

为了使其成为一个有效的示例,让我们通过更改名为 Index

using System;
using System.Collections.Generic;
using System.Linq;

using System.Web;
using System.Web.Mvc;

namespace MVCFiltersDemo.Controllers {
   public class HomeController : Controller{
      // GET: Home
      [OutputCache(Duration = 15)]
		
      public string Index(){
         return "This is ASP.Net MVC Filters Tutorial";
      }
   }
}

运行此应用程序时,您将看到浏览器显示的结果索引操作方法.

MVC过滤器教程

让我们添加另一个动作方法,它将显示当前时间.

namespace MVCFiltersDemo.Controllers{
   public class HomeController : Controller{
      // GET: Home
		
      [OutputCache(Duration = 15)]
      public string Index(){
         return "This is ASP.Net MVC Filters Tutorial";
      }
		
      [OutputCache(Duration = 20)]
      public string GetCurrentTime(){
         return DateTime.Now.ToString("T");
      }
   }
}

请求以下网址, http://localhost:62833/Home/GetCurrentTime ,您将收到以下输出.

Localhost GetCurrentTime

如果刷新浏览器,您将看到相同的时间,因为操作缓存了20秒.它将在20秒后刷新时更新.

自定义过滤器

要创建自己的自定义过滤器,ASP.NET MVC框架提供了基类,称为ActionFilterAttribute.这个类实现了IActionFilter和IResultFilter接口,两者都是从Filter类派生的.

让我们看看一个简单的自定义过滤器示例,方法是在项目中使用ActionFilters创建一个新文件夹.添加一个类,右键单击ActionFilters文件夹,然后选择Add → 类.

自定义过滤器

输入'MyLogActionFilter'命名字段,然后单击"添加"按钮.

此类将派生自 ActionFilterAttribute ,它是一个基类并覆盖以下方法.以下是MyLogActionFilter的完整实现.

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;

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

namespace MVCFiltersDemo.ActionFilters {
   public class MyLogActionFilter : 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");
      }
   }
}

现在让我们使用以下代码将日志过滤器应用于HomeController.

using MVCFiltersDemo.ActionFilters;
using System;
using System.Collections.Generic;
using System.Linq;

using System.Web;
using System.Web.Mvc;

namespace MVCFiltersDemo.Controllers {
   [MyLogActionFilter]
   public class HomeController : Controller{
      // GET: Home
		
      [OutputCache(Duration = 10)]
      public string Index(){
         return "This is ASP.Net MVC Filters Tutorial";
      }
		
      [OutputCache(Duration = 10)]
      public string GetCurrentTime(){
         return DateTime.Now.ToString("T");
      }
   }
}

运行应用程序,然后观察输出窗口.

输出窗口

如上面的屏幕截图所示,记录了处理操作的各个阶段到Visual Studio输出窗口.