MVC 是什么?它是如何工作的?我們來解剖它
在本節課中我們要討論的內容:
- 什么是 MVC?
- 它是如何工作的?
什么是 MVC
MVC 由三個基本部分組成 - 模型(Model),視圖(View)和控制器(Controller)。 它是用於實現應用程序的用戶界面層的架構設計模式。 一個典型的實際應用程序通常具有以下層:
- 用戶展現層
- 業務邏輯處理層
- 數據訪問讀取層
- MVC 設計模式通常用於實現應用程序的用戶界面層。
MVC 如何工作
讓我們了解 MVC 設計模式是如何與案例一起工作的。 假設我們想要查詢特定學生的詳細信息(即 ID 為 1 的學生信息),並在 HTML 表格中的網頁上顯示這些詳細信息,如下所示。
那么,從 Web 瀏覽器我們發出請求,URL 地址如下所示:
http://52abp.com/student/details/1
上圖的意思如下:
- 當我們的請求到達服務器時,作為 MVC 設計模式下的 Controller,會接收請求並且處理它。
- Controller 會創建模型(Model),該模型是一個類文件,會進行數據的展示。
- 在 Molde 中,除了數據本身,Model 還包含從底層數據源(如數據庫)查詢數據后的邏輯信息。
- 除了創建 Model 之外,控制器還選擇 View 並將 Model 對象傳遞給該 View。
- 視圖僅負責呈現 Modle 的數據。
- 視圖會生成所需的 HTML 以顯示模型數據,即 Controller 提供給它的學生數據。
- 然后,此 HTML 通過網絡發送,最終呈現在發出請求的用戶面前。
Model (模型)
因此,在當前案例中 Model,是由 Student 類和管理學生數據的 StudentRepository 類組成,如下所示。
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public string ClassName { get; set; }
}
public interface IStudentRepository
{
Student GetStudent(int id);
void Save(Student student);
}
public class StudentRepository : IStudentRepository
{
public Student GetStudent(int id)
{
//寫邏輯實現 查詢學生詳情信息
throw new NotImplementedException();
}
public void Save(Student student)
{
//寫邏輯實現保存學生信息
throw new NotImplementedException();
}
}
我們使用Student類來保存學生數據,而StudentRepository 類則負責查詢並保存學生信息到數據庫中。 如果要概括 model 的話,它就是 MVC 中用於包含一組數據的類和管理該數據的邏輯信息。 表示數據的類是 Student 類,管理數據的類是 StudentRepository 類。
如果您想知道我們為什么使用IStudentRepository
接口。 我們不能只使用沒有接口的StudentRepository類。
但是其實我們是可以的,但是我們使用接口的原因,是因為接口,允許我們使用依賴注入,而依賴注入則可以幫助我們創建低耦合且易於測試的系統。 我們將在即將發布的視頻中詳細討論依賴注入。
View -視圖
MVC 中的 View 應該只包含顯示 Controller 提供給它的 Model 數據的邏輯。您可以將視圖視為 HTML 模板。假設在我們的示例中,我們希望在 HTML 表中顯示Student數據。
這種情況下的視圖會和Student對象一起提供。 Student對象是將學生數據傳遞給視圖的模型。 視圖的唯一作用是將學生數據顯示在 HTML 表中。 這是視圖中的代碼。
@model StudentManagement.Model.Student
<!DOCTYPE html>
<html>
<head>
<title>學生頁面詳情</title>
</head>
<body>
<table>
<tr>
<td>Id</td>
<td>@model.Id</td>
</tr>
<tr>
<td>名字</td>
<td>@model.Name</td>
</tr>
<tr>
<td>班級</td>
<td>@model.ClassName</td>
</tr>
</table>
</body>
</html>
在 MVC 中,View 僅負責呈現模型數據。 視圖中不應該有復雜的邏輯。 視圖中的邏輯必須非常少而且要小,並且它也必須僅用於呈現數據。 如果到達表示邏輯過於復雜的點,請考慮使用ViewModel 或View Component。 View Components是此版本 MVC 中的新增功能。 我們可以在以后的課程中討論它。
Controller 控制器
當來自瀏覽器的請求到達我們的應用程序時,作為 MVC 中的控制器,它處理傳入的 http 請求並響應用戶的操作。
在這種情況下,用戶已向 URL 發出請求(/ student/ details/1),因此該請求被映射到StudentController中的Details方法,並向其傳遞Student的 ID,在本例中為 1. 此映射為 由我們的 web 應用程序中定義的路由規則完成。
我們將在即將發布的視頻中詳細討論 ASP.NET Core MVC 中的路由。
public class StudentController:Controller
{
private IStudentRepository _studentRepository;
public StudentController(IStudentRepository studentRepository)
{
_studentRepository = studentRepository;
}
public IActionResult Details(int id)
{
Student model = _studentRepository.GetStudent(id);
return View(model);
}
}
如您所見,從Details方法中的代碼,控制器將生成模型,在這種情況下,Model 是Student對象。 要從基礎數據(如數據庫)源檢索Student數據,控制器使用StudentRepository類。
一旦控制器使用所需數據構造了Student模型對象,它就會將該Student模型對象傳遞給視圖。 然后,視圖生成所需的 HTML,以顯示 Controller 提供給它的Student數據。 然后,此 HTML 通過網絡發送給發出請求的用戶。
如果這一點令人困惑,或者無法理解,請不要擔心,我們將通過為我們的應用程序,會在后面一步步的創建模型,視圖和控制器來實現這一目標,我們將在此過程中進行更加清晰和明確。
小結
MVC 是用於實現應用程序的用戶界面層的架構設計模式
- 模型(Model):包含一組數據的類和管理該數據的邏輯信息。
- View(視圖):包含顯示邏輯,用於顯示 Controller 提供給它的模型中數據。
- Controller(控制器):處理 Http 請求,調用模型,請選擇一個視圖來呈現該模型。
正如您所看到的,在 MVC 設計模式中,我們可以清楚地分離各個關注點,讓他們各司其職。 每個組件都有一個非常具體的任務要做。 在我們的下一個視頻中,我們將討論在我們的 asp.net core 應用程序中設置 MVC 中間件。
歡迎添加個人微信號:Like若所思。
歡迎關注我的公眾號,不僅為你推薦最新的博文,還有更多驚喜和資源在等着你!一起學習共同進步!