zoukankan      html  css  js  c++  java
  • Action Filter

    为了让用户更简单的创建一个自定义Action filter,ASP.NET MVC Framework提供了一个基类ActionFilterAttribute,这个类实现了IActionFilter和IResultFilter接口,并且继承了FilterAttribute类。从广义上来说,在ASP.NET MVC Framework中,任何实现filter的类型都是action filter。

    ActionFilter成员:

    1. OnActionExecuting – 在controller action执行之前调用
    2. OnActionExecuted – 在controller action执行之后调用
    3. OnResultExecuting – 在controller action result执行之前调用
    4. OnResultExecuted – 在controller action result执行之后调用

    执行顺序如下图:

    下面是个小例子:

    新建一个类MyActionFilter继承ActionFilterAttribute

    public class MyActionFilter : ActionFilterAttribute
        {
            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                //记录时间
                filterContext.HttpContext.Items["StartTime"] = DateTime.Now;
    
                //验证是否登录
                var service = (IFormsAuthorizeService)filterContext.Controller;
    
                //子控件不做权限验证
                if (filterContext.IsChildAction)
                    return;
    
                //源请求页面url地址
                string url = filterContext.HttpContext.Request.RawUrl;
    
                if (!service.SignIn())
                {
                    if (filterContext.HttpContext.Request.IsAjaxRequest())
                    {
    
                        JsonResult jr = new JsonResult();
                        jr.Data = new { url = "/passport/login" };
                        jr.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
                        filterContext.Result = jr;
                    }
                    else
                        filterContext.Result = new RedirectResult("/passport/login?redirectUrl=" + url);
                }
            }
    
            public override void OnActionExecuted(ActionExecutedContext filterContext)
            {
                //处理异常
                if (filterContext.Exception != null)
                {
                    filterContext.ExceptionHandled = true;
                    filterContext.Result = new RedirectToRouteResult("Default"
                        , new System.Web.Routing.RouteValueDictionary(new { action = "OnError" }));
                }
            }
    
            public override void OnResultExecuting(ResultExecutingContext filterContext)
            {
                //压缩输出结果
                string acceptEncoding = filterContext.HttpContext.Request.Headers["Accept-Encoding"];
    
                if (string.IsNullOrEmpty(acceptEncoding)) return;
    
                var response = filterContext.HttpContext.Response;
                acceptEncoding = acceptEncoding.ToUpperInvariant();
    
                if (acceptEncoding.Contains("GZIP"))
                {
                    response.AppendHeader("Content-encoding", "gzip");
                    response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
                }
                else if (acceptEncoding.Contains("DEFLATE"))
                {
                    response.AppendHeader("Content-encoding", "deflate");
                    response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
                }
            }
    
            public override void OnResultExecuted(ResultExecutedContext filterContext)
            {
                //计算出页面相应时间
                DateTime statTime = (DateTime)filterContext.HttpContext.Items["StartTime"];
                TimeSpan diff = DateTime.Now - statTime;
    
                filterContext.HttpContext.Response.Write("<hr />" + diff.ToString());
            }
        }
  • 相关阅读:
    问题-Delphi在多线程中使用其他窗体上的控件,报“尚未调用CoInitialize”解决方法
    问题-Delphi不能进行调试模式
    问题-Delphi为什么不能连接oracle
    问题-delphi无法编辑oracle表
    问题-[致命错误] Project1.dpr(1): Unit not found: 'System.pas' or binary equivalents (DCU,DPU)
    问题-Delphi编译时提示缺少delphi自己的单元文件
    教程-Delphi7 自带控件安装对应表
    问题-提示“adodataset.command”
    问题-提示“不正常地定义参数对象。提供了不一致或不完整的信息。”
    问题-[Delphi]提示Can't load package:dclite70.bpl解决方法
  • 原文地址:https://www.cnblogs.com/xxinwen/p/2944333.html
Copyright © 2011-2022 走看看