第一單元 Mvc概述

来源:https://www.cnblogs.com/xuyubing/archive/2023/12/05/17878379.html
-Advertisement-
Play Games

1. 什麼是Mvc 模型-視圖-控制器 (MVC) 體繫結構模式將應用程式分成 3 個主要組件組:視圖模型、視圖和控制器。 此模式有助於實現關註點分離。 使用此模式,用戶請求被路由到控制器,後者負責使用模型來執行用戶操作和/或檢索查詢結果。 控制器選擇要顯示給用戶的視圖,併為其提供所需的任何模型數據 ...


1. 什麼是Mvc

模型-視圖-控制器 (MVC) 體繫結構模式將應用程式分成 3 個主要組件組:視圖模型、視圖和控制器。 此模式有助於實現關註點分離。 使用此模式,用戶請求被路由到控制器,後者負責使用模型來執行用戶操作和/或檢索查詢結果。 控制器選擇要顯示給用戶的視圖,併為其提供所需的任何模型數據。

下圖顯示 3 個主要組件及其相互引用關係:

 

這種責任劃分有助於根據複雜性縮放應用程式,因為這更易於編碼、調試和測試包含單一作業的某個組成部分(模型、視圖或控制器)。 但這會加大更新、測試和調試代碼的難度,該代碼在這 3 個領域的兩個或多個領域間存在依賴關係。 例如,用戶界面邏輯的變更頻率往往高於業務邏輯。 如果將表示代碼和業務邏輯組合在單個對象中,則每次更改用戶界面時都必須修改包含業務邏輯的對象。 這常常會引發錯誤,並且需要在每次進行細微的用戶界面更改後重新測試業務邏輯。

視圖和控制器均依賴於模型。 但是,模型既不依賴於視圖,也不依賴於控制器。 這是分離的一個關鍵優勢。 這種分離允許模型獨立於可視化展示進行構建和測試。

 

模型責任

MVC 應用程式的模型 (M) 表示應用程式和任何應由其執行的業務邏輯或操作的狀態。 業務邏輯應與保持應用程式狀態的任何實現邏輯一起封裝在模型中。 強類型視圖通常使用 ViewModel 類型,旨在包含要在該視圖上顯示的數據。 控制器從模型創建並填充 ViewModel 實例。

視圖責任

視圖 (V) 負責通過用戶界面展示內容。 它們使用 Razor 視圖引擎 在 HTML 標記中嵌入 .NET 代碼。 視圖中應該有最小邏輯,並且其中的任何邏輯都必須與展示內容相關。 如果發現需要在視圖文件中執行大量邏輯以顯示覆雜模型中的數據,請考慮使用 View Component、ViewModel 或視圖模板來簡化視圖。

控制器職責

控制器 (C) 是處理用戶交互、使用模型並最終選擇要呈現的視圖的組件。 在 MVC 應用程式中,視圖僅顯示信息;控制器處理並響應用戶輸入和交互。 在 MVC 模式中,控制器是初始入口點,負責選擇要使用的模型類型和要呈現的視圖(因此得名 - 它控制應用如何響應給定請求)。

備註

控制器不應由於責任過多而變得過於複雜。 要阻止控制器邏輯變得過於複雜,請將業務邏輯推出控制器並推入域模型。

提示

如果發現控制器操作經常執行相同類型的操作,可將這些常見操作移入篩選器

2. ASP.NET Core MVC

ASP.NET Core MVC 框架是輕量級、開源、高度可測試的演示框架,並針對 ASP.NET Core 進行了優化。它摒棄了傳統的全家桶模式,採用了按需所取的方式給用戶提供服務。

ASP.NET Core MVC 提供一種基於模式的方式,用於生成可徹底分開管理事務的動態網站。 它提供對標記的完全控制,支持 TDD 友好開發並使用最新的 Web 標準。

1. 與Framework 下的 Asp.Net Mvc 的區別

詳細內容: ASP.NET MVC 和 ASP.NET Core 之間的體繫結構差異 | Microsoft Docs

