在ASP.NET MVC中,控制器定义的操作方法通常与用户交互具有一对一关系,但是有时您希望在调用操作方法之前或在操作方法运行之后执行某些操作
为此,ASP.NET MVC提供了过滤器(Filter), 过滤器是自定义类,它们提供声明性和程序性方式,以向控制器操作方法添加操作前和操作后行为。
Action filter是一种属性,您可以将其应用于控制器Action或整个控制器,以修改执行Action的方式, ASP.NET MVC框架包括几个Action过滤器-
OutputCache - 将控制器操作的输出缓存指定时间。
HandleError - 处理执行控制器Action时引发的错误。
Authorize - 使您可以限制对特定用户或角色的访问。
通过创建一个新的ASP.Net MVC项目,让我们看一个简单的示例。
步骤1 - 打开Visual Studio,然后单击File→New→Item菜单选项。
将打开一个" New Project"对话框。
步骤2 - 在左侧窗格中,选择Template→Visual C#→Web。
步骤3 - 在中间窗格中,选择ASP.NET Web应用程序。
步骤4 - 在"Name"字段中输入项目名称MVCFiltersDemo,然后单击"OK"继续,您将看到以下对话框,要求您设置ASP.NET项目的初始内容。
步骤5 - 为了简化操作,请选择"Empty"选项,然后在"Add folders and core references for"部分中选中" MVC"复选框,然后单击"OK"。
步骤6 - 要添加控制器,请右键单击Solution Explorer中的controller文件夹,然后选择Add→Controller。
它将显示"Add Scaffold"对话框。
步骤7 - 选择" MVC 5 Controller-Empty"选项,然后单击"Add"按钮。
出现"Add Controller"对话框。
步骤8 - 将名称设置为HomeController,然后点击"Add"按钮。
您将在Controllers文件夹中看到一个新的C#文件" HomeController.cs",该文件也可以在Visual Studio中进行编辑。
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操作方法的输出。
让我们添加另一种操作方法,该方法将显示当前时间。
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 ,您将收到以下输出。
如果刷新浏览器,您将看到相同的时间,因为该操作被缓存了20秒, 20秒后刷新时,它将更新。
为了创建自己的自定义过滤器,ASP.NET MVC框架提供了一个称为ActionFilterAttribute的基类,此类同时实现IActionFilter和IResultFilter接口,并且都从Filter类派生。
通过使用ActionFilters在项目中创建一个新文件夹,让我们看一个简单的自定义过滤器示例,添加一个右键单击ActionFilters文件夹的类,然后选择"Add"→"Class"。
在名称字段中输入" 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"); } } }
运行该应用程序,然后观察输出窗口。
如上面的屏幕截图所示,处理Action的阶段记录到Visual Studio输出窗口中。
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)