ASP.NET MVC5.0 筑基到炼气大圆满一篇就搞定

发布时间 2023-06-09 11:31:21作者: GroundSoft

 

一、ASP.NET MVC 过滤器

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

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

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

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

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

 

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文件夹,然后选择添加→类。

自定义过滤器

在名称字段中输入“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(ResultExecutingContextfilterContext){
         Log("OnActionExecuting", filterContext.RouteData);
      }
		
      public override void OnActionExecuted(ActionExecutedContextfilterContext){
         Log("OnActionExecuted", filterContext.RouteData);
      }
		
      public override void OnResultExecuting(ResultExecutingContextfilterContext){
         Log("OnResultExecuting", filterContext.RouteData);
      }
		
      public override void OnResultExecuted(ResultExecutedContextfilterContext){
         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输出窗口中。