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

asp.net MVC之Result过滤器浅析的更多相关文章

  1. asp.net MVC之Action过滤器浅析

    在asp.net MVC中,Action过滤器是一大利器,它可以在以下两个步骤执行相关的代码: 1.执行Action方法之前:OnActionExecuting 2.Action方法执行完毕后:OnA ...

  2. Asp.Net MVC<五>:过滤器

    ControllerActionInvoker在执行过程中除了利用ActionDescriptor完成对目标Action方法本身的执行外,还会执行相关过滤器(Filter).过滤器采用AOP的设计,它 ...

  3. ASP.NET MVC学习之过滤器篇(2)

    下面我们继续之前的ASP.NET MVC学习之过滤器篇(1)进行学习. 3.动作过滤器 顾名思义,这个过滤器就是在动作方法调用前与调用后响应的.我们可以在调用前更改实际调用的动作,也可以在动作调用完成 ...

  4. asp.net MVC之 自定义过滤器(Filter) - shuaixf

    一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration :缓存的时间, 以 ...

  5. ASP.NET MVC 4 (三) 过滤器

    先来看看一个例子演示过滤器有什么用: public class AdminController : Controller { // ... instance variables and constru ...

  6. ASP.NET MVC学习之过滤器篇(1)

    一.前言 继前面四篇ASP.NET MVC的随笔,我们继续向下学习.上一节我们学习了关于控制器的使用,本节我们将要学习如何使用过滤器控制用户访问页面. 二.正文 以下的示例建立在ASP.NET MVC ...

  7. asp.net MVC之 自定义过滤器(Filter)

    一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration:缓存的时间,以秒为 ...

  8. asp.net mvc 全局权限过滤器及继成权限方法

    全局权限过滤器 //----------------------------------------------------------------------- // <copyright f ...

  9. [Asp.net MVC]HandleErrorAttribute异常过滤器

    摘要 在asp.net mvc中除了使用try...catch/finally来处理异常外,它提供了一种通过在Controller或者Action上添加特性的方式来处理异常. HandleErrorA ...

随机推荐

  1. Codeforces 600 E - Lomsat gelral

    E - Lomsat gelral 思路1: 树上启发式合并 代码: #include<bits/stdc++.h> using namespace std; #define fi fir ...

  2. Pychram - 使用介绍

    Pychram - 使用介绍 PyCharm中Directory与Python package的区别 对于Python而言,有一点是要认识明确的,python作为一个相对而言轻量级的,易用的脚本语言( ...

  3. iterm2 + zsh + oh-my-zsh +autojump

    iterm2  + zsh  +  oh-my-zsh +autojump 升级你的命令行工具,这个我折腾了好久,才明白了各个之间的关系. 1.先下载一个item2 首先你需要下一个iterm2,不要 ...

  4. sublime Text如何取消两栏窗口?

    在菜单栏里的 View->LayOut->Single,也可以用快捷键 Alt+Shift+1.如图所示.(亲测可用) &amp;lt;img src="https:// ...

  5. Misha and Palindrome Degree CodeForces - 501E (回文串计数)

    大意: 给定字符串, 求多少个区间重排后能使原串为回文串. 先特判掉特殊情况, 对于两侧已经相等的位置之间可以任意组合, 并且区间两端点至少有一个在两侧相等的位置处, 对左右两种情况分别求出即可. # ...

  6. 151. Reverse Words in a String(java 注意细节处理)

    题目:reverse words in a string Given an input string, reverse the string word by word. For example,Giv ...

  7. python记录_day27 tcp/ip五层模型

    ## 网络协议按照不同的功能分为多层,目前存在的模型有osi七层模型.tcp/ip五层和tcp/ip四层模型 我们主要用的是tcp/ip五层模型 那么每层的作用是什么呢,现在就从设计者的角度自下到上逐 ...

  8. Django 的逆向解析url--reverse(转)

    https://www.cnblogs.com/zhenfei/p/6368955.html Django中提供了一个关于URL的映射的解决方案,你可以做两个方向的使用: 1.有客户端的浏览器发起一个 ...

  9. WCF开发实战系列二:使用IIS发布WCF服务 转

    转 http://www.cnblogs.com/poissonnotes/archive/2010/08/28/1811141.html 上一篇中,我们创建了一个简单的WCF服务,在测试的时候,我们 ...

  10. webapp检测安卓app是否安装并launch

    1. cordova插件 1)查看所有已安装的安卓app https://www.npmjs.com/package/cordova-plugin-packagemanager A simple pl ...