ASP.NET MVC 视图(二)
ASP.NET MVC 视图(二)
前言
上篇中对于视图引擎只是做了简单的演示,对于真正的理解视图引擎的工作过程可能还有点模糊,本篇将会对由MVC框架提供给我们的Razor视图引擎的整个执行过程做一个粗略的讲解,目的在于让大家对Razor视图引擎的执行过程留个印象以便联想的思考到视图引擎的作用以及视图在MVC框架中的表示。
ASP.NET MVC 视图
- 自定义视图引擎
- Razor视图引擎执行过程
- Razor视图的依赖注入、自定义视图辅助器
- 分段、分部视图的使用
- Razor语法、视图辅助器
Razor视图引擎执行过程
大家看过上个篇幅对试图引擎的执行过程有个大概的了解,而Razor视图引擎的执行则更为详细,不会像上篇这么粗糙,来看一下示意图,图1.
图1
图1中所示的是Razor视图引擎中的对象结构的继承关系,对于图1右边部分的意思则是表示视图引擎是从系统的ViewEngines.Engines也就是ViewEngineCollection集合类型中取出来的,在ViewEngineCollection下面部分则是表示Razor试图引擎的一个继承关系示意图。
图2
我们先来看红色指针所指部分的流程:
在我们使用ViewResult作为控制器方法的返回类型的时候,MVC框架会首先执行ViewResult中的FindView()方法,而在ViewResult的FindView()中并不是由它自身来执行查找视图的任务的,MVC框架很多管闲事,它会干扰进来。它会从系统的ViewEngines.Engines也就是ViewEngineCollection集合类型中取出来Razor试图引擎来执行查找视图的任务【图1中例举了Razor视图引擎的继承结构】。
随之由VirtualPathProviderViewEngine类型来执行查找视图的任务,实际在这里根据视图名称查找的并不是我们定义的xxxx.cshtml视图文件,而是由xxxx.cshtml文件编译成的cs文件,这些cs文件中表示对应视图的代码,这个在本篇的最后会有讲解,那么这些cs文件是在什么时候生成的呢?是在请求到达控制器的时候,好事的MVC框架就会把View文件夹下或者是对应区域的View文件夹下,关于这个控制器文件夹中的所有视图都会统统的编译生成为cs文件。
扯蛋扯远了回到主题,在VirtualPathProviderViewEngine类型找到视图后【cs文件】,便会让RazorViewEngine类型来生成视图处理类,也就是实现了IView的RazorView类型了并且封装到ViewEngineResult类型实例中。
下面我们就来说明下蓝色指针所指部分的流程:
这个时候MVC框架会调用ViewEngineResult类型中的View属性中的Render()方法,实则就是刚刚上面说的RazorView类型实例中的方法。
然后我们看图2,在Render()方法的执行过程中,首先是由BuildManagerWrapper类型根据视图的路径去读取文件并且动态编译过后返回视图cs文件中所表示的类型,这里BuildManagerWrapper类型是MVC框架的内部类型是实现了内部的IBuildManager接口,BuildManagerWrapper类型的意思就是对于动态编译功能的一个封装,实则就是调用System.Web.Compilation.BuildManager里的功能。
回到主题,类型生成好了过后是由DefaultViewPageActivator类型来生成视图所对应的C#类型【System.Web.Mvc.WebViewPage<dynamic>】,最后通过RazorView类型中的RenderView()方法来对刚刚我们生成好的视图对应的C#类型进行基础性的赋值,比如说从ViewContext类型参数中获取ViewData、ViewBag等等数据信息【ViewContext类型继承自ControllerContext,所以你懂的】进行赋值。
最后会被WebPageRenderingBase类型的对象来做渲染处理,这部分内容就不做阐述了。
以上就是多Razor视图引擎也就是ViewResult类型的处理过程,说的很粗糙大家见谅希望能对大家对于视图的理解上有所帮助。
下面来说一下由MVC框架对于视图文件编译后的cs文件,要眼见为实嘛对吧。
首先我们看一下某个视图的运行的结果,图3.
图3
而对应的视图代码【cshtml文件中的代码】,如代码1-1.
代码1-1
@{
ViewBag.Title = "Index";
} <h2>Index</h2>
@foreach (var item in Model)
{
<h3>ID: @item.ID Name:@item.Name</h3>
}
那么在请求达到控制器过后编译后的视图cs文件存在哪了呢?
在系统的C:\Users\你系统的用户名\AppData\Local\Temp\Temporary ASP.NET Files中,当然了并不是在这个文件夹下面,而是在会这里又生成一些其它的乱七八糟名称的文件夹,找一个即可。
我就是在C:\Users\你系统的用户名\AppData\Local\Temp\Temporary ASP.NET Files\root\19537580\dfb4a136文件夹下找的,当然了cs文件的命名也不是对应着视图名称的,一般是由App_Web开头命名的。经过一番查找找到了对应代码1-1的cs文件了,来看一下,代码1-2
代码1-2
#pragma checksum "E:\JY\JY\Action\ASP.NET MVC\SystemCase\MyMvcApplication\MvcApplication\Views\iocdemo\Index.cshtml" "{406ea660-64cf-4c82-b6f0-42d48172a799}" "11002EF3288CEAD21A96AC68FD35C045"
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.1008
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------ namespace ASP {
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Helpers;
using System.Web.Security;
using System.Web.UI;
using System.Web.WebPages;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using System.Web.Mvc.Html;
using System.Web.Routing; public class _Page_Views_iocdemo_Index_cshtml : System.Web.Mvc.WebViewPage<dynamic> { #line hidden public _Page_Views_iocdemo_Index_cshtml() {
} protected ASP.global_asax ApplicationInstance {
get {
return ((ASP.global_asax)(Context.ApplicationInstance));
}
} public override void Execute() { #line 1 "E:\JY\JY\Action\ASP.NET MVC\SystemCase\MyMvcApplication\MvcApplication\Views\iocdemo\Index.cshtml" ViewBag.Title = "Index"; #line default
#line hidden
WriteLiteral("\r\n<h2>Index</h2>\r\n"); #line 6 "E:\JY\JY\Action\ASP.NET MVC\SystemCase\MyMvcApplication\MvcApplication\Views\iocdemo\Index.cshtml"
foreach (var item in Model)
{ #line default
#line hidden
WriteLiteral(" <h3>ID: "); #line 8 "E:\JY\JY\Action\ASP.NET MVC\SystemCase\MyMvcApplication\MvcApplication\Views\iocdemo\Index.cshtml"
Write(item.ID); #line default
#line hidden
WriteLiteral(" Name:"); #line 8 "E:\JY\JY\Action\ASP.NET MVC\SystemCase\MyMvcApplication\MvcApplication\Views\iocdemo\Index.cshtml"
Write(item.Name); #line default
#line hidden
WriteLiteral("</h3>\r\n"); #line 9 "E:\JY\JY\Action\ASP.NET MVC\SystemCase\MyMvcApplication\MvcApplication\Views\iocdemo\Index.cshtml"
} #line default
#line hidden }
}
}
想必看到这里大家清楚了吧,对于视图文件cshtml、vbhtml等等最后在运行时编译成的类型System.Web.Mvc.WebViewPag,至于类型后面的泛型类型是dynamic类型是对应于普通视图,而强类型视图编译后的类型就会将此处的dynamic类型替换成强类型视图的ViewModel类型了,最后说一下对于#line的意思可问度娘,是便于我们调试用的。
作者:金源
出处:http://www.cnblogs.com/jin-yuan/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面
ASP.NET MVC 视图(二)的更多相关文章
- ASP.NET MVC 视图(四)
ASP.NET MVC 视图(四) 前言 上篇对于利用IoC框架对视图的实现进行依赖注入,最后还简单的介绍一下自定义的视图辅助器是怎么定义和使用的,对于Razor语法的细节和辅助器的使用下篇会说讲到, ...
- 【ASP.NET MVC系列】浅谈ASP.NET MVC 视图
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
- ASP.NET MVC 视图(五)
ASP.NET MVC 视图(五) 前言 上篇讲解了视图中的分段概念.和分部视图的使用,本篇将会对Razor的基础语法简洁的说明一下,前面的很多篇幅中都有涉及到视图的调用,其中用了很多视图辅助器,也就 ...
- ASP.NET MVC 视图(三)
ASP.NET MVC 视图(三) 前言 上篇对于Razor视图引擎和视图的类型做了大概的讲解,想必大家对视图的本身也有所了解,本篇将利用IoC框架对视图的实现进行依赖注入,在此过程过会让大家更了解的 ...
- ASP.NET MVC 视图(一)
ASP.NET MVC 视图(一) 前言 从本篇开始就进入到了MVC中的视图部分,在前面的一些篇幅中或多或少的对视图和视图中的一些对象的运用进行了描述,不过毕竟不是视图篇幅说的不全面,本篇首先为大家讲 ...
- ASP.NET MVC 路由(二)
ASP.NET MVC路由(二) 前言 在上一篇中,提及了Route.RouteCollection对象的一些信息,以及它们的结构所对应的关系.按照处理流程走下来还有遗留的疑问没有解决这个篇幅就来讲 ...
- 为ASP.NET MVC视图输出json
做个小小练习,为asp.net mvc视图输出json字符串: 创建JsonResult操作: 创建此视图: 浏览结果:
- Asp.net MVC 视图引擎
Asp.net MVC视图引擎有两种: 1.ASPX View Engine 这个做过WebForm的人都清楚 设计目标:一个用于呈现Web Form页面的输出的视图引擎. 2.Razor View ...
- 【ASP.NET MVC系列】浅谈ASP.NET MVC 视图与控制器传递数据
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
随机推荐
- python之路 - 基础1
1.安装windows安装双版本Python2,Python3 下载Python2和Python3https://www.python.org/downloads/ 分别安装两个版本 进入Python ...
- 【.net 深呼吸】跨应用程序域执行程序集
应用程序域,你在网上可以查到它的定义,凡是概念性的东西,大伙儿只需要会搜索就行,内容看了就罢,不用去记忆,更不用去背,“名词解释”是大学考试里面最无聊最没水平的题型. 简单地说,应用程序域让你可以在一 ...
- 从netty-example分析Netty组件续
上文我们从netty-example的Discard服务器端示例分析了netty的组件,今天我们从另一个简单的示例Echo客户端分析一下上个示例中没有出现的netty组件. 1. 服务端的连接处理,读 ...
- AFNetworking 3.0 源码解读 总结(干货)(下)
承接上一篇AFNetworking 3.0 源码解读 总结(干货)(上) 21.网络服务类型NSURLRequestNetworkServiceType 示例代码: typedef NS_ENUM(N ...
- C++随笔:.NET CoreCLR之corleCLR核心探索之coreconsole(2)
这篇文章是上篇的续集,本文将会继续介绍coreconsole.cpp里面的逻辑.也许大家会看一些CLR的书,我承认我没有看过,因为我觉得一个人,他再NB,那也是他自己的眼光,而且说句难听的,CLR也不 ...
- [干货来袭]C#6.0新特性
微软昨天发布了新的VS 2015 ..随之而来的还有很多很多东西... .NET新版本 ASP.NET新版本...等等..太多..实在没消化.. 分享一下也是昨天发布的新的C#6.0的部分新特性吧.. ...
- php 基础代码大全(不断完善中)
下面是基础的PHP的代码,不断完善中~ //语法错误(syntax error)在语法分析阶段,源代码并未被执行,故不会有任何输出. /* [命名规则] */ 常量名 类常量建议全大写,单词间用下划线 ...
- “老坛泡新菜”:SOD MVVM框架,让WinForms焕发新春
火热的MVVM框架 最近几年最热门的技术之一就是前端技术了,各种前端框架,前端标准和前端设计风格层出不穷,而在众多前端框架中具有MVC,MVVM功能的框架成为耀眼新星,比如GitHub关注度很高的Vu ...
- Android Studio —— 创建Menu菜单项
大多数android程序的右上角都会设置一个菜单按钮比如微信的界面右上角的加号. 这个需要在layout同级目录下新建文件夹命名为menu,再右击新建的menu新建xml文件:
- Android开发学习——画横线竖线
画横线/竖线 竖线 <View android:layout_width="1dp" android:layout_height="match_parent&quo ...