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

一、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

1:publicinterface IView

 

双击代码全选

1

2: {

 

双击代码全选

1

3:void Render(ViewContext viewContext, TextWriter writer);

 

双击代码全选

1

4: }

 

双击代码全选

1

 

 

双击代码全选

1

6:publicclass ViewContext : ControllerContext

 

双击代码全选

1

7: {

 

双击代码全选

1

8://其他成员

 

双击代码全选

1

9:publicvirtualbool ClientValidationEnabled { get; set; }

 

双击代码全选

1

10:publicvirtualbool UnobtrusiveJavaScriptEnabled { get; set; }

 

双击代码全选

1

11:

 

双击代码全选

1

12:publicvirtual TempDataDictionary TempData { get; set; }

 

双击代码全选

1

13:     [Dynamic]

 

双击代码全选

1

14:publicobject                     ViewBag { [return: Dynamic] get; }

 

双击代码全选

1

15:publicvirtual ViewDataDictionary ViewData { get; set; }

 

双击代码全选

1

16:publicvirtual IView              View { get; set; }

 

双击代码全选

1

17:publicvirtual TextWriter         Writer { get; set; }

 

双击代码全选

1

18: }

 

双击代码全选

1

19:

 

双击代码全选

1

20:publicabstractclass HttpResponseBase

 

双击代码全选

1

21: {

 

双击代码全选

1

22://其他成员

 

双击代码全选

1

23:publicvirtual TextWriter Output { get; set; }

 

双击代码全选

1

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

1:<configuration>

 

双击代码全选

1

2:<appSettings>

 

双击代码全选

1

3:<addkey="ClientValidationEnabled"value="true"/>

 

双击代码全选

1

4:<addkey="UnobtrusiveJavaScriptEnabled"value="true"/>

 

双击代码全选

1

5:</appSettings>

 

双击代码全选

1

6:</configuration>

 

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

双击代码全选

1

1:publicclass HtmlHelper

 

双击代码全选

1

2: {

 

双击代码全选

1

3://其他成员

 

双击代码全选

1

4:publicvoid EnableClientValidation();

 

双击代码全选

1

5:publicvoid EnableClientValidation(bool enabled);

 

双击代码全选

1

6:publicvoid EnableUnobtrusiveJavaScript();

 

双击代码全选

1

7:publicvoid EnableUnobtrusiveJavaScript(bool enabled);

 

双击代码全选

1

 

 

双击代码全选

1

9:publicstaticbool ClientValidationEnabled { get; set; }

 

双击代码全选

1

10:publicstaticbool UnobtrusiveJavaScriptEnabled { get; set; }

 

双击代码全选

1

11: }

 

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

二、ViewEngine

View引擎的核心是一个ViewEngine对象,它实现了IViewEngine接 口。如下面的代码片断所示,IViewEngine定义了两个FindView和FindPartialView方法根据指定的Controller上下 文、View名称和布局文件名称去获取对应的View和Partial View,两个方法中具有一个布尔类型的参数useCache表示是否启用缓存。另一个方法ReleaseView用于释放View对象。

双击代码全选

1

1:publicinterface IViewEngine

 

双击代码全选

1

2: {

 

双击代码全选

1

3:     ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache);

 

双击代码全选

1

4:     ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache);

 

双击代码全选

1

5:void ReleaseView(ControllerContext controllerContext, IView view);

 

双击代码全选

1

6: }

 

FindView 和FindPartialView方法返回的并不是实现了IView接口的类型的对象,而是一个类型为 System.Web.Mvc.ViewEngineResult对象。如下面的代码片断所示,ViewEngineResult的只读属性View和 ViewEngine属性表示找到的View对象和表示自身的ViewEngine对象。在成功获取到对应View的情况下这两个属性会通过构造函数进行 初始化。如果没有找到相应的View,则将一个搜寻位置列表传入另一个构造函数创建一个ViewEngineResult,而只读属性 SearchedLocations表示的就是这么一个搜寻位置列表。

双击代码全选

1

1:publicclass ViewEngineResult

 

双击代码全选

1

2: {

 

双击代码全选

1

3:public ViewEngineResult(IEnumerable<string> searchedLocations);

 

双击代码全选

1

4:public ViewEngineResult(IView view, IViewEngine viewEngine);

 

双击代码全选

1

 

 

双击代码全选

1

6:public IEnumerable<string> SearchedLocations { get; }

 

双击代码全选

1

7:public IView               View { get; }

 

双击代码全选

1

8:public IViewEngine         ViewEngine { get; }

 

双击代码全选

1

9: }

 

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Grow your business fast with

Suku