ASP.NET MVC 視圖(一)
前言
從本篇開始就進入到了MVC中的視圖部分,在前面的一些篇幅中或多或少的對視圖和視圖中的一些對象的運用進行了描述,不過畢竟不是視圖篇幅說的不全面,本篇首先為大家講解一下自定義視圖引擎的定義和使用,由此慢慢的來了解視圖引擎以及視圖子產品的工作過程。
ASP.NETMVC 視圖
l 自定義視圖引擎簡易示例
l Razor視圖引擎執行過程
l Razor視圖的依賴注入、自定義視圖輔助器
l 分段、分部視圖的使用
l Razor文法、視圖輔助器
自定義視圖引擎
在講解自定義視圖引擎之前,我們先來了解一下其中涉及到的一些對象類型。
首先來看IViewEngine接口類型的定義:
代碼1-1
1
2
3
4
5
6
<code>public</code> <code>interface</code> <code>IViewEngine</code>
<code> </code><code>{</code>
<code> </code><code>ViewEngineResultFindPartialView(ControllerContextcontrollerContext, </code><code>string</code> <code>partialViewName, </code><code>bool</code> <code>useCache);</code>
<code> </code><code>ViewEngineResultFindView(ControllerContextcontrollerContext, </code><code>string</code> <code>viewName, </code><code>string</code> <code>masterName, booluseCache);</code>
<code> </code><code>voidReleaseView(ControllerContextcontrollerContext, IView view);</code>
<code> </code><code>}</code>
在代碼1-1中我們可以看到IViewEngine接口類型中定義了三個方法,第一個FindPartialView()方法中第一個參數是控制器上下文類型,裡面包含着ViewData、ViewBag一些資訊等,第二個字元串類型的參數表示為分部視圖的名稱,第三個參數是布爾值類型的參數表示是否緩存目前資訊。
FindView()方法和FindPartialView()方法相似,隻是多了一個viewName參數,表示視圖名稱。
這裡實際的實作都是根據不同的視圖引擎類型在這兩個方法中傳回對應視圖引擎類型的IView【視圖處理類型】,這個部分内容會在一下個篇幅中講解到。
ReleaseView()方法則是用來釋放IView中處理視圖的資源。
ViewEngineResult類型是封裝着IViewEngine類型和IView類型的一個操作傳回類型,上面的兩個方法的傳回類型都是ViewEngineResult類型。
代碼1-2
7
8
9
<code>public</code> <code>class</code> <code>ViewEngineResult</code>
<code>{</code>
<code> </code><code>publicViewEngineResult(IEnumerable<</code><code>string</code><code>> searchedLocations);</code>
<code> </code><code>publicViewEngineResult(IView view, IViewEngine viewEngine);</code>
<code> </code>
<code> </code><code>public</code> <code>IEnumerable<</code><code>string</code><code>>SearchedLocations { </code><code>get</code><code>; }</code>
<code> </code><code>public</code> <code>IView View { </code><code>get</code><code>;}</code>
<code> </code><code>public</code> <code>IViewEngine ViewEngine { </code><code>get</code><code>;}</code>
在代碼1-2中我們可以看到ViewEngineResult類型的兩個構造函數,第一個可枚舉字元串類型表示的是搜尋視圖位置位址的這麼一個集合,第二個不用說了就是對象封裝了。
我們再來看一下IView的定義:
代碼1-3
10
11
12
13
<code>public</code> <code>interface</code> <code>IView</code>
<code> </code><code>// 摘要:</code>
<code> </code><code>// 使用指定的編寫器對象來呈現指定的視圖上下文。</code>
<code> </code><code>//</code>
<code> </code><code>// 參數:</code>
<code> </code><code>// viewContext:</code>
<code> </code><code>// 視圖上下文。</code>
<code> </code><code>// writer:</code>
<code> </code><code>// 編寫器對象。</code>
<code> </code><code>voidRender(ViewContext viewContext, TextWriter writer);</code>
IView類型的在我的了解就是視圖處理類型,它隻是代表着一種類型的視圖,比如說Razor視圖是cshtml格式的檔案,對應的IView就是RazorView這個處理類型,這個下篇會講到。
先來看一下下面所要講解的示例的示意圖:
圖1
<a href="http://s3.51cto.com/wyfs02/M02/3F/A5/wKiom1PLq5ryzzfFAAG-ySaBFVo789.jpg" target="_blank"></a>
大概流程是這樣的,首先在我們控制器方法傳回ViewResult的時候,ViewResult會從系統的IViewEngine集合中中讀取IViewEngine,并且執行每個IViewEngine的FindView【假使是視圖】,執行中某一個IViewEngine有傳回ViewEngineResult類型的話則會停下向下執行,而是執行ViewEngineResult類型中的IView的Render()方法。最後視圖的呈現則不是MVC部分負責的了下一篇中會講解。現在我們來看一下示例。
首先是自定義的IViewEngine:
代碼1-4
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<code>using</code> <code>System.Web.Mvc;</code>
<code>using</code> <code>MvcApplication.CustomView;</code>
<code>namespace</code> <code>MvcApplication.CustomViewEngine</code>
<code> </code><code>public</code> <code>class</code> <code>MyCustomViewEngine: IViewEngine</code>
<code> </code><code>public</code> <code>ViewEngineResult FindPartialView(ControllerContext controllerContext, </code><code>string</code> <code>partialViewName, booluseCache)</code>
<code> </code><code>{</code>
<code> </code><code>returnnew ViewEngineResult(</code><code>new</code> <code>string</code><code>[] { </code><code>"MyCustomView "</code> <code>});</code>
<code> </code><code>}</code>
<code> </code><code>public</code> <code>ViewEngineResult FindView(ControllerContextcontrollerContext, </code><code>string</code> <code>viewName, </code><code>string</code> <code>masterName, booluseCache)</code>
<code> </code><code>if</code><code>(viewName == </code><code>"MyCustomView"</code><code>)</code>
<code> </code><code>{</code>
<code> </code><code>returnnew ViewEngineResult(</code><code>new</code> <code>MyCustomView(),</code><code>this</code><code>);</code>
<code> </code><code>}</code>
<code> </code><code>else</code>
<code> </code><code>returnnew ViewEngineResult(</code><code>new</code> <code>string</code><code>[] { </code><code>"MyCustomView "</code> <code>});</code>
<code> </code><code>public</code> <code>void</code> <code>ReleaseView(ControllerContextcontrollerContext, IView view)</code>
<code>}</code>
這裡隻是在FindView()方法中實作了一個基礎的代碼,如果是視圖名稱為"MyCustomView",則會傳回MyCustomView類型的視圖處理類型作為ViewEngineResult類型的構造函數參數來傳回。
自定義的IView:
代碼1-5
<code>namespace</code> <code>MvcApplication.CustomView</code>
<code> </code><code>public</code> <code>class</code> <code>MyCustomView:IView</code>
<code> </code><code>public</code> <code>void</code> <code>Render(ViewContextviewContext, System.IO.TextWriter writer)</code>
<code> </code><code>foreach</code><code>(</code><code>string</code> <code>key inviewContext.ViewData.Keys)</code>
<code> </code><code>writer.Write(</code><code>"Key:"</code> <code>+ key + </code><code>",Value:"</code><code>+ viewContext.ViewData[key] + </code><code>".<p/>"</code><code>);</code>
代碼1-5中的定義則是簡單的向writer中寫入ViewData的值,并且最後呈現在視圖頁面上。
最後我們要把自定義的視圖引擎添加到系統的視圖引擎集合中,在Global.asax檔案的Application_Start()方法中。
代碼1-6
<code>ViewEngines.Engines.Insert(0, newCustomViewEngine.MyCustomViewEngine());</code>
這種添加的方式不多說了,前面篇幅對于這種模式的已經說過了,讓自定義的排在集合的第一位而已。
最後随意的在某個控制器方法中代碼修改為如下代碼:
代碼1-7
<code>public</code> <code>ActionResultCustomView()</code>
<code> </code><code>this</code><code>.ViewData.Add(</code><code>"DebugData"</code><code>, </code><code>"Jinyuan"</code><code>);</code>
<code> </code><code>this</code><code>.ViewData.Add(</code><code>"DebugDate"</code><code>, </code><code>"2014-01-01"</code><code>); </code>
<code> </code><code>returnView(</code><code>"MyCustomView"</code><code>);</code>
圖2
<a href="http://s3.51cto.com/wyfs02/M02/3F/A5/wKiom1PLq-CiYpRvAADU2IMK_UA436.jpg" target="_blank"></a>
本文轉自jinyuan0829 51CTO部落格,原文連結:http://blog.51cto.com/jinyuan/1440579,如需轉載請自行聯系原作者