ASP.NET Core MVC 從入門到精通之接化發(一)

来源:https://www.cnblogs.com/hsiang/archive/2023/04/09/17297783.html
-Advertisement-
Play Games

隨著技術的發展,ASP.NET Core MVC也推出了好長時間,經過不斷的版本更新迭代,已經越來越完善,本系列文章主要講解ASP.NET Core MVC開發B/S系統過程中所涉及到的相關內容,適用於初學者,在校畢業生,或其他想從事ASP.NET Core MVC 系統開發的人員。 ...


隨著技術的發展,ASP.NET Core MVC也推出了好長時間,經過不斷的版本更新迭代,已經越來越完善,本系列文章主要講解ASP.NET Core MVC開發B/S系統過程中所涉及到的相關內容,適用於初學者,在校畢業生,或其他想從事ASP.NET Core MVC 系統開發的人員。

 

經過前一篇文章的講解,初步瞭解ASP.NET Core MVC項目創建,啟動運行,以及ASP.NET Core MVC的命名約定,創建控制器,視圖等內容,今天繼續講解ASP.NET Core MVC 參數接收,傳遞等相關內容,僅供學習分享使用。

Model模型

在ASP.NET Core MVC項目中,模型是描述用戶界面上需要渲染的數據,或是這些數據的一部分。這裡要區分實體和模型的概念,Entity-實體,是業務邏輯中使用的數據結構,一般與資料庫中對應的表一致;模型是經過轉化處理的頁面可接收的數據。比如:資料庫中的ID等敏感信息,bool類型,日期類型的轉換等,均不適宜直接綁定Entity實體到頁面,需要轉換成模型進行展示。

創建模型

在ASP.NET Core MVC項目中,模型就是一個普通的類。在Models文件夾上,右鍵點擊【添加】【類(C)...】,打開添加類對話框,如下所示:

 

 在添加類對話框,輸入名稱Student,點擊確定,如下所示:

 

 註意:在ASP.NET Core MVC項目中,模型名稱沒有約定,符合類命名規範即可。除了標識符必須以字母或下劃線 (_) 開頭。建議命名遵循以下規則:

  • 【規則1-1】使用Pascal規則命名類名,即首字母要大寫。
  • 【規則1-2】使用能夠反映類功能的名詞或名詞短語命名類。
  • 【規則1-3】不要使用“I”、“C”、“_”等特定含義首碼。
  • 【規則1-4】自定義異常類應以Exception結尾。
  • 【規則1-5】文件名要能反映類的內容,最好是和類同名。

在模型Student創建成功後,添加相關屬性,如下所示:

 1 namespace DemoCoreMVC.Models
 2 {
 3     /// <summary>
 4     /// 學生模型
 5     /// </summary>
 6     public class Student
 7     {
 8         /// <summary>
 9         /// 唯一標識
10         /// </summary>
11         public int Id { get; set; }
12 
13         /// <summary>
14         /// 學生名稱
15         /// </summary>
16         public string Name { get; set; }
17 
18         /// <summary>
19         /// 學生年齡
20         /// </summary>
21         public int Age { get; set; }
22 
23         /// <summary>
24         /// 學生性別
25         /// </summary>
26         public string Sex { get; set; }
27     }
28 }

視圖綁定模型

首先創建一個空視圖模型【也可以創建強類型模型視圖】,通過@model  DemoCoreMVC.Models.Student為視圖指定模型。然後即可使用模型進行數據綁定,如下所示:

 1 @model  DemoCoreMVC.Models.Student
 2 @{
 3     
 4 }
 5 <h1>歡迎公子小六</h1>
 6 <div>
 7     <span>學號:</span>
 8     <span>@Model.Id</span>
 9 </div>
10 <div>
11     <span>姓名:</span>
12     <span>@Model.Name</span>
13 </div>
14 <div>
15     <span>年齡:</span>
16     <span>@Model.Age</span>
17 </div>
18 <div>
19     <span>性別:</span>
20     <span>@Model.Sex</span>
21 </div>

