MVC5-4 ViewResult
ViewResult
之前已经分析了很多个Result,但是并没有分析我们最常用的ViewResult。因为它牵扯到了Razor引擎,所以需要单独的拿出来去讲。
之前在学习的时候,老师总会和我们说当你的功力达到一定地步的时候回答别人的问题,你就可以用一切皆对象去回答。这真的很装逼。那么问题来了。MVC中的视图是cshtml,代码也是一些html标签。那么它是什么?
引用上面的一切皆对象,它是一个对象。一个类的实例。不信看图
"windir"\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\700f6620\c210e54文件夹下会有一堆dll,再使用ILSpy反编译一下
这是我们的index.cshtml视图页面,它变成了这个一个继承自WebViewPage的类!重写了父类的Execute方法,方法内部可能有一些乱,但是仔细一看,这不就是我们的html标签吗。一切都清晰了起来。这里值得一提的是我们的global.asax也会生成一个继承自MvcApplication的类
我们使用视图的时候很方便,可以在上写面c#代码。很容易的填充数据。那么它是怎么做到的?其中又有什么不为人知的秘密。且看原码
这是View方法的源码,可以看到构造了ViewResult的对象。向里面塞入了我们的mode,ViewData还有一个ViewRngineConllection也就是View引擎集合。里面有WebFormViewRngine和RazorViewRngline
然后走到了ViewResultBase类的ExecuteResult方法,这里会调用ViewResult子类的FindView方法。可以看到拿到的是RazorView。继续往下走,开始实例化ViewContext对象和output一起Render(渲染)
渲染的过程还是值得一看的,这里再次进入Render方法,这里通过GetCompiledType反射构建了一个类,然后再实例化这个类。调用RenderView方法
在RenderView方法里面把我们的indexcshtml类转成了WebViewPage,也就是它的父类,然后又开始填充ViewData,ViewContext等。下面有一个Inithelpers看的出来也就是初始化我们的@html,@ajax等。下面释放内存转到页面。
下图是全部的执行过程

MVC5-4 ViewResult的更多相关文章
- MVC5知识点记录
IIS/ASP.NET管道 原理永远是重中之重,所以在开篇的地方,先了解一下地址栏输入网址回车之后的故事. 不同IIS版本处理请求也不一样 IIS5 IIS 5.x 运行在进程InetInfo.exe ...
- MVC5路由系统机制详细讲解
请求一个ASP.NET mvc的网站和以前的web form是有区别的,ASP.NET MVC框架内部给我们提供了路由机制,当IIS接受到一个请求时,会先看是否请求了一个静态资源(.html,css, ...
- MVC5 + EF6 + Bootstrap3 (11) 排序、搜索、分页
系列教程:MVC5 + EF6 + Bootstrap3 上一节:MVC5 + EF6 + Bootstrap3 (10) 数据查询页面 源码下载:点我下载 我工作的源码:http://www.jin ...
- MVC5 + EF6 + Bootstrap3 (12) 新建数据
Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc5-ef6-bs3-get-started-create.html 系列教程:MVC5 + EF6 + ...
- MVC5 + EF6 + Bootstrap3 (10) 数据查询页面
文章来源:Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc5-ef6-bs3-get-started-search-page.html 系列教程:MVC ...
- ASP.NET MVC5 PagedList分页示例
ASP.NET MVC是目前ASP.NET开发当中轻量级的Web开发解决方案,在ASP.NET MVC概述这篇译文当中,已经详细的介绍了ASP.NET MVC与Web Forms的区别以及各自的适用场 ...
- ASP.NET MVC5 学习笔记-1 控制器、路由、返回类型、选择器、过滤器
[TOC] 1. Action 1.1 新建项目 新建项目->Web->Asp.net Web应用程序,选择MVC,选择添加测试. 在解决方案上右键,选择"管理NuGet程序包& ...
- MVC5控制器、路由、返回类型、选择器、过滤器
ASP.NET MVC5 学习笔记-1 控制器.路由.返回类型.选择器.过滤器 [TOC] 1. Action 1.1 新建项目 新建项目->Web->Asp.net Web应用程序, ...
- (12) MVC5 EF6 Bootstrap3
MVC5 + EF6 + Bootstrap3 (12) 新建数据 系列教程:MVC5 + EF6 + Bootstrap3 上一节:MVC5 + EF6 + Bootstrap3 (11) 排序.搜 ...
- MVC5 + EF6 + Bootstrap3-10
MVC5 + EF6 + Bootstrap3 (10) 数据查询页面 上一节:MVC5 + EF6 + Bootstrap3 (9) HtmlHelper用法大全(下) 源码下载:点我下载 目录 前 ...
随机推荐
- H2 Database入门
H2 Database做为轻量级的内嵌数据库,功能十分强大,而且运行时只需要一个jar包即可,下表是官网的描述: 更详细的对比见官网页面: http://www.h2database.com/html ...
- 2015-2016-2 《Java程序设计》 学生博客及Git@OSC 链接
2015-2016-2 <Java程序设计> 学生博客及Git@OSC 链接 博客 1451 20145101王闰开 20145102周正一 20145103冯文华 20145104张家明 ...
- c++多重继承小结
如果一个类从两个不同的类里继承两个同名的成员,则需要在派生类中使用类限定符来区分他们. 即在从A和B派生出来的c类中使用a::Show()和B::Show()来区分从这两个类那里继承的show()方法 ...
- 手把手教你在Windows下搭建React Native Android开发环境
最近看到React Native好像好厉害的样子,好奇心驱使之下体验了一下并将在Window下搭建React Natvie Android环境的步骤记录下来,并有需要的朋友参考.(我都是参考官方文档的 ...
- 开源免费的HTML5游戏引擎——青瓷引擎(QICI Engine) 1.0正式版发布了!
青瓷引擎的成长 青瓷引擎自2015年4月项目启动开始,7月首次亮相2015年ChinaJoy,便得到业界的极大关注,随后开启限量测试,收到数百个开发者团队的试用申请及反馈,期间经历了18个内测版本,完 ...
- JAVA内嵌数据库H2的使用入门
H2数据库是开源的,非常适合做嵌入式数据库使用,尤其用java编码的时候. H2的优势: 1.h2采用纯Java编写,因此不受平台的限制. 2.h2只有一个jar文件,十分适合作为嵌入式数据库试用. ...
- 【JavaEE企业应用实战学习记录】sessionListener
package sanglp.servlet; import javax.servlet.ServletContext; import javax.servlet.annotation.WebList ...
- RabbitMQ集群、镜像部署配置
1 RABBITMQ简介及安装 RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python.Ruby..NET.Java.JMS.C.PHP.Act ...
- android studio-创建第一个项目
打开android studio 开始界面和Xcode有点类似,点击New project新建一个工程,新建过程和在Eclipse上差不多,这里就不赘述了. 下面开始新建项目 填写项目名称,和存放地址 ...
- git初体验(七)多账户的使用
多github帐号的SSH key切换 我有两个github帐号,一个是个人所用,一个是为公司项目所用.如果是单用户(single-user),很方便,默认拿id_rsa与你的github服务器的公钥 ...