ASP.NET MVC視圖(一)
創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供高密網(wǎng)站建設(shè)、高密做網(wǎng)站、高密網(wǎng)站設(shè)計、高密網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、高密企業(yè)網(wǎng)站模板建站服務(wù),十余年高密做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
前言
從本篇開始就進(jìn)入到了MVC中的視圖部分,在前面的一些篇幅中或多或少的對視圖和視圖中的一些對象的運用進(jìn)行了描述,不過畢竟不是視圖篇幅說的不全面,本篇首先為大家講解一下自定義視圖引擎的定義和使用,由此慢慢的來了解視圖引擎以及視圖模塊的工作過程。
ASP.NETMVC視圖
l 自定義視圖引擎簡易示例
l Razor視圖引擎執(zhí)行過程
l Razor視圖的依賴注入、自定義視圖輔助器
l 分段、分部視圖的使用
l Razor語法、視圖輔助器
自定義視圖引擎
在講解自定義視圖引擎之前,我們先來了解一下其中涉及到的一些對象類型。
首先來看IViewEngine接口類型的定義:
代碼1-1
public interface IViewEngine { ViewEngineResultFindPartialView(ControllerContextcontrollerContext, string partialViewName, bool useCache); ViewEngineResultFindView(ControllerContextcontrollerContext, string viewName, string masterName, booluseCache); voidReleaseView(ControllerContextcontrollerContext, IView view); }
在代碼1-1中我們可以看到IViewEngine接口類型中定義了三個方法,第一個FindPartialView()方法中第一個參數(shù)是控制器上下文類型,里面包含著ViewData、ViewBag一些信息等,第二個字符串類型的參數(shù)表示為分部視圖的名稱,第三個參數(shù)是布爾值類型的參數(shù)表示是否緩存當(dāng)前信息。
FindView()方法和FindPartialView()方法相似,只是多了一個viewName參數(shù),表示視圖名稱。
這里實際的實現(xiàn)都是根據(jù)不同的視圖引擎類型在這兩個方法中返回對應(yīng)視圖引擎類型的IView【視圖處理類型】,這個部分內(nèi)容會在一下個篇幅中講解到。
ReleaseView()方法則是用來釋放IView中處理視圖的資源。
ViewEngineResult類型是封裝著IViewEngine類型和IView類型的一個操作返回類型,上面的兩個方法的返回類型都是ViewEngineResult類型。
代碼1-2
public class ViewEngineResult { publicViewEngineResult(IEnumerablesearchedLocations); publicViewEngineResult(IView view, IViewEngine viewEngine); public IEnumerable SearchedLocations { get; } public IView View { get;} public IViewEngine ViewEngine { get;} }
在代碼1-2中我們可以看到ViewEngineResult類型的兩個構(gòu)造函數(shù),第一個可枚舉字符串類型表示的是搜索視圖位置地址的這么一個集合,第二個不用說了就是對象封裝了。
我們再來看一下IView的定義:
代碼1-3
public interface IView { // 摘要: // 使用指定的編寫器對象來呈現(xiàn)指定的視圖上下文。 // // 參數(shù): // viewContext: // 視圖上下文。 // // writer: // 編寫器對象。 voidRender(ViewContext viewContext, TextWriter writer); }
IView類型的在我的理解就是視圖處理類型,它只是代表著一種類型的視圖,比如說Razor視圖是cshtml格式的文件,對應(yīng)的IView就是RazorView這個處理類型,這個下篇會講到。
先來看一下下面所要講解的示例的示意圖:
圖1
大概流程是這樣的,首先在我們控制器方法返回ViewResult的時候,ViewResult會從系統(tǒng)的IViewEngine集合中中讀取IViewEngine,并且執(zhí)行每個IViewEngine的FindView【假使是視圖】,執(zhí)行中某一個IViewEngine有返回ViewEngineResult類型的話則會停下向下執(zhí)行,而是執(zhí)行ViewEngineResult類型中的IView的Render()方法。最后視圖的呈現(xiàn)則不是MVC部分負(fù)責(zé)的了下一篇中會講解?,F(xiàn)在我們來看一下示例。
首先是自定義的IViewEngine:
代碼1-4
using System.Web.Mvc; using MvcApplication.CustomView; namespace MvcApplication.CustomViewEngine { public class MyCustomViewEngine: IViewEngine { public ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, booluseCache) { returnnew ViewEngineResult(new string[] { "MyCustomView " }); } public ViewEngineResult FindView(ControllerContextcontrollerContext, string viewName, string masterName, booluseCache) { if(viewName == "MyCustomView") { returnnew ViewEngineResult(new MyCustomView(),this); } else { returnnew ViewEngineResult(new string[] { "MyCustomView " }); } } public void ReleaseView(ControllerContextcontrollerContext, IView view) { } } }
這里只是在FindView()方法中實現(xiàn)了一個基礎(chǔ)的代碼,如果是視圖名稱為"MyCustomView",則會返回MyCustomView類型的視圖處理類型作為ViewEngineResult類型的構(gòu)造函數(shù)參數(shù)來返回。
自定義的IView:
代碼1-5
using System.Web.Mvc; namespace MvcApplication.CustomView { public class MyCustomView:IView { public void Render(ViewContextviewContext, System.IO.TextWriter writer) { foreach(string key inviewContext.ViewData.Keys) { writer.Write("Key:" + key + ",Value:"+ viewContext.ViewData[key] + "."); } } } }
代碼1-5中的定義則是簡單的向writer中寫入ViewData的值,并且最后呈現(xiàn)在視圖頁面上。
最后我們要把自定義的視圖引擎添加到系統(tǒng)的視圖引擎集合中,在Global.asax文件的Application_Start()方法中。
代碼1-6
ViewEngines.Engines.Insert(0, newCustomViewEngine.MyCustomViewEngine());
這種添加的方式不多說了,前面篇幅對于這種模式的已經(jīng)說過了,讓自定義的排在集合的第一位而已。
最后隨意的在某個控制器方法中代碼修改為如下代碼:
代碼1-7
public ActionResultCustomView() { this.ViewData.Add("DebugData", "Jinyuan"); this.ViewData.Add("DebugDate", "2014-01-01"); returnView("MyCustomView"); }
圖2