1. 常用的过滤器接口
IAuthorizationFilter:在所有的Filter中最早执行的,可用于Action的权限控制
IActionFilter:在Action执行的前后,可用于请求跳转、记录Action执行日志
IResultFilter:在Result执行的前后,可用于记录Result执行日志
IExceptionFilter:在任何异常发生时,可用于记录日志、处理异常、指定错误页面
2.
eg: 作用在 Result上的过滤器
1. 新建一个类继承 FilterAttribute 实现 IActionFilter接口 重写接口中的方法
public class UserFilter: FilterAttribute,IActionFilter
{
public void OnActionExecuted(ActionExecutedContext filterContext)
{
}
public void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpSessionStateBase session= filterContext.HttpContext.Session; //取到Session
//get the controller and result name and field value
string controllName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName; //取到当前访问的Controller和Result的名称
string actionName = filterContext.ActionDescriptor.ActionName;
session["controllName"] = controllName;
session["actionName"] = actionName;
string fileName = filterContext.RouteData.Values["fileName"]==null?"":filterContext.RouteData.Values["fileName"].ToString();
//可以取到URL中的传递参数的值
HttpRequestBase request = filterContext.HttpContext.Request;
string fileNameString = request.QueryString["fileName"];
//判断是否登录,以及判断后的跳转
string user = (string)session["user"];
if(null == user){
filterContext.Result = new RedirectResult("/File/ListFiles"); //没有登录的话跳转到指定页面
}
else if (!"admin".Equals(user))
{
filterContext.Result = new RedirectResult("/File/FieldTest2");
}
}
}
2. 在ActionResult方法上只需指定自定义的Filter的类名即可
[UserFilter]
public ActionResult FieldSubmit3(FieldModel fileModel)
{
ViewData["fileModel"] = fileModel;
return View("FieldTest3");
}
3. 如果在global.asax中, route的配置如下:
routes.MapRoute("Flow", "Flow/FlowDetail/{flowId}", new { Controller = "Flow", action = "FlowDetail", fileName = UrlParameter.Optional });
则在 ActionFilter中想取到route中flowId的值如下:
object flowId = filterContext.RouteData.Values["flowId"];