ASP.NET?Core?MVC中的視圖(Views)
ASP.NET Core MVC 控制器可以使用視圖返回格式化的結(jié)果。
1.什么是視圖
在 MVC 中,視圖封裝了用戶與應(yīng)用交互呈現(xiàn)細(xì)節(jié)。視圖是具有生成要發(fā)送到客戶端內(nèi)容的,包含嵌入代碼的HTML模板。視圖使用使用 Razor 語(yǔ)法,該語(yǔ)法允許以最少的代碼或復(fù)雜度與 HTML 進(jìn)行交互。
ASP.NET Core MVC 視圖默認(rèn)以 .cshtml 文件保存在應(yīng)用程序的 Views 文件夾里面。通常,每個(gè)控制器都有自己的文件夾,其中包含對(duì)應(yīng)控制器操作方法的視圖。
除了對(duì)應(yīng)操作的視圖,局部視圖,布局以及其他特定視圖文件可以用來(lái)減少重復(fù),并允許在視圖中重復(fù)使用。
視圖在 MVC 應(yīng)用程序中提供了關(guān)注的分離,將用戶界面級(jí)標(biāo)記與業(yè)務(wù)邏輯分開(kāi)封裝。通常,可以通過(guò) 布局與共享指令<layout>或布局視圖<partial>對(duì)應(yīng)的用戶界面中重復(fù)使用。
2.創(chuàng)建視圖
屬于某個(gè)控制器的視圖創(chuàng)建在 Views/[ControllerName] 文件夾下。在控制器之間公用的視圖則放在 /Views/Shared 文件夾下。將視圖命名為與其關(guān)聯(lián)的控制器操作一樣的名字,并添加 .cshtml 擴(kuò)展名。例如,為Home 控制器的 About 操作創(chuàng)建一個(gè)視圖,則應(yīng)在 /Views/Home 文件夾下創(chuàng)建一個(gè) About.cshtml 文件,或者在操作方法上右鍵點(diǎn)擊添加視圖:
@{ ViewData["Title"] = "About"; } <h2>@ViewData["Title"]</h2> <h3>@ViewData["Message"]</h3> <p>Use this area to provide additional information.</p>
@ 符號(hào)代表 Razor 代碼。C# 語(yǔ)法在 { } 包裹的 Razor 代碼塊中運(yùn)行,Razor 可以通過(guò)運(yùn)用 @ 符號(hào)對(duì)值進(jìn)行操作,從而在HTML中顯示,就像上面 <h2> 和 <h3> 元素里面展示的那樣。
這個(gè)視圖只關(guān)心由它負(fù)責(zé)的這部分輸出。而頁(yè)面布局的部分,以及視圖中的通用外觀,在別的地方指定。
3.控制器指定視圖
視圖通常作為 ViewResult 從操作返回。操作方法可以直接創(chuàng)建和返回一個(gè) ViewResult ,但一般,如果控制器繼承自 Controller ,則只需使用 View 輔助方法即可:
public IActionResult About() { ViewData["Message"] = "Your application description page."; return View(); }
View 的輔助方法有多個(gè)重載,以便于返回視圖。可以有選擇性地指定一個(gè)返回的視圖,還可以給視圖返回一個(gè)模型對(duì)象。
當(dāng)操作返回視圖時(shí),將發(fā)生稱為視圖發(fā)現(xiàn)的過(guò)程。此過(guò)程將確定使用哪個(gè)視圖文件。除非指定了特定的視圖文件,否則運(yùn)行時(shí)首先查找控制器對(duì)應(yīng)的視圖,然后在 Share 文件夾中查找匹配的視圖名稱。
當(dāng)操作返回 View 方法時(shí),比如 return View(); 這個(gè)操作的名字則被用作視圖名稱。也可以給這個(gè)方法床底一個(gè)明確的視圖名稱 return View("SomeView"); 。這兩種情況視圖都會(huì)在對(duì)應(yīng)控制器的視圖文件夾和Share文件夾搜索匹配的文件。
可以提供視圖文件的路徑,在這種情況下, .cshtml 擴(kuò)展名必須指定為文件路徑的一部分,return View(“Views/Home/About.cshtml ”);
4.給視圖傳遞數(shù)據(jù)
ASP.NET Core MVC 可以使用多種機(jī)制給視圖傳遞數(shù)據(jù)。最健壯的方式是在視圖中指定一個(gè)模型類型(通常稱為視圖模型,以區(qū)別于業(yè)務(wù)領(lǐng)域的模型類型),然后將此類型的實(shí)例從操作傳遞到視圖。建議使用模型或視圖模型將數(shù)據(jù)傳遞到視圖。這允許視圖利用強(qiáng)類型檢查,可以使用 @model 指令為視圖指定模型:
@model MVCTest.Models.Operation @{ ViewData["Title"] = "Create"; } <h2>Create</h2> <h4>Operation</h4> <hr /> <div class="row"> <div class="col-md-4"> <form asp-action="Create"> <div asp-validation-summary="ModelOnly" class="text-danger"></div> <div class="form-group"> <label asp-for="Id" class="control-label"></label> <input asp-for="Id" class="form-control" /> <span asp-validation-for="Id" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="Name" class="control-label"></label> <input asp-for="Name" class="form-control" /> <span asp-validation-for="Name" class="text-danger"></span> </div> <div class="form-group"> <input type="submit" value="Create" class="btn btn-default" /> </div> </form> </div> </div> <div> <a asp-action="Index">Back to List</a> </div>
一旦為視圖指定了模型,就可以使用 @Model 以強(qiáng)類型方式訪問(wèn)發(fā)送到視圖的實(shí)例。(@Model.Name)上面使用的標(biāo)簽助手。控制器向視圖提供實(shí)例:
public ActionResult Create() { var model = new Operation() { Id=1, Name="test" }; return View(model); }
對(duì)于可以作為模型提供給視圖的類型沒(méi)有限制,建議傳遞具有很少或沒(méi)有行為的視圖模型,以便將業(yè)務(wù)邏輯封裝在應(yīng)用程序的其他位置。
1.弱類型數(shù)據(jù)
除了強(qiáng)類型視圖之外,所有視圖都可以訪問(wèn)弱類型的數(shù)據(jù)集合。此集合可以通過(guò)控制器和視圖上的 ViewData 或 ViewBag 屬性進(jìn)行引用。ViewBag 屬于 ViewData 的一個(gè)包裝器,它提供了該集合的動(dòng)態(tài)視圖,它不是一個(gè)單獨(dú)的集合。
ViewData 是通過(guò)字符串鍵訪問(wèn)的字典對(duì)象,可以在其中存儲(chǔ)和檢索對(duì)象。當(dāng)提取對(duì)象時(shí),需要將它們轉(zhuǎn)化為特定類型??梢允褂?nbsp;ViewData 將數(shù)據(jù)從控制器傳遞到視圖,以及在視圖(局部視圖和布局)中傳遞。字符串可以直接存儲(chǔ)和使用,不需要轉(zhuǎn)化:
public IActionResult About() { var model = new Operation() { Id=1, Name="test" }; ViewData["Operation"] = model ; ViewData["Message"] = "Your application description page."; return View(); }
視圖:
@{ ViewData["Title"] = "About"; //需要轉(zhuǎn)化 var operation = ViewData["Operation"] as Operation ; } <h2>@ViewData["Title"]</h2> <h3>@ViewData["Message"]</h3> <h3>@operation.Id</h3> <h3>@operation.Name</h3> <p>Use this area to provide additional information.</p>
ViewBag 對(duì)象提供對(duì)存儲(chǔ)在 ViewData 中的對(duì)象的動(dòng)態(tài)訪問(wèn),這樣可以更方便的使用,因?yàn)椴恍枰D(zhuǎn)換:
@{ ViewData["Title"] = "About"; } <h2>@ViewData["Title"]</h2> <h3>@ViewData["Message"]</h3> <h3>@ViewBag.Operation.Id</h3> <h3>@ViewBag.Operation.Name</h3> <p>Use this area to provide additional information.</p>
由于兩者都指向相同的底層 ViewData 集合,因此如果方便,可以在讀取和寫入值時(shí),在 ViewBag 和 ViewData 之間可以混合使用。
2.動(dòng)態(tài)視圖
不聲明類型,但具有傳遞給它們的模型實(shí)例的視圖可以動(dòng)態(tài)引用此實(shí)例。但不提供任何編譯保護(hù)或 IntelliSense 。如果屬性不存在,則頁(yè)面將在運(yùn)行時(shí)出錯(cuò)。
5.更多視圖特性
標(biāo)簽助手可以輕松地將服務(wù)器端行為添加到現(xiàn)有地 HTML 標(biāo)簽中,從而避免在視圖中使用自定義代碼或助手代碼。
生成自定義 HTML 標(biāo)記可以使用許多內(nèi)置地 HTML 助手來(lái)實(shí)現(xiàn),更復(fù)雜地 UI 邏輯(可能具有自己地?cái)?shù)據(jù)需求)可以封裝在視圖組件(View Components)中。視圖組件提供了與控制器和視圖提供的相同的關(guān)注點(diǎn),并且可以消除對(duì)于處理由常見(jiàn)UI 元素使用數(shù)據(jù)的動(dòng)作和視圖的需要。
視圖頁(yè)支持依賴注入,允許服務(wù)注入到視圖。
到此這篇關(guān)于ASP.NET Core MVC視圖的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
ASP.NET?Core中Razor頁(yè)面的Handlers處理方法詳解
本文詳細(xì)講解了ASP.NET?Core中Razor頁(yè)面的Handlers處理方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02C#Web應(yīng)用程序入門經(jīng)典學(xué)習(xí)筆記之一
C#Web應(yīng)用程序入門經(jīng)典學(xué)習(xí)筆記之一...2006-08-08WPF使用ValidationRules對(duì)MVVM架構(gòu)數(shù)據(jù)驗(yàn)證
這篇文章介紹了WPF使用ValidationRules對(duì)MVVM架構(gòu)數(shù)據(jù)驗(yàn)證的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01ASP.NET處理HTTP請(qǐng)求的流程:IHttpModule、IHttpHandler與管道事件
這篇文章介紹了ASP.NET處理HTTP請(qǐng)求的流程:IHttpModule、IHttpHandler與管道事件,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05asp.net平臺(tái)下C#實(shí)現(xiàn)Socket通信
這篇文章介紹了asp.net平臺(tái)下C#實(shí)現(xiàn)Socket通信的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01C#Web應(yīng)用程序入門經(jīng)典學(xué)習(xí)筆記之二
C#Web應(yīng)用程序入門經(jīng)典學(xué)習(xí)筆記之二...2006-08-08