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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...