ASP.NET MVC中有四种过滤器类型
在ASP.NET MVC中有四种过滤器类型
Action
1、在ASP.NET MVC项目中,新建文件夹Filter,然后新建类MyCustormFilter,继承自ActionFilterAttribute类,我们来看下ActionFilterAttribute类有如下四个方法,从命名我应该就可以看出他们的执行时机。
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class MyCustormFilter:ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.HttpContext.Response.Write( "Action执行前" ); base .OnActionExecuting(filterContext); } public override void OnActionExecuted(ActionExecutedContext filterContext) { filterContext.HttpContext.Response.Write( "Action执行后" ); base .OnActionExecuted(filterContext); } } |
2、对于过滤器,我们可以把它们加在三个地方,一个是控制器上面(控制器下面的所有Action),一个是Action上面(指定标识的Action),另一个就是全局位置(所有控制器中的Action)。这里我只演示在Action上面加
Result
1、新建类TestResultFilter,继承ActionFilterAttribute
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public class TestResultFilter:ActionFilterAttribute { /// <summary> /// 加载 "视图" 前执行 /// </summary> /// <param name="filterContext"></param> public override void OnResultExecuting(System.Web.Mvc.ResultExecutingContext filterContext) { filterContext.HttpContext.Response.Write( "加载视图前执行 OnResultExecuting <br/>" ); base .OnResultExecuting(filterContext); } /// <summary> /// 加载"视图" 后执行 /// </summary> /// <param name="filterContext"></param> public override void OnResultExecuted(System.Web.Mvc.ResultExecutedContext filterContext) { filterContext.HttpContext.Response.Write( "加载视图后执行 OnResultExecuted <br/>" ); base .OnResultExecuted(filterContext); } } |
2、这里我把TestResultFilter过滤器加在控制器上面
注意:Result过滤器,无论Action的返回类型为什么(甚至void)都将执行。
RouteData中保存了当前请求匹配的路由信息和路由对象
修改MyCustormFilter.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public override void OnActionExecuting(ActionExecutingContext filterContext) { //1.获取获取请求的类名和方法名 string strController = filterContext.RouteData.Values[ "controller" ].ToString(); string strAction = filterContext.RouteData.Values[ "action" ].ToString(); //2.另一种方式 获取请求的类名和方法名 string strAction2 = filterContext.ActionDescriptor.ActionName; string strController2 = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName; filterContext.HttpContext.Response.Write( "Action执行前</br>" ); filterContext.HttpContext.Response.Write( "控制器:" + strController + "</br>" ); filterContext.HttpContext.Response.Write( "控制器:" + strController2+ "</br>" ); filterContext.HttpContext.Response.Write( "Action:" + strAction + "</br>" ); filterContext.HttpContext.Response.Write( "Action:" + strAction2 + "</br>" ); base .OnActionExecuting(filterContext); } |
AuthorizeAttribute
1、 新建TestAuthorizeAttribute
1 2 3 4 5 6 7 8 9 10 11 12 | /// <summary> /// 授权过滤器 --在Action过滤器前执行 /// </summary> public class TestAuthorizeAttribute:AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { filterContext.HttpContext.Response.Write( "<br/>OnAuthorization<br/>" ); //注释掉父类方法,因为父类里的 OnAuthorization 方法会调用asp.net的授权验证机制! //base.OnAuthorization(filterContext); } } |
Exception
1、新建TestHandleError.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /// <summary> /// 异常处理 过滤器 /// </summary> public class TestHandleError : HandleErrorAttribute { public override void OnException(ExceptionContext filterContext) { //1.获取异常对象 Exception ex = filterContext.Exception; //2.记录异常日志 //3.重定向友好页面 filterContext.Result = new RedirectResult( "~/error.html" ); //4.标记异常已经处理完毕 filterContext.ExceptionHandled = true ; base .OnException(filterContext); } } |
2、在Action上面加TestHandleError
注意:通常这样的异常处理我们是放在全局过滤器上面的。
1 2 3 4 5 6 7 8 9 | public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { //filters.Add(new HandleErrorAttribute()); //添加全局过滤器 filters.Add( new TestHandleError()); } } |
程序员工具站点:草根工具www.idevtool.com
个人笔记站点:草根笔记note.idevtool.com
码农都是有尊严的
转载请注明来源,谢谢
http://www.cnblogs.com/benpao/
分类:
C#/.net
标签:
.net mvc filter
, 过滤器
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~