隨著技術的發展,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/
本文版權歸作者和博客園共有,寫文不易,支持原創,歡迎轉載【點贊】,轉載請保留此段聲明,且在文章頁面明顯位置給出原文連接,謝謝。
關註個人公眾號,定時同步更新技術及職場文章