差異Frameowrk MvcMvc Core
體繫結構 非跨平臺 跨平臺
啟動方式 ASP.NET 應用托管在 IIS 中,它們依賴於 IIS 來實例化某些對象,併在請求到達時調用某些方法。 ASP.NET Core 應用是獨立程式。 因此,它們通常包含一個 Program.cs 文件,該文件包含應用的入口點 .
托管差異 ASP.NET MVC 應用托管在 IIS 中,並可能依賴 IIS 配置來實現其行為。 這通常包括 IIS 模塊 使用了更輕量的kestrel 伺服器,它可支持跨平臺
靜態文件 由 IIS 托管靜態文件。支持將靜態文件與應在伺服器上保持私有的文件併排放置。(可使用內容分髮網絡CDN優化) 不能直接支持,必須配置靜態文件中間件。(wwwroot為固定文件夾)
註入差異 需要藉助第三方工具,如Autofac,Unity,Ninject... 內置於框架中,在應用啟動時,將調用 ConfigureServices,該調用負責註冊 DI 容器(服務集合/服務提供商)可在應用中創建和註入的所有類型
模塊和處理程式 HTTP 模塊和 HTTP 處理程式是 ASP.NET 體繫結構的必要部分。 處理請求時,每個請求都由多個 HTTP 模塊(例如身份驗證模塊和會話模塊)處理,然後由單個 HTTP 處理程式進行處理。 在處理程式處理請求後,請求通過 HTTP 模塊傳輸回去。(全家桶) ASP.NET Core 在每個應用的 Configure 方法中定義一個請求管道。 此請求管道定義了應用如何處理傳入的請求,其中管道中的每個方法都調用下一個方法,直到最終方法終止(按需所用)
配置差異 配置使用應用文件夾中內置的 .NET 配置文件web.config,ConfigurationManager靜態訪問 配置本身是可配置的。可根據需要註入IConfiguration訪問配置值

2. Mvc:約定大於配置

  1. 控制器類加Controller尾碼,而且都放在Web項目下的Controllers文件夾中,控制器類繼承Controller基類。

  2. 視圖文件必須放在名稱為Views/Pages 的文件夾下的名稱為控制器名稱的文件夾中。

  3. _ViewStart.cshtml 執行任何Action(控制器中以IActionResult為返回類型的方法叫Action方法)之前,都會先執行它.

  4. 以下劃線命名開頭的視圖一般作為佈局/ViewCompenent 視圖,放在shared文件夾下麵

  5. _ViewImport.cshtm 為全局視圖文件共公命名空間的引用

3. 快速入門

  1. 創建項目

 

剛新建好的空項目:

 

  1. 選中Controllers 文件夾,右鍵-->新建-->類/介面

     

  2. 控制器代碼

// Hello 表示控制器名稱,HelloController 是控制器類名(C)
public class HelloController:Controller
{
    // 創建視圖文件的方法(V)
    public IActionResult Index()
    {
        // 業務邏輯,模型操作(M)
        List<StudentViewModel> list = new List<StudentViewModel>()
        {
            new(1,"張三"), // C#9.0 以上創建對象語法
            new(2,"李四"),
            new (3,"王五")
        };

        return View(list);// 將模型數據傳遞給視圖
    }
}

public record StudentViewModel(int Id,string Name);

 

  1. 在Views/ 目錄下創建Hello目錄,在Hello目錄下創建Index.cshtml文件。

  2. 編寫任意html代碼

    @* 接收視圖模型傳遞過來的數據 *@
    @model List<WebApplication2.Controllers.StudentViewModel>
    
    @{
        Layout = null;
    }
    
    <!DOCTYPE html>
    
    <html>
    <head>
        <title>Mvc 快速入門</title>
    </head>
    <body>
    <div>
          <h1>大家好,歡迎來到任我行碼農場,Asp.net Mvc</h1>
    </div>
    </body>
    </html>

     

     

