1. 程式人生 > 實用技巧 >ASP.Net Core -- Controller返回View

ASP.Net Core -- Controller返回View

Controller

MVC這種架構模式在我們的日常開發中使用的還是比較多的,因為它比較簡便,可以讓我們很輕鬆的構建出HTML頁面,或者是基於HTTP的API。今天學習一下從控制器中返回資料到View的內容。在ASP.Net Core這套框架裡要使用MVC需要新增中介軟體,配置路由,之前講過了,這裡不說了,今天主要還是瞭解一下從Controller返回給View的資料型別或者格式有哪些。

先來看一個例子,在MVC中新增 app.UseMvcWithDefaultRoute()這個中介軟體後就會預設找HomeController裡的Index方法,如下:

HomeController類裡直接寫了一個string型別的方法,這個類並沒有繼承於任何父類,方法直接返回一個字串。啟動專案,輸出"Hello form HomeController",這樣功能雖然可以實現,但是效果不好,因為我們使用是一個string型別,它自己把事全做了,直接返回字串,比較單一。下邊我們將這個類繼承Controller父類,Controller父類裡封裝了好多方法,可以讓我們很簡單的把資料返回給客戶端。資料型別也可以是很多種,比如簡單的引用型別和值型別,或者一些相對比較複雜的型別。

IActionResult

繼承於Controller這個物件要求實現IActionResult這個介面,其實有好多種結果物件都實現了這個介面。如圖:

我們可以看到,當HomeController類繼承Controller父類後,當寫this.的時候,裡邊有很多東西,各種各樣的屬性或者方法,這些內容就是Controller上下文的資訊,比如使用:this.ControllerContext.ActionDescriptor.ActionName 獲取Action的名稱!還可以使用this.HttpContext.Request.Headers 來操作HttpContext裡的request或者response等等.....,但是不建議這樣做,不建議直接在動作裡直接操作HttpContext,這樣不利於單元測試,同時我們還可以獲取一些方法,比如:this.Ok()

我們對Ok這個方法進行反編譯檢視原始碼:

然後再對OkObjectResult進行反編譯,如下:

再對父類ObjectResult進行反編譯,如下:

可以看到,這個方法返回的確實是IActionResult,以及其他的方法,也都是返回的這個型別,所以以後進行開發時候,一般都會用這個型別作為返回型別,當然,也可以使用其他的型別,但是其他型別也一樣實現的是IActionResult這個型別,可能功能不多而已。比如:

返回的型別是ContentResult型別,返回的也是字串,其實這個ContentResult型別也實現了繼承了IActionResult這個介面!

為什麼要使用IActionResult這個型別呢?

因為這樣有利於單元測試,IActionResult是ASP.Net Core MVC框架裡的東西,使用這個型別,它不會立即寫回相應,當我們返回IActionResult這個結果物件的話,它就會告訴MVC下一步該做什麼,從MVC的角度來看,它是呼叫了Controller裡的這個Action,而Action返回型別是IActionResult,也就是說這個Action產生了一個IActionResult型別的物件,下一步這個MVC就要執行這個結果物件,如果我們直接返回string型別,那麼這個方法就會把字串返回出去,但是如果用IActionResult的話,他就並沒有直接將字串返出去,它做的只是決定要把字串返出去,或者說它想要把字串返出去,但是它並沒有這麼做,而MVC框架看到這個方法的返回結果後,就知道它想要這麼做,然後經歷一些處理後才把結果返出去,也就是說,目前IActionResult只是決定要做什麼,而真正做的是MVC框架,做什麼事和誰做是分開的,易擴充套件,更靈活!

返回View

返回檢視我們需要用到Razor引擎:

現在我們返回檢視,如下:

這個時候就會預設找Views資料夾下的Home資料夾裡邊的Index.cshtnl檔案,因為返回的View()裡邊啥也沒寫,預設找和動作名相同的檔案,如果手動寫上,就會尋找們自定義的檔案如下:

這樣就會找Create.cshtml檔案。

現在把Student這個物件返回到檢視,如下:

那麼在這個物件到檢視頁需要用Model表示,後端返回的物件名稱可以隨便起,但是檢視頁就叫Model,這個是C#裡的物件,不是HTML獲取其它內容,如下:

我們可以看到,目前它是dynamic型別的,也就是匿名的,這樣容易出問題,如果後端返回的型別在專案中沒有,或者沒找到,就報錯了,我們需要給他指定說明我們需要的型別,如下:

在檢視頁的頂端加入:@model Tutorials.Web.Model.Student 這個model是小寫的,就好像using一樣,指定當前檢視頁使用哪一個模型,如下:

可以看到,型別從dynamic變成了Student型別,這樣就可以直接使用物件的形式獲取裡邊的內容,如下:

再把資料修改一下,改成集合的形式!

新增一個服務:

實現介面:

註冊服務:

呼叫服務:

檢視頁修改引用,因為現在是集合,不是單個物件了,所以:

最後渲染資料:

最後資料渲染成功!

關於Controller的內容就暫時學習到這!!!