ASP.NET MVC的View是如何被呈现出来的?[设计篇]

在前面的四篇文章中,我们介绍了各种ActionResult以及相关的请求响应机制,但是与“View的呈现”相关的ActionResult是ViewResult。通过ViewResult的执行实现的对View的呈现比上面我们介绍的各种ActionResult要复杂得多,ASP.NET MVC内部设计了一个扩展的View引擎实现了最终的View呈现工作。[本文已经同步到《How ASP.NET MVC Works?》中]

一、View引擎中的View

ASP.NET MVC为我们提供了两种View引擎,它们针对不同的动态View设计方式。一种是传统的Web Form引擎,由于该引擎下View的设计与我们定义.aspx页面一致,又称为ASPX引擎。另外一种则是本书默认采用同时也是推荐使用的Razor引擎。在两种View引擎的工作机制之前,有一个必须要知道的问题:View如何表示?提到View,很多ASP.NET MVC的开发人员可能首先想到的就是定义UI界面的.aspx文件(Web Form引擎)或者.cshtml/.vbhtml文件(Razor引擎)。其实对于View引擎来说,View是一个实现了IView接口类型的对象。如下面的代码片断所示,IView的定义非常简单,仅仅具有唯一的Render方法根据指定的View上下文和TextWriter对象实现对View的呈现。

   1: public interface IView   2: {   3:     void Render(ViewContext viewContext, TextWriter writer);   4: }   5:    6: public class ViewContext : ControllerContext   7: {   8:     //其他成员   9:     public virtual bool ClientValidationEnabled { get; set; }  10:     public virtual bool UnobtrusiveJavaScriptEnabled { get; set; }  11:   12:     public virtual TempDataDictionary TempData { get; set; }  13:     [Dynamic]  14:     public object                     ViewBag { [return: Dynamic] get; }  15:     public virtual ViewDataDictionary ViewData { get; set; }  16:     public virtual IView              View { get; set; }  17:     public virtual TextWriter         Writer { get; set; }  18: }  19:   20: public abstract class HttpResponseBase  21: {  22:     //其他成员  23:     public virtual TextWriter Output { get; set; }  24: }

IView用于呈现View的Render方法具有两个参数,一个是表示View上下文的ViewContext对象。通过上面的代码片断可以看出ViewContext是ControllerContext的子类,用于表示状态数据的ViewData、ViewBag和TempData对应着ControllerBase的同名属性。也就是说当执行从Controller的某个Action方法返回的ViewResult的时候,通过创建的ViewContext保持的状态数据直接来源于Controller对象。

ViewContext具有两个布尔类型属性ClientValidationEnabled和UnobtrusiveJavaScriptEnabled表示是否支持客户端验证和Unobtrusive JavaScript。默认的情况下着两个属性通过同名的AppSettings配置项进行设置。如果应用不具有对应的配置,两个属性默认值为False。

   1: <configuration>   2:   <appSettings>   3:     <add key="ClientValidationEnabled" value="true"/>   4:     <add key="UnobtrusiveJavaScriptEnabled" value="true"/>   5:   </appSettings>   6: </configuration>

配置的范围是针对整个Web应用而言的,这个全局属性还可以通过HtmlHelper的同名静态属性进行设置。值得一提的是,ASP.NET MVC 允许我们针对某个View开启或者关闭对客户端验证和UnobtrusiveJavaScriptEnabled的支持,而这可以通过当前View的HtmlHelper的实例方法EnableClientValidation/EnableUnobtrusiveJavaScript来实现。

   1: public class HtmlHelper   2: {   3:     //其他成员   4:     public void EnableClientValidation();   5:     public void EnableClientValidation(bool enabled);   6:     public void EnableUnobtrusiveJavaScript();   7:     public void EnableUnobtrusiveJavaScript(bool enabled);   8:   9:     public static bool ClientValidationEnabled { get; set; }  10:     public static bool UnobtrusiveJavaScriptEnabled { get; set; }  11: }

接口IView的Render方法的第二个参数是一个TextWriter对象。对于该方法来说,只要我们将内容写入该TextWriter即完成了针对相关内容在View上的呈现,因为在调用Render方法的时候,作为该参数的是当前HttpResponse的Output属性表示的TextWriter。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索view
, 方法
, 引擎
, 属性
, public
, virtual
View内容
,以便于您获取更多的相关知识。

时间: 2016-09-05

ASP.NET MVC的View是如何被呈现出来的?[设计篇]的相关文章

ASP.NET MVC的View是如何呈现出来的[实例篇]

在<[设计篇]>篇中我们通过对View引擎的总体介绍讲述了从ViewResult的创建到View呈现的原理,为了让读者对View引擎及其View呈现机制具有一个深刻的认识,我们自定义一个简单的用于呈现静态HTML的StaticFileViewEngine.在一个通过Visual Studio的ASP.NET MVC项目模板创建的空Web应用中,我们定义了如下一个针对于静态HTML内容呈现的自定义StaticFileView.StaticFileView实现了IView接口,在实现的Render

学习ASP.NET MVC(四) View/Model 全解

一.摘要 本文讲解在Action中向View传递Model的几种方式.以及View获取Model以后如何编写显示逻辑.还详细 的介绍了ASP.NET MVC框架提供的Html Helper类的使用及如何为Html Helper类添加自定义扩展方法. 二.承上启下 上一篇文章中我们学习了Controller处理一次请求的全过程.在Controller的Action中, 会传递数据给 View,还会通知View对象开始显示.所以Model是在Action中获取的, 并由Action传递给View.

ASP.NET MVC 音乐商店 - 10. 完成导航和站点的设计

转自 http://www.cnblogs.com/haogj/archive/2011/11/20/2255680.html 我们已经完成了网站的大部分工作,但是,还有一些添加到站点的导航功能,主页,以及商店的浏览页面. 创建购物车汇总部分视图 我们希望在整个站点的页面上都可以看到购物车中的数量.                         通过创建一个部分视图,然后添加到网站的布局中就可以容易地完成, 前面看到,在 ShoppingCart 控制器中包含了一个名为 CartSummary

Asp.Net Mvc Beta新特性之自动绑定(2)-深入探索篇

在上篇中介绍了自动绑定的基本用法,在本篇中,我们将深入了解自动绑定的工作原理. 自动绑定的确是让人感到兴奋的特性,然而,为了让它可以在我们的项目中更好的工作,我们有必要深入了解如何更进一步细调该特性以及它是如何工作的.而本文正式即将揭开这个谜底. 为了更好的了解该特性,我们有必要到codeplex去下载一份asp.net mvc的源代码并分析之,在本文写作的时候,codeplex上已经放上了beta版的源码,如果想进一步了解的朋友可以下载并对照本文分析. 在beta版中,新增了自动绑定这一特性,

ASP.NET MVC的运行机制

一.ASP.NET + MVC IIS与ASP.NET管道 MVC.MVP以及Model2[上篇] MVC.MVP以及Model2[下篇] ASP.NET MVC是如何运行的[1]: 建立在"伪"MVC框架上的Web应用 ASP.NET MVC是如何运行的[2]: URL路由 ASP.NET MVC是如何运行的[3]: Controller的激活 ASP.NET MVC是如何运行的[4]: Action的执行 二.URL 路由 ASP.NET的路由系统:URL与物理文件的分离 ASP.

How ASP.NET MVC Works?

一.ASP.NET + MVC IIS与ASP.NET管道 MVC.MVP以及Model2[上篇] MVC.MVP以及Model2[下篇] ASP.NET MVC是如何运行的[1]: 建立在"伪"MVC框架上的Web应用 ASP.NET MVC是如何运行的[2]: URL路由 ASP.NET MVC是如何运行的[3]: Controller的激活 ASP.NET MVC是如何运行的[4]: Action的执行 二.URL 路由 ASP.NET的路由系统:URL与物理文件的分离 ASP.

ASP.NET MVC的Razor引擎:View编译原理

通过.cshtml或者.vbhtml文件定义的View能够被执行,必须先被编译成存在于某个程序集的类型,ASP.NET MVC采用动态编译的方式对View文件实施编译.当我们在对ASP.NET MVC进行部署的时候,需要对.cshtml或者.vbhtml文件进行打包.针对某个View的第一次访问会触发针对它的编译,一个View对应着一个类型.我们可以对.cshtml或者.vbhtml进行修改,View文件修改后的第一次访问将会导致View的再一次编译.和ASP.NET 传统的编译方式一样,针对V

用ASP.NET MVC自己管理自己的View:ASP.NET MVC File Management

频繁的与美工交接,频繁的通过FTP.远程连接上传文件,哪怕是改一个字节都要传一次服务器.日常 开发中有太多的很烦很烦的界面修改,于是我之前做了ASP.NET MVC View Management,用于管理服务器 上ASP.NET MVC中View文件的小改动,不过后来又感觉到有些配置文件有时也要修改,于是将其扩展至上 一层,使之能管理更多的文件. 在这个项目中,我没有考虑过多的安全问题与文件是否可编辑的问题,因为我是假定系统管理員在了 解系统的情况下,去使用的,而且系统管理員也可以很好地将这个

ASP.NET MVC Routing概述 C#描述

ASP.NET Routing模块的责任是将传入的浏览器请求映射为特有的MVC controller actions. 使用 默认的Route Table 当你创建一个新的ASP.NET MVC应用程序,这个应用程序已经被配置用来使用ASP.NET Routing. ASP.NET Routing 在2个地方设置.第一个,ASP.NET Routing 在你的应用程序中的Web配置文件( Web.config文件)是有效的.在配置文件中有4个与routing相关的代码片段:system.web.