3. Mvc 項目結構

 

  • Dependencies:項目所依賴的組件

  • launchSettings.json : 項目發佈設置文件

    {
      "iisSettings": {// iis 設置
        "windowsAuthentication": false,
        "anonymousAuthentication": true,
        "iisExpress": {
          "applicationUrl": "http://localhost:21843",
          "sslPort": 44331
        }
      },
      "profiles": {
        "WebApplication2": {
          "commandName": "Project",
          "dotnetRunMessages": true,
          "launchBrowser": true,// 使用瀏覽器
          "applicationUrl": "http://localhost:5096",// 項目運行地址
          "environmentVariables": { // 當前環境
            "ASPNETCORE_ENVIRONMENT": "Development" // 表示當前環境為Development
          }
        },
        "IIS Express": { // 內置IIS 的設置
          "commandName": "IISExpress",
          "launchBrowser": true,
          "environmentVariables": {
            "ASPNETCORE_ENVIRONMENT": "Development"
          }
        }
      }
    }

     

  • Controllers: 存放所有的控制器

  • Models: 存放所有的ViewModel 文件

  • Views: 存放所有的視圖文件

  • Views/Shared : 存放公共的視圖文件

  • Views/Shared/_Layout.cshtml : 公共佈局文件

  • Views/Shared/Error.cshtml: 錯誤提示視圖

  • Views/_ViewImports.cshtml: 公共導入命名空間,引用公共的標簽助手

    @using WebApplication2
    @using WebApplication2.Models
    @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
    Views/_ViewStart.cshtml: 視圖起始文件,所有視圖在載入時,都會先載入此視圖文件
    
    wwwroot: 存放所有的靜態資源文件(css/js/html)
    
    wwwroot/favicon.ico : 應用程式的圖標
    
    appsetting.json: 當前應用程式的配置文件
    
    appsetting.Development.json: 當前環境的配置文件,如果在此文件中未找到想要的配置,則會去appsetting.json 文件中去尋找。
    
    Program:程式的主入口,用於初始化系統的相關配置,註冊服務,配置中間件與註冊管道。
    
     
    
    4. 控制器動作
    控制器動作(具體的action)返回的結果叫做控制器動作結果,動作結果是控制器返回給瀏覽器請求的內容。ASP.NET Core MVC 框架支持幾十種標準類型的動作結果,以下是常見的類型
    
    動作名稱    簡要概述
    ViewResult    返回視圖
    RedirectToActionResult    重定向到某個Action方法
    JsonResult    Json結果,可以用於Ajax應用程式
    ContentResult    文本結果
    RedirectResult    重定向到一個新的URL
    FileResult    返回一個文件,一般用於下載
    它們 都實現了IActionResult 介面。
    
    public ViewResult Index()
    {
        List<StudentViewModel> list = new List<StudentViewModel>()
        {
            new(1,"張三"), 
            new(2,"李四"),
            new (3,"王五")
        };
        
        return View(list);
    }
    
    public JsonResult Index2()
    {
        List<StudentViewModel> list = new List<StudentViewModel>()
        {
            new(1,"張三"), 
            new(2,"李四"),
            new (3,"王五")
        };
        return Json(list);
    }
    
    public ContentResult Index3()
    {
        return Content("hello,任我行碼農場");
    }
    
    
    public RedirectToActionResult Index4()
    {
        return RedirectToAction("Index2", "Hello");
    }
    
    public FileResult Download()
    {
        using MemoryStream ms = new MemoryStream();
        var buffer = Encoding.UTF8.GetBytes("文件下載");
        ms.Write(buffer);
        return File(ms.ToArray(), "application/octet-stream", "測試文件.txt");
    }

     

Action方法與普通方法的區別

Action方法是由Mvc 框架管理,Mvc 框架可以對Action方法進行處理與渲染(例如渲染視圖,攔截請求等等),而普通則不受mvc 控制。

舉個例子,ContentResult 通常的作用也是直接返回一個字元串,當我們執行Content("hello,任我行碼農場") 時,我們只是告訴Mvc框架,我們需要返回 “hello,任我行碼農場”,而並非立即返回,Mvc 框架在此之後可能還會做很多的處理,或許在中間的某個環節,有可能請求被攔截,導致我們可能得到不同的結果(日後要講的AOPA思想)。而return "hello,任我行碼農場" 則是立即返回。

 

 

5. Razor視圖

註釋

@* *@ 

 

 

輸出純文本:

@:這裡是妹子可以看的內容

 

 

編寫C#代碼

<html>
<head>
    <title>Mvc 快速入門</title>
</head>
<body>
<div>
    <h1>大家好,歡迎來到任我行碼農場,Asp.net Mvc</h1>
    
    @{
        int a = 1;
        int b = 2;
        Console.WriteLine(a+b);
    }
</div>
</body>
</html>

 

 

if else

<html>
<head>
    <title>Mvc 快速入門</title>
</head>
<body>
<div>
    <h1>大家好,歡迎來到任我行碼農場,Asp.net Mvc</h1>
    
    @if (true)
    {
        <h1>hello</h1>
    }
    else
    {
        <p>world</p>
    }
</div>
</body>
</html>

 

視圖傳值

1. TempData

public IActionResult Index()
{
    TempData["username"] = "任我行";
    return View();
}
<body>
<div>
    <h1>我的名稱:@TempData["username"]</h1>
</div>
</body>

 

TempData 保存在Session中,Controller每次執行請求的時候,會從Session中先獲取 TempData,而後清除Session,獲取完TempData數據,雖然保存在內部字典對象中,但是其集合中的每個條目訪問一次後就從字典表中刪 除。具體代碼層面,TempData獲取過程是通過SessionStateTempDataProvider.LoadTempData方法從 ControllerContext的Session中讀取數據,而後清除Session,故TempData只能跨Controller傳遞一次。

 

