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用法大全(下) 源码下载:点我下载 目录 前 ...
随机推荐
- FastFourierTransform (FFT)
FastFourierTransform.h #pragma once #include <stdio.h> #include <math.h> #ifndef INCLUDE ...
- Apache下开启SSI配置使html支持include包含
写页面的同学通常会遇到这样的烦恼,就是页面上的 html 标签越来越多的时候,寻找指定的部分就会很困难,那么能不能像 javascript 一样写在不同的文件中引入呢?答案是有的,apache 能做到 ...
- WampServer下如何实现多域名配置(虚拟域名配置)
之前在学习跨域的时候,我写过一篇叫做WampServer下使用多端口访问的文章,默认的 localhost 采用的是 80 端口,能使用多端口访问的核心是得新建一个端口,也就是新建一个 http 服务 ...
- Bootstrap系列 -- 8. 代码显示
一. Bootstrap中的代码块 代码块一般在博客中使用的较多,比较博客园中提供的贴代码. 在Bootstrap中提供了三种形式的代码显示 1. 使用<code></code> ...
- Ryu
What's Ryu? Ryu is a component-based software defined networking framework. Ryu provides software co ...
- 手机信号强度单位dB、dBm和asu
dB.dBm都是功率增益的单位,不同之处如下: dB是一个表征相对值的值,纯粹的比值,只表示两个量的相对大小关系,没有单位,当考虑甲的功率相比于乙功率大或小多少个dB时,按下面的计算公式:10log( ...
- AngularJS引入Echarts的Demo
最近要用到图表展示,想了想,还是首选Echarts,HighCharts和D3.js备用吧, 而项目中也用到了AngularJS,所以需要把Echarts引入到AngularJs中一起使用, 试了试, ...
- XML中的DOCTYPE属性
一.先来两个小例子 内部dtd将standalone设为真. <?xml version="1.0" standalone="yes"?> < ...
- android和httpClient
一.说起来都是泪 各大组织不同步,可是我想用别人的库. 二.谷歌和阿帕奇的爱恨情仇 初,谷歌安卓新出,库中自带HttpClient 4.0测试预览版.为与安卓保持API同步,HTTPClient不敢大 ...
- Intel系列CPU的流水线技术的发展
Intel系列CPU的流水线技术的发展 CPU(Central processing Unit),又称“微处理器(Microprocessor)”,是现代计算机的核心部件.对于PC而言,CPU的规格与 ...