您现在的位置是:网站首页> 编程资料编程资料
ASP.NET mvc4中的过滤器的使用_实用技巧_
2023-05-24
524人已围观
简介 ASP.NET mvc4中的过滤器的使用_实用技巧_
mvc4中的过滤器
过滤器(Filter)把附加逻辑注入到MVC框架的请求处理。实现了交叉关注。
交叉关注:用于整个应用程序,又不适合放在某个局部位置的功能。
过滤器是.NET的注解属性(Attribute),它们对请求处理管道添加了额外的步骤。
注解属性是派生于System.Attribute的特殊的.NET类。
可以被附加到类、方法、属性、字段等代码元素上。其目的是把附加信息嵌入到已编译的代码中,以便在运行时读回这些信息。
过滤器的基本类型:
过滤器类型 | 接口 | 默认实现 | 描述 |
Authorization | IAuthorizationFilter | AuthorizationAttribute | 最先运行 |
Action | IActionFilter | ActionFilterAttribute | 在动作方法前后运行 |
Result | IResultFilter | ActionResultAttribute | 在动作结果被执行前后 |
Exception | IExceptionFilter | HandlerErrorAttribute | 仅在过滤器、动作发生异常时 |
授权过滤器:IAuthorizationFilter
namespace System.Web.Mvc{ // 摘要:定义授权筛选器所需的方法。 public interface IAuthorizationFilter{ // 摘要:在需要授权时调用。 // 参数:filterContext:筛选器上下文。 void OnAuthorization(AuthorizationContext filterContext); } } 注意:
直接实现接口其实是一件非常危险的事;因此创建一个自定义AuthorizeAttribute子类,再实现授权代码比较容易。
public class CustomAuthAttribute:AuthorizeAttribute{ /// /// 是否对请求进行授权访问的方式 /// /// 对请求信息进行访问的方法 protected override bool AuthorizeCore(HttpContextBase httpContext){ return base.AuthorizeCore(httpContext); } } 直接实现IAuthorizationFilter接口的主要原因是为了获取对传递给OnAuthorization()的AuthorizationContext的访问,通过它可以获得更广泛的信息(路由细节、当前控制器和动作方法信息)。使用接口的方式不仅有安全风险且让授权注解属性中建立的逻辑与控制器紧密的耦合在一起,破坏关注分离,不便于维护。
内建的授权过滤器:
虽然使用了AuthorizeAttribute类作为自定义过滤器的基础,但其AuthorizeCore()有自己的实现
当直接使用AuthorizeAttribute时,可以使用它的public属性来指定授权策略
AuthorizeAttribute属性
名称 | 类型 | 描述 |
Users | String | 一个逗号分隔的用户名列表,指定这些用户可以访问动作方法 |
Roles | String | 一个逗号分隔的角色列表,用户必须至少有一个角色 |
public class HomeController : Controller{ [Authorize(Users ="admin,steve,jacqui",Roles ="admin")] public ActionResult Index(){ return View(); } } 异常过滤器:
namespace System.Web.Mvc{ // 摘要:定义异常筛选器所需的方法。 public interface IExceptionFilter{ // 摘要:在发生异常时调用。 // 参数:filterContext: // 筛选器上下文。 void OnException(ExceptionContext filterContext); } } 当一个未处理的异常出现时,OnException()被调用。该方法的参数是一个ExceptionContext 对象,此对象派生于ControllerContext,并提供了许多有用的属性。
名称 | 类型 | 描述 |
Controller | ControllerBase | 返回请求的控制器对象 |
HttpContext | HttpContextBase | 提供对请求细节的访问及对响应的访问 |
IsChildAction | Bool | 若是自动做则返回true |
RequestContext | RequestContext | 提供对HttpContext和路由数据的访问 |
RouteData | RouteData | 返回请求的路由数据 |
继承自ControllerContext的属性
名称 | 类型 | 描述 |
ActionDescripter | ActionDescripter | 提供动作方法的细节 |
Result | ActionResult | 用于动作方法的结果,通过非空值可取消请求 |
Exception | Exception | 未处理的异常 |
ExceptionHandled | Bool | 如果另一个过滤器已经把这个异常标记为已处理则返回true |
实现自定义异常过滤器
public class RangeExceptionAttribute : FilterAttribute, IExceptionFilter{ public void OnException(ExceptionContext filterContext){ } } 使用内建的异常过滤器:
HandleErrorAttribute属性
名称 | 类型 | 描述 |
ExceptionType | Type | 由过滤器处理的异常类型 |
View | String | 该过滤器渲染的视图模板名 |
Master | String | 在渲染这个过滤器的视图时使用的布局名称 |
准备工作:
在web.config文件中启用自定义错误时,HandleErrorAttribute过滤器才会生效,在
Mode属性的默认值是RemoteOnly在开发期间,HandleErrorAttribute将不会拦截异常,但当应用程序部署到产品服务器时,并从另一台计算机发出请求时HandleErrorAttribute变生效
[HandleError(ExceptionType =typeof(ArgumentNullException),View ="Null")] public ActionResult Index(){ return View(); } 在渲染视图时HandleErrorAttribute过滤器会传递一个HandleErrorInfo视图模型对象这是一个封装了异常细节的封装程序
名称 | 类型 | 描述 |
ActionName | String | 返回生成异常的Action名称 |
ControllerName | String | 返回生成异常的Controller名称 |
Exception | Exception | 返回此异常 |
@model HandleErrorInfo @{ ViewBag.Title = "Sorry"; } @Model.Exception.StackTrace 备注:使用HandleError过滤器时一定要包含Model.Exception.StackTrace否则视图不会显示给用户,引用没必要给用户展示堆栈信息所以可以将该值放入div并隐藏
动作过滤器
用于任何目的的多用途过滤器
namespace System.Web.Mvc{ // 摘要:定义操作筛选器中使用的方法。 public interface IActionFilter{ // 摘要:在执行操作方法后调用。 // 参数:filterContext: // 筛选器上下文。 void OnActionExecuted(ActionExecutedContext filterContext); // 摘要:在执行操作方法之前调用。 // 参数:filterContext: // 筛选器上下文。 void OnActionExecuting(ActionExecutingContext filterContext); } } ActionExecutingContext 属性
名称 | 类型 | 描述 |
ActionDescriptor | ActionDescriptor | 动作方法的描述 |
Result | ActionResult | 动作方法的结果,设置属性非空值,过滤器可以取消请求 |
ActionExecutedContext 属性
名称 | 类型 | 描述 |
ActionDescriptor | ActionDescriptor | 动作方法的描述 |
Canceled | Bool | 如果该动作被另一个过滤器取消,则返回true |
Exception | Exception | 返回由另一个过滤器或动作方法抛出的异常 |
ExceptionHandled | Bool | 如果异常被处理返回true |
Result | ActionResult |
|
结果过滤器:
它会对动作方法所产生的结果进行操作
namespace System.Web.Mvc{ // 摘要:定义结果筛选器所需的方法。 public interface IResultFilter{ // 摘要:在操作结果执行后调用。 // 参数:filterContext: // 筛选器上下文。 void OnResultExecuted(ResultExecutedContext filt
相关内容
- Asp.net MVC下使用Bundle合并、压缩js与css文件详解_实用技巧_
- Visual Studio 2017下ASP.NET CORE的TagHelper智能提示解决办法_实用技巧_
- Visual Studio 2017正式版发布 亮点看这里_实用技巧_
- Win7安装Visual Studio 2015失败的解决方法_实用技巧_
- Visual Studio 2017正式版发布 Mac版新功能特性有哪些_实用技巧_
- Visual Studio 2017正式版离线安装教程_实用技巧_
- Visual Studio 2017 离线安装教程_实用技巧_
- Visual Studio 2017 RC 初探安装教程_实用技巧_
- Asp.net中使用DapperExtensions和反射来实现一个通用搜索_实用技巧_
- Winform OpenFileDialog打开文件对话框_实用技巧_
点击排行
本栏推荐
