65.9K
CodeProject 正在变化。 阅读更多。
Home

MVC 中的自定义过滤器 - 授权、操作、结果、异常过滤器。

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.80/5 (19投票s)

2012年7月24日

CPOL

3分钟阅读

viewsIcon

192991

CodeProjectMVC 中的过滤器是可应用于控制器操作或整个控制器的属性。 这允许我们为控制器操作方法添加预处理和后处理行为。 有 4 种类型的过滤器。

MVC 中的过滤器是可应用于控制器操作或整个控制器的属性。 这允许我们为控制器操作方法添加预处理和后处理行为。

有 4 种类型的过滤器。 它们在上面的图像中描述。

目标: 了解过滤器并创建自定义过滤器,以便更好地理解。

步骤 1: 创建一个简单的 MVC Web 应用程序。 让我们首先看看输出缓存过滤器。

我创建了一个视图以及相关的操作方法。 请参见下文。

视图

//OutPutTest.cshtml
@{
    ViewBag.Title = "OutPutTest";
}
lt;h2>OutPutTest</h2>
<h3>@ViewBag.Date</h3>

操作方法

//OutPutTest Action Method
[OutputCache(Duration=10)]
 public ActionResult OutPutTest()
 {
   ViewBag.Date = DateTime.Now.ToString("T");
   return View();
 }

输出: 因此,根据当前的实现,视图应该显示包含秒的当前时间。 因此,每次刷新,秒部分都会改变...

但是请注意应用于操作方法的 [OutputCache(Duration=10)] 属性。 这将使响应缓存 10 秒。 因此,在接下来的 10 秒内,秒部分不会更改。

步骤 2:授权过滤器:此过滤器将在用户身份验证后执行。

在此步骤中,让我们创建一个自定义授权过滤器。 为此,创建一个继承 AuthorizeAttribute 或实现 IAuthorizationFilter 接口的类。 我们在这里所做的只是将消息传递给视图。

public class CustAuthFilter : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {            
            filterContext.Controller.ViewBag.AutherizationMessage = "Custom Authorization: Message from OnAuthorization method.";
        }        
    }

现在我们有了 CustomAuthFilter,它将在用户身份验证后立即执行。 但是,为了实现此目的,我们需要在自定义操作或整个控制器上应用此 [CustAuthFilter] 属性。

我们还有另一种 OnUnauthorizedRequest 事件,用于将未经授权的用户重定向到一些默认页面。 步骤 3:操作过滤器: 操作过滤器中有 4 个事件可用。

  1. OnActionExecuting - 在执行操作方法之前运行。
  2. OnActionExecuted - 在执行操作方法之后运行。
  3. OnResultExecuting - 在将内容渲染到视图之前运行。
  4. OnResultExecuted - 在将内容渲染到视图之后运行。

因此,让我们创建一个 CustomActionFilter。 创建一个继承 ActionFilterAttribute 类或实现 IActionFilterIResultFilter 接口的类。

public class CustomActionFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            filterContext.Controller.ViewBag.CustomActionMessage1 = "Custom Action Filter: Message from OnActionExecuting method.";
        }

        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            filterContext.Controller.ViewBag.CustomActionMessage2 = "Custom Action Filter: Message from OnActionExecuted method.";
        }

        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            filterContext.Controller.ViewBag.CustomActionMessage3 = "Custom Action Filter: Message from OnResultExecuting method.";
        }

        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            filterContext.Controller.ViewBag.CustomActionMessage4 = "Custom Action Filter: Message from OnResultExecuted method.";
        }        
    }

现在,我们需要做的就是在操作方法上应用 [CustomActionFilter] 属性。

步骤 4:异常过滤器:此过滤器用于捕获控制器或操作方法引发的任何异常。 创建一个继承 FilterAttribute 类并实现 IExceptionFilter 接口的类。

public class CustExceptionFilter : FilterAttribute, IExceptionFilter
    {
        public  void OnException(ExceptionContext filterContext)
        {
            filterContext.Controller.ViewBag.ExceptionMessage = "Custom Exception: Message from OnException method.";
        }        
    }

现在,我们需要做的就是应用 [CustExceptionFilter] 属性到操作方法,以处理任何异常或错误。

步骤 5: 现在我们已经创建了所有自定义过滤器。 让我们使用它们来装饰我们的索引操作方法。

控制器代码

namespace CustomActionFilterMVC.Controllers
{
    [CustAuthFilter]
    public class HomeController : Controller
    {
       [CustExceptionFilter]
       [CustomActionFilter]
        public ActionResult Index()
        {
            ViewBag.Message = "Welcome to ASP.NET MVC!";
            return View();            
        }

        public ActionResult About()
        {
            return View();
        }

        [OutputCache(Duration=10)]
        public ActionResult OutPutTest()
        {
            ViewBag.Date = DateTime.Now.ToString("T");
            return View();
        }
    }
}

步骤 6: 现在更新 Index 视图以反映来自自定义过滤器的所有消息。

@{
    ViewBag.Title = "Home Page";
}

<h2>Output Messages :</h2>
<br />
<h3>@ViewBag.AutherizationMessage</h3>
<br />
<h3>@ViewBag.CustomActionMessage1</h3>
<br />
<h3>@ViewBag.CustomActionMessage2</h3>
<br />
<h3>@ViewBag.CustomActionMessage3</h3>
<br />
<h3>@ViewBag.CustomActionMessage4</h3>
<br />
<h3>@ViewBag.ExceptionMessage</h3>

步骤 7: 现在执行应用程序并查看输出。

现在将输出与视图定义进行比较,看看有什么不同。

首先,我们没有任何来自 OnResultExecuted 事件的消息。

原因: 该事件将在内容渲染到视图后执行,因此在视图渲染时,OnResultExecuted 事件尚未发生,并且消息尚未分配给 ViewBag。

第二件事,我们没有任何来自异常过滤器的消息。 如果代码引发任何异常,则异常过滤器代码将发挥作用。 这样,我们已经介绍了 MVC 中不同类型的过滤器,以及如何创建自定义过滤器以及如何应用它们。

代码:点击这里

对您有帮助吗?请告知您的评论/问题。

© . All rights reserved.