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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM