标签:com 错误 pad except baidu oid ext 重要 class
过滤器在mvc中发挥着很重要的作用
过滤器(Filters)的出现使得我们可以在ASP.NET MVC程序里更好的控制浏览器请求过来的URL,不是每个请求都会响应内容,只响应特定内容给那些有特定权限的用户,过滤器理论上有以下功能:
判断登录与否或用户权限
决策输出缓存
防盗链
防蜘蛛
本地化与国际化设置
实现动态Action(做权限管理系统的好东西)
过滤器类型 | 接口 | 默认实现继承类 | 功能描述 |
Action | IActionFilter | ActionFilterAttribute | 在动作方法之前及之后运行 |
Result | IResultFilter | ActionFilterAttribute | 在动作结果被执行之前和之后运行 |
AuthorizationFilter | IAuthorizationFilter | AuthorizeAttribute | 首先运行,在任何其它过滤器动作方法之前运行 |
Exception | IExceptionFilter | HandleErrorAttribute | 只在另外一个过滤器,动作方法,动作结果弹出异常时运行 |
一、Action过滤器
Action过滤器和Result过滤器我在这里是一起添加
首先说一下Action过滤器;主要负责在动作方法之前及之后运行(动作,方法权限)
1、ActionAttribute过滤器继承ActionFilterAttribute类
2、ActionAttribute过滤器调用IActionFilter接口
3、重写OnActionExecuting方法;此方法是在Action动作方法执行前
4、重写OnActionExecuted方法;此方法是在Action动作方法执行后
Result过滤器;在动作结果被执行之前和之后运行 (结果权限)
1、ActionAttribute过滤器继承ActionFilterAttribute类(和Action继承成的同一个基类)
2、ActionAttribute过滤器调用IResultFilter接口
2、重写OnResultExecuting方法;此方法是在执行操作结果前
3、重写OnActionExecuted方法;此方法是在执行操作结果前
代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCcation.Filters { //Action在动作方法之前及之后运行 public class ActionAttribute: ActionFilterAttribute, IActionFilter { public override void OnResultExecuting(ResultExecutingContext filterContext) { //base.OnResultExecuting(filterContext); filterContext.HttpContext.Response.Write("在执行操作结果前"); } public override void OnResultExecuted(ResultExecutedContext filterContext) { //base.OnResultExecuted(filterContext); filterContext.HttpContext.Response.Write("在执行操作结果后"); } public override void OnActionExecuting(ActionExecutingContext filterContext) { //base.OnActionExecuting(filterContext); filterContext.HttpContext.Response.Write("在Action方法执行前"); } public override void OnActionExecuted(ActionExecutedContext filterContext) { //base.OnActionExecuted(filterContext); filterContext.HttpContext.Response.Write("在Action方法执行后<br/>"); } } }
接下来就在控制器中过滤器;这里我选择index视图,所以在index控制器上面添加过滤器
using MVCcation.Filters;//引用过滤器文件目录 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCcation.Controllers { public class HomeController : Controller { [Action]//(执行动作和操作)动作处理器 public ActionResult Index() { return View(); } public ActionResult About() { ViewBag.Message = "Your application description page."; return View(); } public ActionResult Contact() { ViewBag.Message = "Your contact page."; return View(); } } }
可以看出Action会在方法执行前后输出,也在Result前面输出
二、AuthorizationFilte过滤器
首先运行,在任何其它过滤器动作方法之前运行(授权限)
1、AuthorizationFilte过滤器继承AuthorizeAttribute类
2、AuthorizationFilte过滤器调用IAuthorizationFilter接口
3、用Request["userType"]是否是vip;如果是测可以访问,否则就跳转到百度
4、在Index控制器中添加 [AuthorizationFilterAttribute("vip")]//(授权过滤器)只有Vip角色才能进行访问Index视图
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCcation.Filters { //过滤器一般以Attribute结尾 //[添加注解][过滤器类型] //授权过滤器AuthorizationFilter 继承默认接口AuthorizAttribute public class AuthorizationFilterAttribute: AuthorizeAttribute,IAuthorizationFilter { public AuthorizationFilterAttribute(string usertype) { Roles = usertype; } protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { string userType = HttpContext.Current.Request["userType"]; if (userType!="vip") { filterContext.Result = new RedirectResult("http://www.baidu.com"); } else Roles.Contains(userType); //base.HandleUnauthorizedRequest(filterContext); } } }
三、Exception过滤器(异常处理)
只在另外一个过滤器,动作方法,动作结果弹出异常时运行(异常处理权限)
1、Exception过滤器继承HandleErrorAttribute类
2、Exception过滤器调用IExceptionFilter接口
3、当用户或者访问者访问自身没有权限访问页面,程序会抛出一个错误然后,Exception过滤器处理这个错误后会抛出一个没有权限的提示,这里处理错误我是设置跳转到一个网址
4、还是在Index视图控制器上添加ExceptionAttribute过滤器
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCcation.Filters { public class ExceptionAttribute:HandleErrorAttribute { public override void OnException(ExceptionContext filterContext)//发生异常时调用http://www.hermanboke.cn { if (!filterContext.ExceptionHandled) { filterContext.Result = new RedirectResult("http://www.hermanboke.cn");//出现错误后跳转到这个网址 filterContext.ExceptionHandled = true; } base.OnException(filterContext); } } }
这里我们要在Index控制器里面故意抛出一个错误,来让Exception过滤器处理
throw new DllNotFoundException();//抛出一个异常
[AuthorizationFilterAttribute("vip")]//(授权过滤器)只有Vip角色才能进行访问Index视图 [Action]//(执行动作和操作)动作处理器 [Exception]//(错误日志处理器) public ActionResult Index() { throw new DllNotFoundException();//抛出一个异常 return View(); }
然后运行index视图;在浏览器中输入http://localhost:50003/Home/Index?userType=vip就会跳转到指定错误的页面
标签:com 错误 pad except baidu oid ext 重要 class
原文地址:https://www.cnblogs.com/live8/p/10203229.html