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

來源:互聯網
上載者:User

標籤:rip   amp   狀態   caff   template   情況   write   img   技術分享   

    到了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
@@ @,轉義
[email protected](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;….,如果需要原樣輸出,需要使用@Html.Raw(message)。這樣就夠了嗎?不然,在前端如果使用js處理後台資料時,為了防止跨站指令碼攻擊,還需要使用‘@Ajax.JavaScriptStringEncode()‘防止XSS攻擊。

布局,使用在Layout頁面中使用@RenderBody可以為主體佔位,也可以用的@RenderSection("Footer")為Footer佔位,這時需要在頁面中通過@section 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視圖

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.