控制器傳遞模型

在控制器中 初始化模型數據,然後通過View(model)方法將創建的模型數據傳遞給視圖,如下所示:

 1 using DemoCoreMVC.Models;
 2 using Microsoft.AspNetCore.Mvc;
 3 
 4 namespace DemoCoreMVC.Controllers
 5 {
 6     public class HelloController : Controller
 7     {
 8         public IActionResult Index()
 9         {
10             var student = new Student()
11             {
12                 Id = 1,
13                 Name = "公子小六",
14                 Age = 21,
15                 Sex = ""
16             };
17             
18             return View(student);
19         }
20 
21         public string Welcome()
22         {
23             return "歡迎公子小六...";
24         }
25     }
26 }

運行測試

在Visual Studio 2022中運行程式,在瀏覽器輸入https://localhost:7116/Hello,如下所示:

 

 經過以上步驟,就完成了一個模型數據的流轉。

接收URL參數

通過URL傳參是HTTP最最常用的辦法。這裡簡單介紹下URL相關的知識。一個URL主要分成4個部分,以https://localhost:7116/Hello/Show?name=公子小六&age=10為例:

 

在ASP.NET Core項目中,瀏覽器端通過URL往伺服器端傳遞參數,可以通過以下幾種方式獲取:

1. 參數名稱自動匹配法

在ASP.NET Core MVC項目中,如果Action的型參的名稱跟QueryString的Key一致,則MVC框架會自動幫我們綁定參數的值,不用手動獲取。可以根據參數的名稱和自動匹配參數值,如下所示:

 1 /// <summary>
 2 /// 自動匹配參數名稱
 3 /// </summary>
 4 /// <param name="id"></param>
 5 /// <param name="name"></param>
 6 /// <param name="age"></param>
 7 /// <param name="sex"></param>
 8 /// <returns></returns>
 9 public IActionResult ShowStudent(int id, string name, int age, string sex)
10 {
11     var student = new Student()
12     {
13         Id = id,
14         Name = name,
15         Age = age,
16         Sex = sex
17     };
18     return Json(student);
19 }

在瀏覽器中,通過請求URL中帶參數【https://localhost:7116/Hello/ShowStudent?id=23&name=公子小六&age=25&sex=男】多個參數用&符號隔開。如下所示:

 

 

註意:如果在瀏覽器中,中文被重新編碼成如下格式:

 

 則可以通過在Porgram.cs中註入MVC服務時修改返回JSON編碼的方式來修正,如下所示:

1 // Add services to the container.
2 builder.Services.AddControllersWithViews().AddJsonOptions(options =>
3 {
4     options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);
5 });

註意:如果參數綁定的名稱跟QueryString的Key不一致,可以使用FromQueryAttribute強制指定綁定的Key的名稱。

2. Request.Query獲取參數

在Http請求中,可以通過Request.Query["參數名稱"]的方式獲取參數,如下所示:

 1 /// <summary>
 2 /// 請求參數:Request.Query
 3 /// </summary>
 4 /// <returns></returns>
 5 public IActionResult ShowStudent2()
 6 {
 7     var id = Request.Query["id"];
 8     var name = Request.Query["name"];
 9     var age = Request.Query["age"];
10     var sex = Request.Query["sex"];
11     var student = new Student()
12     {
13         Id = string.IsNullOrEmpty(id) ? 0 : int.Parse(id),
14         Name = name,
15         Age = string.IsNullOrEmpty(age) ? 0 : int.Parse(age),
16         Sex = sex
17     };
18     return Json(student);
19 }

運行程式,在瀏覽器輸入網址【https://localhost:7116/Hello/ShowStudent2?id=23&name=公子小六&age=25&sex=男】

 

3. 通過路由獲取

