首页 > 代码库 > MVC4 过滤器使用和怎样控制全部action和部分action
MVC4 过滤器使用和怎样控制全部action和部分action
MVC中的过滤器分四种分别为:IActionFilter(动作过滤器), IAuthorizationFilter(授权过滤器), IExceptionFilter(异常过滤器), IResultFilter(结果过滤器)字面翻译,凑合理解吧。
在此就那IActionFilter举例,在这个接口中有两个方法,分别是:OnActionExecuting(Action执行前执行)和OnActionExecuted(Action执行后执行),
现在我们要想让一个Controller中的所有Action都执行这个过滤器就需要对里面的方法进行重写
public class LoginController : Controller { // // GET: /Login/ public ActionResult Index() { return View(); } public ActionResult Login() { string name = HttpContext.Request["UserName"]; ViewData["name"] = name; return View(); } protected override void OnActionExecuting(ActionExecutingContext filterContext) { //object[] attrs = filterContext.ActionDescriptor.GetCustomAttributes(typeof(NoFilter), true); //if (attrs.Length == 1)//有NoFilter属性 //{ // return; //} string name = filterContext.HttpContext.Request["UserName"]; if (string.IsNullOrEmpty(name)) { filterContext.HttpContext.Response.Write("<script>alert(‘名称不能为空!‘);</script>"); filterContext.HttpContext.Response.End(); } } }
这样每个action在执行前都会先执行这个过滤器。
下面是怎样让Index的Action不执行,只是对Login执行。有2种方式实现:
第一种:代码修改如下:
public class LoginController : Controller { // // GET: /Login/ [NoFilter] public ActionResult Index() { return View(); } public ActionResult Login() { string name = HttpContext.Request["UserName"]; ViewData["name"] = name; return View(); } protected override void OnActionExecuting(ActionExecutingContext filterContext) { //过滤掉标有NoFilter标签的Action object[] attrs = filterContext.ActionDescriptor.GetCustomAttributes(typeof(NoFilter), true); if (attrs.Length == 1)//有NoFilter属性 { return; } string name = filterContext.HttpContext.Request["UserName"]; if (string.IsNullOrEmpty(name)) { filterContext.HttpContext.Response.Write("<script>alert(‘名称不能为空!‘);</script>"); filterContext.HttpContext.Response.End(); } } } public class NoFilter : FilterAttribute, IActionFilter { public void OnActionExecuting(ActionExecutingContext filterContext) { // } public void OnActionExecuted(ActionExecutedContext filterContext) { // } }
第二种:代码修改如下:
public class LoginController : Controller { // // GET: /Login/ public ActionResult Index() { return View(); } [LoginFilter] public ActionResult Login() { string name = HttpContext.Request["UserName"]; ViewData["name"] = name; return View(); } //protected override void OnActionExecuting(ActionExecutingContext filterContext) //{ // //过滤掉标有NoFilter标签的Action // object[] attrs = filterContext.ActionDescriptor.GetCustomAttributes(typeof(NoFilter), true); // if (attrs.Length == 1)//有NoFilter属性 // { // return; // } // string name = filterContext.HttpContext.Request["UserName"]; // if (string.IsNullOrEmpty(name)) // { // filterContext.HttpContext.Response.Write("<script>alert(‘名称不能为空!‘);</script>"); // filterContext.HttpContext.Response.End(); // } //} } public class LoginFilter : FilterAttribute, IActionFilter { public void OnActionExecuting(ActionExecutingContext filterContext) { string name = filterContext.HttpContext.Request["UserName"]; if (string.IsNullOrEmpty(name)) { filterContext.HttpContext.Response.Write("<script>alert(‘名称不能为空!‘);</script>"); filterContext.HttpContext.Response.End(); } } public void OnActionExecuted(ActionExecutedContext filterContext) { // } }
补充:1.自定义过滤器Filter必须继承FilterAttribute。
2.定义过个过滤器可以定义过滤器执行的先后顺序 例如: 在Action上标注:
[NoFilter(Order=2)]
[LoginFilter(Order=1)]
这样当执行这个Action时候会先执行LoginFilter 再执行NoFilter。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。