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的內容就暫時學習到這!!!