快速入門系列--MVC--06視圖
到了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>等情況,會編碼為<script>….,如果需要原樣輸出,[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視圖