• asp.net MVC之Result过滤器浅析


    在asp.net MVC中,每一个Action方法完成之后都会返回一个结果,而我们可以在Result过滤器中根据需要修改这个结果。例如可以根据UserAgent来判断客户端的来源是手机还是PC端,从而显示不同的视图。

    自定义的Result过滤器需要继承FilterAttribute类和IResultFilter接口。

    FilterAttribute类有两个关键属性:

    AllowMultiple:布尔型,指示是否可指定筛选器特性的多个实例。如果可指定筛选器特性的多个实例,则为 true;否则为 false。

    Order:int整型,获取或者设置执行操作筛选器的顺序。

    IResultFilter接口有两个关键方法:

    void OnResultExecuting(ResultExecutingContext filterContext) :在操作结果执行之前调用。即在视图引擎解析视图之前调用。此时可以改变视图指向等。

    void OnResultExecuted(ResultExecutedContext filterContext):在操作结果执行后调用。

    接下来操作代码亲自实践之。

    自定义一个Result过滤器类:

        public class MyResultFilter : FilterAttribute, IResultFilter {
            string controller = "", action = "", viewName = "";
    
            public void OnResultExecuting(ResultExecutingContext filterContext) {
                controller = filterContext.Controller.ValueProvider.GetValue("controller").AttemptedValue;
                action = filterContext.Controller.ValueProvider.GetValue("action").AttemptedValue;
                viewName = (filterContext.Result as ViewResult).ViewName;
                filterContext.HttpContext.Response.Write(string.Format("<h4 style='background-color:black;color:white;'>过滤器:{0} <font color='red'>OnResultExecuting</font> 控制器:{1}  Action方法:{2} 视图:{3}</h4>",
                    GetType().Name, controller, action, viewName));
            }
            public void OnResultExecuted(ResultExecutedContext filterContext) {
                filterContext.HttpContext.Response.Write(string.Format("<h4 style='background-color:black;color:white;'>过滤器:{0} <font color='red'>OnResultExecuted</font> 控制器:{1}  Action方法:{2} 视图:{3}</h4>",
                    GetType().Name, controller, action, viewName));
            }
        }

    将该Result过滤器附加到某个Action方法上:

            [MyResultFilter]
            public ActionResult Index() {
                Response.Write("<hr>进入Index方法,并返回结果");
    
                //如果不写上视图名称,则Result过滤器的(filterContext.Result as ViewResult).ViewName视图名称为空值。
                return View("Index", Data.Data.students);
            }

    运行程序,查看结果:

    根据结果可以得知,当Action方法return结果之后:

    1、在执行结果之前,确实执行了OnResultExecuting方法;

    2、执行结果,即视图引擎解析视图;

    3、结果执行完后,开始执行OnResultExecuted方法。

      

  • 相关阅读:
    业余爱好很有必要
    平和的心态
    合理预期
    有所为,有所不为
    iOS中使用UITextView设置不同文本部分点击事件小结
    一直在路上
    Windows平台交叉编译Arm Linux平台的QT5.7库
    UOS创建开机自启程序或脚本
    HTTP HTTP请求报文和响应报文的格式
    ObjectObject.prototype.toString.call()方法的使用
  • 原文地址:https://www.cnblogs.com/williamwsj/p/7353804.html
Copyright © 2020-2023  润新知