asp.net MVC之Result过滤器浅析

时间:2022-07-09 23:20:44

在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);
}

运行程序,查看结果:

asp.net MVC之Result过滤器浅析

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

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

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

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