在前面的四篇文章中,我们介绍了各种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内容
,以便于您获取更多的相关知识。