2.ViewBag 與 ViewData

ViewData:

ViewData 只在當前 Action 中有效,生命周期和 View 相同;

public IActionResult Index()
{
    ViewData["username"] = "任我行";

    return View();
}
<body>
<div>
    <h1>我的名稱:@ViewData["username"]</h1>
</div>
</body>

 

ViewBag

ViewBag其實本質就是ViewData,只是多了層Dynamic控制。所以,使用何種方式完全取決於你的個人愛好。

public IActionResult Index()
{
    ViewBag.UserName = "任我行";

    return View();
}
<body>
<div>
    <h1>我的名稱:@ViewBag.UserName</h1>
</div>
</body>

 

兩者區別如下:

ViewDataViewBag
它是key/value字典集合 它是dynamic類型對象
從asp.net mvc1就有了 從asp.netmvc3才有
基於asp.netframework 3.5 基於asp.net framework4.0
viewdata比viewbag快 viewbag比viewdata慢
頁面查詢數據時需要轉換合適的類型 在頁面查詢數據時不需要轉換合適的類型
有一些類型轉換代碼 可讀性較好

總結

1、ViewData和TempData是字典類型,賦值方式用字典方式,ViewData["myName"]

2、ViewBag是動態類型,使用時直接添加屬性賦值即可 ViewBag.myName

3、ViewBag和ViewData只在當前Action中有效,等同於View

4、TempData可以通過轉向繼續使用(Server.Tranfer()),因為它的值保存在Session中。但TempData只能經過一次傳遞,之後會被系統自動清除(Framework)

5、ViewData和ViewBag中的值可以互相訪問,因為ViewBag的實現中包含了ViewData

  配套視頻鏈接:什麼是Mvc (cctalk.com)

 

海闊平魚躍,天高任我行,給我一片藍天,讓我自由翱翔。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Quartz是一個作業調度框架,它可以與J2EE和J2SE應用相結合,也可以單獨使用。它能夠創建多個甚至數萬個jobs這樣複雜的程式,jobs可以做成標準的java組件或EJBS。Quartz很容易上手,創建一個任務僅需實現Job介面,該介面只有一個方法void execute(JobExecuti... ...
  • SSM框架中各層次作用及其關係(一) 平常學習生活中看見許多框架中的層次,都會有點懵,不知其意,抑或是看了又忘,所以這就是這篇短文的目的 總體辨析 JAVASSM(Java Web Application with Spring, Spring MVC, and MyBatis)是一種基於Java技 ...
  • 9 Docker 在 Docker 鏡像層內預覽文件 現在可以在 Services(服務)工具視窗中輕鬆訪問和預覽 Docker 鏡像層的內容。 從列表選擇鏡像,選擇 Show layers(顯示層),然後點擊 Analyze image for more information(分析鏡像以獲得更多 ...
  • 原文: https://openaigptguide.com/chatgpt-similar%20software/ ChatGPT是一款由美國OpenAI公司開發的人工智慧語言模型,類似的軟體有: 火山寫作(Volcano Writing):它是一款用戶友好的寫作軟體,可以自動生成具有創造性和連貫 ...
  • 前言 我python開發的GUI界面(圖形用戶界面)一直是tkinter,打包exe一直是Pyinstaller。但是打包出來的exe圖標、狀態欄圖標、窗體左上角圖標一直是預設的羽毛,我想自定義。 效果 最後使用base64創建臨時ico解決了該問題 步驟 創建icoToBase64.py,內容如下 ...
  • 在Java 21中,除了推出很多新特性之外,一些Bug修複,也需要註意一下。因為這些改變可能在升級的時候,造成影響。 Double.toString()和Float.toString()的精度問題修複 比如:對於Double.String(1e23): 在Java 19後,輸出內容為:1.0E23 ...
  • webjars類型的前端jar包 我們可以將公用的js,css,html,vue,shtml打包成一個jar,然後在其他項目中引用,這樣就不用每個項目都去引用一遍了,這樣就可以實現前端的公用了。 1.創建一個maven項目,添加依賴和插件 <dependencies> <!-- 依賴webjars- ...
  • pdf轉docx文檔是一個非常實用的功能,我只是簡單地實現了一個可視化界面供用戶操作。我這麼做的目的之一是想更多地掌握gradio的使用方法,同時也加強對Python流行第三方包的熟悉程度,因為這些第三方包是快速開發的關鍵。我也希望你能從中有所收穫,我已經公佈了本期的源碼地址,如果你覺得還不錯,或者... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...