Action Filters for ASP.NET MVC
本文主要介绍ASP.NET MVC中的Action Filters,并通过举例来呈现其实际应用。
Action Filters 可以作为一个应用,作用到controller action (或整个controller action中),以改变action的行为。
ASP.NET MVC Framework支持四种不同类型的Filter:
- Authorization filters – 实现
IAuthorizationFilter接口的属性
. - Action filters – 实现
IActionFilter接口的属性
. - Result filters – 实现
IResultFilter接口的属性
. - Exception filters – 实现
IExceptionFilter接口的
属性。
Filter 的默认执行顺序,如上面的编号顺序。验证(authorization)filter永远都是最开始执行的,异常(exception)filter永远都是最后执行的。
下面只详细介绍Action Filters。
在Action Filters中 ASP.NET MVC Framework 提供了ActionFilterAttribute父类。
所以在Action,Result执行之前之后分别做一些操作,就需要重写ActionFilterAttribute父类,并实现父类中的虚方法。
下面,我们假设一种场景。当我们打开管理系统的页面时,需要进行权限检查,假如多个页面都需要权限检查,重复的代码,必然会让我们感到抓狂。
这时候就可以利用ActionFilterAttribute父类重写OnActionExecuting()方法进行权限检查。
首先,我们在App_Start中添加一个新类,继承ActionFilterAttribute父类。代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; namespace MvcMobileDMS.App_Start
{
//[AttributeUsage(AttributeTargets.All, AllowMultiple = true)]
public class ActionAttributeFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{ //在Action执行前执行
if (filterContext.HttpContext.Session["temp"] == null)
{
filterContext.HttpContext.Response.Redirect("~/dms/logon");
}
//filterContext.HttpContext.Response.Redirect("dms/add"); base.OnActionExecuting(filterContext);
}
}
}
我们假设当系统中存在Session["temp"],则验证通过。否则跳到登陆页面。
好了,ActionFilterAttribute父类已经重写,那么如何运用到我们的Action中呢?很简单,看代码:
[MvcMobileDMS.App_Start.ActionAttributeFilter()]
public ActionResult Add()
{
Session.Remove("temp");
return View();
}
在Action 方法上添加[MvcMobileDMS.App_Start.ActionAttributeFilter()]即可。即我们新增的类。这样每次访问add页面就要做权限检查。
那么,我们再想深一层,假如我想所有的页面都执行权限检查呢?看代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; namespace MvcMobileDMS.Controllers
{
[MvcMobileDMS.App_Start.ActionAttributeFilter()]
public class DMSController : Controller
{
//
// GET: /DMS/
//[MvcMobileDMS.App_Start.ActionAttributeFilter()]
public ActionResult Index()
{ //AVON.DMS.DAL.Entities DMS = new AVON.DMS.DAL.Entities();
//AVON.DMS.Model.REP A = DMS.REP.SingleOrDefault<AVON.DMS.Model.REP>(t => t.NO == "00561874");
//AVON.DMS.BLL.Rep repBLL = new AVON.DMS.BLL.Rep();
//AVON.DMS.Model.REP A = repBLL.GetFromRep("00561874");
//ViewData["mydata"] = A.JOINDATE;
ViewData["mydata"] = "index";
return View();
} //[MvcMobileDMS.App_Start.ActionAttributeFilter()]
public ActionResult Add()
{
Session.Remove("temp");
return View();
} public ActionResult logon()
{
Session["temp"] = "aaa";
return View();
} public string test()
{
return "hahah";
}
}
}
在DMSController类前,我添加了[MvcMobileDMS.App_Start.ActionAttributeFilter()],如此,所有的action在运行前都会执行OnActionExecuting方法,即权限检查。
如果,我们再更想深一层,我们想所有的Controller都执行呢?也很简单,只需修改Global.asax代码,如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing; namespace MvcMobileDMS
{
// Note: For instructions on enabling IIS6 or IIS7 classic mode,
// visit http://go.microsoft.com/?LinkId=9394801 public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalFilters.Filters.Add(new MvcMobileDMS.App_Start.ActionAttributeFilter());
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
}
只要添加全局GlobalFilter即可。GlobalFilters.Filters.Add(new MvcMobileDMS.App_Start.ActionAttributeFilter());
希望对你有所帮助O(∩_∩)O哈哈~。
Action Filters for ASP.NET MVC的更多相关文章
- 8. Filters in ASP.NET MVC 5.0【ASP.NET MVC 5.0中的过滤器】
ASP.NET Filers用来在MVC框架的不同请求处理阶段,注入额外的逻辑.过滤器为横切关注点提供了一种方法(日志记录,授权,缓存). 在这篇文章中,我将会向你介绍MVC框架支持的各种不同种类过滤 ...
- 获取action name在asp.net mvc
Update for MVC 3 ViewContext.Controller.ValueProvider.GetValue("action").RawValue ViewCont ...
- Asp.net MVC十问十答[译]
1. Explain MVC (Model-View-Controller) in general? MVC (Model-View-Controller) is an architectural s ...
- 理解ASP.NET MVC Framework Action Filters
原文:http://www.cnblogs.com/darkdawn/archive/2009/03/13/1410477.html 本指南主要解释action filters,action filt ...
- HTTP Modules versus ASP.NET MVC Action Filters
from:http://odetocode.com/blogs/scott/archive/2011/01/17/http-modules-versus-asp-net-mvc-action-filt ...
- ASP.NET MVC的Action Filter
一年前写了一篇短文ASP.NET MVC Action Filters,整理了Action Filter方面的资源,本篇文章详细的描述Action Filter.Action Filter作为一个可以 ...
- ASP.NET MVC 4.0的Action Filter
有时候你想在调用action方法之前或者action方法之后处理一些逻辑,为了支持这个,ASP.NET MVC允许你自定义创建action过滤器.Action过滤器是自定义的Attributes,用来 ...
- ASP.NET MVC和ASP.NET Core MVC中获取当前URL/Controller/Action (转载)
ASP.NET MVC 一.获取URL(ASP.NET通用): [1]获取完整url(协议名+域名+虚拟目录名+文件名+参数) string url=Request.Url.ToString(); [ ...
- Asp.net mvc 知多少(八)
本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问[http: ...
随机推荐
- FreeModbus Slave 改进的eMbPoll()【worldsing 笔记】
eMbPoll()的作用是FreeMod协议通信过程中不断查询事件对列有无完速数据桢,并进行地址和CRD验证,最后运行和回复主机. 为了减小代码尺寸对eMbPoll进行改进: 原版: 1: 2: e ...
- Outlook账户迁移帮助
Outlook账户迁移指南 1. 介绍 开贴聊聊如何迁移Outlook用户账户到另外一台电脑. 相信许多Outlook用户都遇到过这样的情况:买来一台新电脑,安装完Outlook后,想把旧电脑里面的O ...
- [转] C++ Redistributable Package版本详解
我们使用的程序常常都需要C++ Redistributable Package的支持.C++ Redistributable Package有众多版本,给安装带了不便. 目前(2013-12-04) ...
- 从零开始学android开发-详细谈谈intent的startActivityForResult()方法
1.两种实现activity跳转的方法 实现activity的跳转主要有两种方法,startActivity()和startActivityForResult();例如activity A跳转到act ...
- http的get与post方式下的getParameter获取中文
客户端提交某个中文参数,比如a=中国 (1)如果以GET方式提交,在地址栏中,可以看到参数进行了URL ENCODE,形如:a=%E4%B8%AD%E5%9B%BD.服务端接收到请求,使用reques ...
- UVA - 10883 Supermean
Description Problem F Supermean Time Limit: 2 second "I have not failed. I've just found 10,000 ...
- (转) 如何在JavaScript与ActiveX之间传递数据1
本文研究如何在JS等脚本语言与ActiveX控件之间通信,如何传递各种类型的参数,以及COM的IDispatch接口.使用类似的方法,可以推广到其他所有脚本型语言,如LUA,AutoCad等.本文将研 ...
- careercup-中等难度 17.11
17.11 给定rand5(),实现一个方法rand7().也即,给定一个产生0到4(含)随机数的方法,编写一个产生0到6(含)随机数的方法. 解法: 这个函数要正确实现,则返回0到6之间的值,每个值 ...
- 使用 Eclipse 的 Navigator Link Helper 实现导航器与编辑器的关联
概要 Link With Editor 是 Eclipse 内置功能中十分小巧,但却异常实用的一个功能.这个开关按钮 (Toggle Button) 出现在各式导航器视图 ( 例如 Resource ...
- C#解决微信支付Exception has been thrown by the target of an invocation(调用的目标发生了异常)的问题
今天搭建微信扫码支付环境的时候,一样的配置参数,调用连接提示错误 错误:调用的目标发生了异常 然后跟踪到执行 MD5 md5 = System.Security.Cryptography.MD5.Cr ...