1. 程式人生 > >快速入門系列--MVC--06視圖

快速入門系列--MVC--06視圖

出版 value 快速入門 stream 類型 path .cn esc eba

到了View的呈現板塊,感覺ASP.NET MVC的學習也進入了尾聲,還是比較開心的,畢竟也有了不小收獲。這部分內容相對比較簡單,因為之前還專門學習過如何結合HTML5與MVC框架。前文中提到過,ActionResult的執行實際就是View呈現的入口。不同類型的ActionResult比較多,以下做個簡要的介紹。

類型 簡介
EmptyResult 最簡單的Result,只是為了符合框架的流程。
ContentResult 可以設置ContentType為javascript, CSS等,默認將基本類型的返回值轉化為ContentResult。
FileResult 包含FileContentResult, FilePathResult, FileStreamResult
JavascriptResult 在服務端動態生成javascript並作為請求的相應。
JsonResult 提供對象和Json字符串的序列化與返序列化
HttpStatusCodeResult 方便返回Http狀態碼
RedirectResult RedirectToRouteResult 前者是我們可以直接重定向到指定的目標地址,後者幫助我們根據註冊的路由進行重定向,不提供URL參數,而提供RouteName和RouteValues。類似httpResponse的Redirect/RedirectPermanent,在SEO中,前者會使永久重定向目的地址更新為搜索引擎的索引,後則不會。

接下來介紹最重要的ViewResult以及VIewEngine的概念。View實現IView接口,其實就是一個Render方法,參數ViewContext除了常見屬性外,還有兩個與js相關屬性(CleintValidationEnabled, UnobstrusiveJavascriptEnabled),特別的是object類型的ViewBag用了[Dynamic]特性。ViewEngine也實現了相應的接口,註意View緩存,SearchedLocations屬性包含了所有的查找路徑,FindView方法的的返回名稱比較奇怪,ViewEngineResult,但實際的意思應該是這個Result包含View和ViewEngine信息。在另一篇管自定義ViewEngine的博文中對這一塊進行了更加深入的介紹。

再則簡要的介紹下Razor引擎,我們知道.cshtml文件並不能直接執行,必須先動態編譯後才能使用,那麽問題來了,編譯成什麽文件的文件名是什麽,所屬的程序集為什麽?並存放在哪呢?

文件名為:ASP_Page_views_XXX_ActionXXX_cshtml

程序集名由代碼可知:

技術分享 View Code

編譯的臨時文件的路徑為:

"%WinDir%\Microsoft.NET\Framework\{VersionNo}\Temporary ASP.NET Files\"

可以通過如下配置,變更路徑:

技術分享 View Code

補充一個獲得編譯後類型和程序集的方法,使用BuilderManager類型的靜態方法GetCompiledType和GetCompiledAssembly。

View文件編譯生成的類型為WebViewPage<TModel>,也就是說.cshtml編譯後的類型均為以上類型。其基類WebPageExecutingBase包含Execute, Write, WriteLiteral等方法。該基類的另一個自雷WebPageRendingBase包含Layout, IsAjax, Server, Session, Profile, Cache等屬性,以及輸出整個頁面的抽象方法ExecutePageHierarchy。

WebViewPage還有一個直接基類WebPageBase,它實現類抽象方法ExecutePageHierarchy,最終呈現的頁面包含3部分內容:布局文件、開始頁面View本身。蔣老師提供的一個不錯的布局例子代碼如下所示:

技術分享 View Code

看到這個我才真正明白了以前在代碼中的RenderBody是如何使用的,布局文件和View是如何結合的。

技術分享

細節:(可以考慮插入到原有的文章中,這樣比較合理哈)

Return View("NotIndex");命名視圖

Return View("~/Views/Example/Index.cshtml");

簡單請款下推薦使用Dynamic的ViewBag,復雜推薦強類型的ViewModel,在使用強類型時,為了方便,推薦將其加入配置文件中,如下所示。

技術分享 View Code

此外,比較有意思的是,可以通過Install-Package XXX命令安裝自己的程序集。

視圖模型部分推薦大家使用MVVM模式,盡可能的使數據扁平化,便於強類型的數據管理。

在(設定好Model後)通過基架模板Scaffold template(T4模板)新建視圖時,支持Empty、Create、Delete、Details、Edit、List等類型的視圖。通過設置RefenceScriptLib添加JQuery(包括非侵入版)驗證等相關js。

Razor引擎簡單介紹:

通過"@"進行代碼和標記的轉換符,@@表示原有的@,@(表達式)

表達式 值(只是示例,勿深究)
@ProductList.Length 3
@@ @,轉義
Item_@(item.length) Item_3
@{ xxx } 代碼塊
@{ Html.RenderPartial("SomePartial"); } 代碼行
@foreach(var item in items){<span>Item @item.Name</span>} 循環
@if(showMessage){<text>xxx<text>} 判斷
@* ………………..*@ 註釋,這個需要註意哦,不然可能會出錯
@(Html.SomeMethod<Type>) 泛型需要加括號

所有後臺數據的呈現默認使用HTML編碼(這個html標記類型為System.Web.IHtmlString),如果遇到特殊字符,如<script>alert(‘hacked!‘)<alert>等情況,會編碼為&lt;script&gt;….,如果需要原樣輸出,[email protected](message)。這樣就夠了麽?不然,在前端如果使用js處理後臺數據時,為了防止跨站腳本攻擊,[email protected]()‘防止XSS攻擊。

布局,[email protected],[email protected]("Footer")為Footer占位,[email protected] Footer{ html內容 }設置,否則會拋出異常,一個比較合理的例子如下。

技術分享 View Code

此外,還可以使用_ViewStart.cshtml頁面設置布局頁,它可以遞歸到相應的子目錄中,它先於所有頁面的渲染。

技術分享

最後一點是,可以通過部分視圖的方式,來滿足Ajax調用的需要,這個需要時html文件,而僅僅是json要註意。

技術分享 View Code

註:本文主要供自己學習,不妥之處望見諒。

參考資料:

[1]蔣金楠. ASP.NET MVC4框架揭秘[M]. 上海:電子工業出版社, 2012. 390-444

[2](美)加洛韋. ASP.NET MVC 4高級編程(第4版)[M]. 北京:清華大學出版社, 2012.

快速入門系列--MVC--06視圖