第一單元 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
  • 1、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...