ASP.NET MVC - 过滤器

ASP.NET MVC - 过滤器 首页 / ASP.Net MVC入门教程 / ASP.NET MVC - 过滤器

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

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

Action 过滤器

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

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

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

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

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

步骤1 - 打开Visual Studio,然后单击File→New→Item菜单选项。

将打开一个" New Project"对话框。

New Project Menu Option

步骤2 - 在左侧窗格中,选择Template→Visual C#→Web。

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

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

MVCFiltersDemo

步骤5 - 为了简化操作,请选择"Empty"选项,然后在"Add folders and core references for"部分中选中" MVC"复选框,然后单击"OK"。

步骤6 - 要添加控制器,请右键单击Solution Explorer中的controller文件夹,然后选择Add→Controller。

它将显示"Add Scaffold"对话框。

无涯教程网

Controller Add Scaffold Dialog

步骤7 - 选择" MVC 5 Controller-Empty"选项,然后单击"Add"按钮。

出现"Add Controller"对话框。

Add Controller Dialog

步骤8 - 将名称设置为HomeController,然后点击"Add"按钮。

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

应用 Action 过滤器

Action filter可以应用于单个控制器Action或整个控制器,如,将Action过滤器 OutputCache 应用于返回索引字符串的名为Index()的Action,此过滤器使操作返回的值被缓存15秒。

为了使这个示例可行,让我们使用以下代码通过更改名为 Index 的操作方法来修改控制器类。

链接:https://www.learnfk.comhttps://www.learnfk.com/asp.net_mvc/asp.net-mvc-filters.html

来源:LearnFk无涯教程网

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 Filters Tutorial

让我们添加另一种操作方法,该方法将显示当前时间。

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 ,您将收到以下输出。

Localhost GetCurrentTime

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

自定义过滤器

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

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

Custom Filter

在名称字段中输入" MyLogActionFilter",然后单击"Add"按钮。

此类将从 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");
      }
   }
}

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

Output Window

如上面的屏幕截图所示,处理Action的阶段记录到Visual Studio输出窗口中。

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

大规模数据处理实战 -〔蔡元楠〕

全栈工程师修炼指南 -〔熊燚(四火)〕

软件设计之美 -〔郑晔〕

编译原理实战课 -〔宫文学〕

动态规划面试宝典 -〔卢誉声〕

体验设计案例课 -〔炒炒〕

高楼的性能工程实战课 -〔高楼〕

深入浅出可观测性 -〔翁一磊〕

Rust 语言从入门到实战 -〔唐刚〕

好记忆不如烂笔头。留下您的足迹吧 :)