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