程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> ASP.NET MVC的View是如何被呈現出來的?[設計篇]

ASP.NET MVC的View是如何被呈現出來的?[設計篇]

編輯:關於ASP.NET

在前面的四篇文章中,我們介紹了各種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。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved