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






4.80/5 (19投票s)
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 个事件可用。
OnActionExecuting
- 在执行操作方法之前运行。OnActionExecuted
- 在执行操作方法之后运行。OnResultExecuting
- 在将内容渲染到视图之前运行。OnResultExecuted
- 在将内容渲染到视图之后运行。
因此,让我们创建一个 CustomActionFilter
。 创建一个继承 ActionFilterAttribute
类或实现 IActionFilter
和 IResultFilter
接口的类。
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 中不同类型的过滤器,以及如何创建自定义过滤器以及如何应用它们。
代码:点击这里
对您有帮助吗?请告知您的评论/问题。