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内容
,以便于您获取更多的相关知识。

时间: 2024-10-04 10:10:10

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

返璞归真 asp.net mvc (4) - View/ViewEngine

原文:返璞归真 asp.net mvc (4) - View/ViewEngine[索引页][源码下载] 返璞归真 asp.net mvc (4) - View/ViewEngine 作者:webabcd 介绍 asp.net mvc 之 View 和 ViewEngine ViewData 和 TempData 都可以向 View 传递数据,其中 TempData 是保存在 Session 中的,一次请求后此 Session 会被清除 HtmlHelper - 在 View 中显示 HTML

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 &amp; EF 构建智能查询 二、模型的设计与ModelBinder

在第一篇中,我讲解了我们要做智能查询的原因,以及基本的解决方案设计.从这篇开始我们开始讲解它的实现过程. 其实在写这一系列文章之初,我其实是想由底至上去讲解,但是我又整理了一遍代码才发现,其实如果不了解最表面的东西,也是不太好深入的. 所以我们的第二篇文章就来讲一下我们这个智能查询框架中最浅,但也是使用最频繁的部分,也就是Model. 首先我们的Entity  或者说数据库的结构如下 另外如下面代码,我们有一个用于传递name=value对,及查询谓词的model 1: public Actio

ASP.NET MVC模型绑定的6个建议,徐汇区网站设计

ASP.NET MVC中的Model Binding使用起来非常简单.你的Action方法需要数据,在传入的HTTP请求中携带着你需要的数据,数据可以在请求的表单数据中,还可能在你的URL地址本身中.通过DefaultModelBinder,可以神奇地将表单中的数据和路由中的数据转换到对象中.Model Binder使得你的控制器代码可以干净地从请求以及关联的环境中分离出来. 这里有一些关于在MVC项目中更好使用Model Binding的建议. Tip#1:最好使用Model Binding而

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

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

ASP.NET MVC之路由特性以及母版页呈现方式(十二)

前言 这一节我们开始讲讲基础的东西也就是如题目所言,个人觉得当学习或者利用MVC时,必须得知道最新迭代版本新增了什么,至少得知道MVC 3.MVC 4或者MVC 5有什么区别,而不至于当利用到低版本时,出现某些特性就懵逼以至于认为是代码出了问题,这一点是很明确需要我们去了解. 话题 在MVC 5之前都是基于约定的路由,如下: routes.MapMvcAttributeRoutes(); routes.MapRoute( name: "Default", url: "{con

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.