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方法。

  

原文地址:https://www.cnblogs.com/williamwsj/p/7353804.html