📜  ASP.NET MVC-过滤器

📅  最后修改于: 2020-11-21 05:12:55             🧑  作者: Mango


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

为此,ASP.NET MVC提供了筛选器。过滤器是自定义类,它提供声明性和程序性方式,以向控制器操作方法中添加操作前和操作后行为。

动作过滤器

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

  • OutputCache-在指定的时间内缓存控制器操作的输出。

  • HandleError-处理执行控制器动作时引发的错误。

  • 授权-使您可以限制对特定用户或角色的访问。

过滤器类型

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

  • 授权过滤器-实现IAuthorizationFilter属性。

  • 动作过滤器-实现IActionFilter属性。

  • 结果过滤器-实现IResultFilter属性。

  • 异常过滤器-实现IExceptionFilter属性。

筛选器按照上面列出的顺序执行。例如,授权过滤器总是在操作过滤器之前执行,而异常过滤器总是在其他所有类型的过滤器之后执行。

授权过滤器用于对控制器操作实施验证和授权。例如,授权过滤器是授权过滤器的示例。

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

步骤1-打开Visual Studio,然后单击文件→新建→项目菜单选项。

将打开一个新的“项目”对话框。

新项目菜单选项

步骤2-从左窗格中,选择模板→Visual C#→Web。

步骤3-在中间窗格中,选择“ ASP.NET Web应用程序”。

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

MVCFiltersDemo

步骤5-为简单起见,请选择“清空”选项,并在“添加文件夹和核心引用的对象”部分中选中“ MVC”复选框,然后单击“确定”。

它将创建具有最少预定义内容的基本MVC项目。

步骤6-要添加控制器,请在解决方案资源管理器中右键单击控制器文件夹,然后选择添加→控制器。

它将显示“添加支架”对话框。

控制器添加支架对话框

步骤7-选择“ MVC 5控制器–空”选项,然后单击“添加”按钮。

出现“添加控制器”对话框。

添加控制器对话框

步骤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";
      }
   }
}

运行此应用程序时,您会看到浏览器正在显示Index操作方法的结果。

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");
      }
   }
}

请求以下URL http:// localhost:62833 / Home / GetCurrentTime ,您将收到以下输出。

本地主机GetCurrentTime

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

自定义过滤器

为了创建自己的自定义过滤器,ASP.NET MVC框架提供了一个称为ActionFilterAttribute的基类。此类同时实现IActionFilter和IResultFilter接口,并且都从Filter类派生。

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

自定义过滤器

在名称字段中输入“ 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输出窗口中。