• MVC的Filter应用小结


    一、概念定义

    Filter是一种声明式编程方式,在Asp.net MVC中它只能限制于Action(或它的Controller)。

    Filter用途广泛:(1)判断登录与否或用户权限;(2)决策输出缓存;(3)防盗链;(4)防蜘蛛;(5)本地化与国际化设置(6)实现动态Action。

    Filter要继承于ActionFilterAttribute抽象类,并覆写四个方法:

    (1)OnActionExecuting是Action执行前的操作;(2)OnActionExecuted则是Action执行后的操作;

    (3)OnResultExecuting是解析ActionResult前执行;(4)OnResultExecuted是解析ActionResult后执行。

    二、创建filter类:类需要继承一个接口,并且重写4个方法

    public class paramFilter : System.Web.Mvc.ActionFilterAttribute
        {
            //Action执行前的操作
            public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext)
            {
                if (filterContext.HttpContext.Request.QueryString["k"] == "go")
                {
                    string retUrl = filterContext.RouteData.GetRequiredString("controller") + "/" + filterContext.RouteData.GetRequiredString("action");
                    filterContext.HttpContext.Response.Redirect("http://" + filterContext.HttpContext.Request.Url.Host + ":" + filterContext.HttpContext.Request.Url.Port.ToString() + "/" + retUrl);
                }
            }
    
            //Action执行后的操作
            public override void OnActionExecuted(System.Web.Mvc.ActionExecutedContext filterContext)
            {
                base.OnActionExecuted(filterContext);
            }
    
            //解析ActionResult前执行
            public override void OnResultExecuting(System.Web.Mvc.ResultExecutingContext filterContext)
            {
                base.OnResultExecuting(filterContext);
            }
    
            //解析ActionResult后执行
            public override void OnResultExecuted(System.Web.Mvc.ResultExecutedContext filterContext)
            {
                base.OnResultExecuted(filterContext);
            }
        }
    View Code

    注意:其中 filterContext对象是从页面传过来的。

    其中ActionExecutingContext类其属性如下表:     

    ActionDescriptor 获取或设置操作描述符。
    ActionParameters 获取或设置操作方法参数。
    Controller 获取或设置控制器。 (从 ControllerContext继承。)
    DisplayMode 获取显示模式。 (从 ControllerContext继承。)
    HttpContext 获取或设置 HTTP 上下文。 (从 ControllerContext继承。)
    IsChildAction 获取一个值,该值指示关联的操作方法是否为子操作。 (从 ControllerContext继承。)
    ParentActionViewContext 获取一个对象,该对象包含父操作方法的视图上下文信息。 (从 ControllerContext继承。)
    RequestContext 获取或设置请求上下文。 (从 ControllerContext继承。)
    Result 获取或设置由操作方法返回的结果。
    RouteData 获取或设置 URL 路由数据。 (从 ControllerContext继承。)


            

           

    获取页面controller值:filterContext.RouteData.GetRequiredString("controller")
    获取页面action值:filterContext.RouteData.GetRequiredString("action")
    其他页跳转面:filterContext.HttpContext.Response.Redirect()
    获取ip地址:filterContext.HttpContext.Request.Url.Host 
    获取端口:filterContext.HttpContext.Request.Url.Port.ToString()

    三、Filter应用在Controller上的使用方式

    1、直接将Filter应用在Controller上,如:

    [paramFilter]
    public class UserController : Controller{}

    2、重写Controller内的 OnActionExecuting/OnActionExecuted/OnResultExecuting/OnResultExecuted的四个方法。

    四、以下为几个系统的Filter。

    1、AcceptVerbs:规定页面的访问形式

    [AcceptVerbs(HttpVerbs.Post)]            
    public ActionResult Example(){ return View(); }
    

    2、ActionName:规定Action的名称。

    应用场景:如果不想用方法名做为Action名,或Action名为关键字的话,如
    [ActionName("UserLog")]         
    public ActionResult Login(){             return View();         }
    

    3、NonAction:当前方法仅是普通方法不解析为Action。

    4、ValidateInput:该Action可以接受Html等危险代码(ASP.NET MVC在aspx中设置<%@ Page 的属性无法完成等同任务)

    [ValidateInput(false)]        
    public ActionResult List() {    return View();    }
    

    5、ValidateAntiForgeryTokenAttribute:用于验证服务器篡改。

    [ValidateAntiForgeryToken]        
    public ActionResult UserAdd()   {   return View();  }
    

    五、Filter的集中应用场景介绍

    1、使用场景:验证登录等。

    public class LoginFilterAttribute:ActionFilterAttribute
        {
            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                //当用户没有验证时
                if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
                {
                   
                    filterContext.Result = new RedirectToRouteResult("Default", 
                        new RouteValueDictionary(new {action="Login"})
                        );
                }
            }
        }
    

    [LoginFilterAttribute]    

    public ActionResult Index()

    2、使用场景:异常处理

    public class ErrorActionFilter:ActionFilterAttribute
        {
            public override void OnActionExecuted(ActionExecutedContext filterContext)
            {
                if (filterContext.Exception != null)
                {
                    filterContext.Canceled = true;
                    filterContext.Result = new RedirectToRouteResult("Demo", new RouteValueDictionary(new { action = "ErrorPage" }));
                }
            }
        }
     
    [ErrorActionFilter]
    public void ErrorHandler()  {    throw new Exception();    }
    

    3、OnResultExecuting:在result执行前发生(在view 呈现前);使用场景:设置客户端缓存,服务器端压缩。

    4、OnResultExecuted:在result执行后发生,使用场景:异常处理,页面尾部输出调试信息。

  • 相关阅读:
    SQL SERVER使用技巧集
    WIN32串口编程
    经典FLASH收藏
    Windows下WinsockAPI研究
    数据库连接大全[转自中国站长网]
    VirtualBox自动重启之谜
    写个设置命令的VBS脚本工具。
    VB中KeyCode的取法
    实现串口编程的三种方法
    .NET的命名空间
  • 原文地址:https://www.cnblogs.com/xinaixia/p/4070659.html
Copyright © 2020-2023  润新知