在ASP.NET Core MVC項目中,同樣可以通過路由匹配的方式獲取參數,如下所示:

 1 /// <summary>
 2 /// 通過Route匹配參數
 3 /// </summary>
 4 /// <param name="id"></param>
 5 /// <param name="name"></param>
 6 /// <param name="age"></param>
 7 /// <param name="sex"></param>
 8 /// <returns></returns>
 9 [Route("Hello/ShowStudent3/{id}/{name}/{age}/{sex}")]
10 public IActionResult ShowStudent3(int id, string name, int age, string sex)
11 {
12     var student = new Student()
13     {
14         Id = id,
15         Name = name,
16         Age = age,
17         Sex = sex
18     };
19     return Json(student);
20 }

運行程式,在瀏覽器中輸入【https://localhost:7116/Hello/ShowStudent3/23/公子小六/25/男】,測試效果如下所示:

 

 註意:如果Action的型參名稱跟RouteAttribute模板的中的名稱不一樣,那麼可以使用FromRoute強制指定解析的名稱。

接收Body參數

我們開發的時候經常通過表單提交數據,或者通過AJAX往後臺提交一個JavaScript對象,本質上這些數據都是通過HTTP的Bady提交回去的。在ASP.NET Core MVC項目中,Request.Body是一個Stream對象,通過獲取流對象中的內容,然後進行轉化,就可以獲取參數,如下所示:

 1 [HttpPost]
 2 public IActionResult TestBody()
 3 {
 4     Request.EnableBuffering();
 5     var body = "";
 6     var stream = Request.Body;
 7     if (stream != null)
 8     {
 9         stream.Seek(0, SeekOrigin.Begin);
10         using (var reader = new StreamReader(stream, Encoding.UTF8, true, 1024, true))
11         {
12             body = reader.ReadToEnd();
13         }
14         stream.Seek(0, SeekOrigin.Begin);
15     }
16 
17     var student = JsonConvert.DeserializeObject<Student>(body);
18     return Json(student);
19 }

通過Body獲取,然後JsonConvert進行反序列化,前提是Body內容是JSON格式,否則不能進行反序列化。通過Postman測試如下所示:

 

 以上Body接收參數,主要應用於介面調用,Ajax方式請求等方式。

通過Form表單傳遞參數

在ASP.NET Core MVC項目中,最常用的是Form表單傳遞參數,客戶端將所有需要傳遞的內容包括在Form表單內容,在伺服器端Action中通過Request.Form["Key"]進行獲取。如下所示:

Add.cshtml視圖中Form表單內容,如下所示:

 1 <form action="~/Hello/Save" method="post">
 2     <div style="margin:10px;">
 3         <span>學號:</span>
 4         <input type="text" name="Id" />
 5     </div>
 6     <div style="margin:10px;">
 7         <span>姓名:</span>
 8         <input type="text" name="Name" />
 9     </div style="margin:10px;">
10     <div style="margin:10px;">
11         <span>年齡:</span>
12         <input type="text" name="Age" />
13     </div>
14     <div style="margin:10px;">
15         <span>性別:</span>
16         <input type="text" name="Sex" />
17     </div>
18     <div style="margin:10px;">
19         <input type="submit" name="submit" value="保存" />
20     </div>
21 </form>

HelloController中Save方法,如下所示:

 1 [HttpPost]
 2 public IActionResult Save()
 3 {
 4 
 5     var id = Request.Form["Id"];
 6     var name = Request.Form["Name"];
 7     var age = Request.Form["Age"];
 8     var sex = Request.Form["Sex"];
 9     var student = new Student()
10     {
11         Id = string.IsNullOrEmpty(id) ? 0 : int.Parse(id),
12         Name = name,
13         Age = string.IsNullOrEmpty(age) ? 0 : int.Parse(age),
14         Sex = sex
15     };
16     return Json(student);
17 }

