從本篇開始就進入到了MVC中的視圖部分,在前面的一些篇幅中或多或少的對視圖和視圖中的一些對象的運用進行了描述,不過畢竟不是視圖篇幅說的不全面,本篇首先爲你們講解一下自定義視圖引擎的定義和使用,由此慢慢的來了解視圖引擎以及視圖模塊的工做過程。html
在講解自定義視圖引擎以前,咱們先來了解一下其中涉及到的一些對象類型。緩存
首先來看IViewEngine接口類型的定義:函數
代碼1-1this
public interface IViewEngine { ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache); ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache); void ReleaseView(ControllerContext controllerContext, IView view); }
在代碼1-1中咱們能夠看到IViewEngine接口類型中定義了三個方法,第一個FindPartialView()方法中第一個參數是控制器上下文類型,裏面包含着ViewData、ViewBag一些信息等,第二個字符串類型的參數表示爲分部視圖的名稱,第三個參數是布爾值類型的參數表示是否緩存當前信息。spa
FindView()方法和FindPartialView()方法類似,只是多了一個viewName參數,表示視圖名稱。code
這裏實際的實現都是根據不一樣的視圖引擎類型在這兩個方法中返回對應視圖引擎類型的IView【視圖處理類型】,這個部份內容會在一下個篇幅中講解到。htm
ReleaseView()方法則是用來釋放IView中處理視圖的資源。對象
ViewEngineResult類型是封裝着IViewEngine類型和IView類型的一個操做返回類型,上面的兩個方法的返回類型都是ViewEngineResult類型。blog
代碼1-2接口
public class ViewEngineResult { public ViewEngineResult(IEnumerable<string> searchedLocations); public ViewEngineResult(IView view, IViewEngine viewEngine); public IEnumerable<string> SearchedLocations { get; } public IView View { get; } public IViewEngine ViewEngine { get; } }
在代碼1-2中咱們能夠看到ViewEngineResult類型的兩個構造函數,第一個可枚舉字符串類型表示的是搜索視圖位置地址的這麼一個集合,第二個不用說了就是對象封裝了。
咱們再來看一下IView的定義:
代碼1-3
public interface IView { // 摘要: // 使用指定的編寫器對象來呈現指定的視圖上下文。 // // 參數: // viewContext: // 視圖上下文。 // // writer: // 編寫器對象。 void Render(ViewContext viewContext, TextWriter writer); }
IView類型的在個人理解就是視圖處理類型,它只是表明着一種類型的視圖,好比說Razor視圖是cshtml格式的文件,對應的IView就是RazorView這個處理類型,這個下篇會講到。
先來看一下下面所要講解的示例的示意圖:
圖1
大概流程是這樣的,首先在咱們控制器方法返回ViewResult的時候,ViewResult會從系統的IViewEngine集合中中讀取IViewEngine,而且執行每一個IViewEngine的FindView【假使是視圖】,執行中某一個IViewEngine有返回ViewEngineResult類型的話則會停下向下執行,而是執行ViewEngineResult類型中的IView的Render()方法。最後視圖的呈現則不是MVC部分負責的了下一篇中會講解。如今咱們來看一下示例。
首先是自定義的IViewEngine:
代碼1-4
using System.Web.Mvc; using MvcApplication.CustomView; namespace MvcApplication.CustomViewEngine { public class MyCustomViewEngine : IViewEngine { public ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache) { return new ViewEngineResult(new string[] { " MyCustomView " }); } public ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache) { if (viewName == "MyCustomView") { return new ViewEngineResult(new MyCustomView(), this); } else { return new ViewEngineResult(new string[] { " MyCustomView " }); } } public void ReleaseView(ControllerContext controllerContext, IView view) { } } }
這裏只是在FindView()方法中實現了一個基礎的代碼,若是是視圖名稱爲"MyCustomView",則會返回MyCustomView類型的視圖處理類型做爲ViewEngineResult類型的構造函數參數來返回。
自定義的IView:
代碼1-5
using System.Web.Mvc; namespace MvcApplication.CustomView { public class MyCustomView:IView { public void Render(ViewContext viewContext, System.IO.TextWriter writer) { foreach (string key in viewContext.ViewData.Keys) { writer.Write("Key:" + key + ",Value:" + viewContext.ViewData[key] + ".<p/>"); } } } }
代碼1-5中的定義則是簡單的向writer中寫入ViewData的值,而且最後呈如今視圖頁面上。
最後咱們要把自定義的視圖引擎添加到系統的視圖引擎集合中,在Global.asax文件的Application_Start()方法中。
代碼1-6
ViewEngines.Engines.Insert(0, new CustomViewEngine.MyCustomViewEngine());
這種添加的方式很少說了,前面篇幅對於這種模式的已經說過了,讓自定義的排在集合的第一位而已。
最後隨意的在某個控制器方法中代碼修改成以下代碼:
代碼1-7
public ActionResult CustomView() { this.ViewData.Add("DebugData", "Jinyuan"); this.ViewData.Add("DebugDate", "2014-01-01"); return View("MyCustomView"); }
圖2
做者:金源
出處:http://www.cnblogs.com/jin-yuan/
本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面