Welcome 微信登录

首页 / 网页编程 / ASP.NET / ASP.NET MVC的View是如何被呈现出来的?[设计篇]

ASP.NET MVC的View是如何被呈现出来的?[设计篇]2012-09-05 博客园 Artech在前面的四篇文章中,我们介绍了各种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 IViewView { 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。