運行測試,在瀏覽器中輸入網址【https://localhost:7116/Hello/add】進行測試,如下所示:

通過模型接收參數

在更多的時候,為了簡便,我們通常採用模型來接收參數,如果模型的屬性名和參數的Key一致,則可以自動匹配,非常方便,如下所示:

 1 /// <summary>
 2 /// 通過模型接收參數
 3 /// </summary>
 4 /// <param name="student"></param>
 5 /// <returns></returns>
 6 public IActionResult ShowStudent4(Student student)
 7 {
 8     return Json(student);
 9 }
10 
11 
12 [HttpPost]
13 public IActionResult Save2(Student student)
14 {
15     return Json(student);
16 }

註意:無論是Get方式,還是Post方式,均可以採用Model模型接收參數,效果和上面一致,此處不再演示。

以上就是ASP.NET Core MVC從入門到精通之接化發第一部分內容,進行會進一步講解接化發第二部分內容。旨在拋磚引玉,溫故而知新,一起學習,共同進步。


作者:小六公子
出處:http://www.cnblogs.com/hsiang/
本文版權歸作者和博客園共有,寫文不易,支持原創,歡迎轉載【點贊】,轉載請保留此段聲明,且在文章頁面明顯位置給出原文連接,謝謝。
關註個人公眾號,定時同步更新技術及職場文章


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、簡介 本文博主給大家講解如何在自己開源的電商項目newbee-mall-pro中應用協同過濾演算法來達到給用戶更好的購物體驗效果。 newbee-mall-pro項目地址: 源碼地址:https://github.com/wayn111/newbee-mall-pro 線上地址:http://12 ...
  • 原文鏈接: Go 語言切片是如何擴容的? 在 Go 語言中,有一個很常用的數據結構,那就是切片(Slice)。 切片是一個擁有相同類型元素的可變長度的序列,它是基於數組類型做的一層封裝。它非常靈活,支持自動擴容。 切片是一種引用類型,它有三個屬性:指針,長度和容量。 底層源碼定義如下: type s ...
  • 本文針對Golang與Java的基礎語法、結構體函數、異常處理、併發編程及垃圾回收、資源消耗等各方面的差異進行對比總結,有不准確、不到位的地方還請大家不吝賜教。 ...
  • 左值與右值 C++中左值與右值的概念是從C中繼承而來,一種簡單的定義是左值能夠出現再表達式的左邊或者右邊,而右值只能出現在表達式的右邊。 int a = 5; // a是左值,5是右值 int b = a; // b是左值,a也是左值 int c = a + b; // c是左值,a + b是右值 ...
  • 數值型數組特征值統計 這裡特征值涉及到:平均值,最大值,最小值,總和等 求最大值:將數組第一個元素假設為最大值 int max= arr[0];再然後用寫一個判斷語句如果數組第一個 元素小於當前比較的元素就把當前比較的元素賦值給max if(max<arr[i]){max = arr[i]} 求最小 ...
  • 快速冪演算法 設計一個演算法計算$x^n$的值。 根據定義最常見也最能瞬間想到的是如下的演算法: // 遞歸寫法 public int pow1(int x, int n) { if (n == 0) return 1; if (n == 1) return x; return x * pow1(x, n ...
  • 第一步,添加Nuget包引用 需要添加兩個Nuget包分別是:Microsoft.AspNetCore.MiddlewareAnalysis和Microsoft.Extensions.DiagnosticAdapter,前者是分析記錄中間件核心代碼實現後者是用來接收日誌輸出的,由於是用的Diagno ...
  • .NET中的多線程-並行編程 在.NET框架中,多線程編程可以提高程式的性能和併發能力。.NET框架提供了一系列的類和API,用於簡化多線程編程。本文將介紹.NET中的多線程-並行編程,並給出一些示例代碼。 什麼是多線程? 多線程是指一個進程中有多個線程同時執行。每個線程都是獨立的執行路徑,可以同時 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...