隨著技術的發(fā)展,ASP.NET Core MVC也推出了好長時間,經過不斷的版本更新迭代,已經越來越完善,本系列文章主要講解ASP.NET Core MVC開發(fā)B/S系統(tǒng)過程中所涉及到的相關內容,適用于初學者,在校畢業(yè)生,或其他想從事ASP.NET Core MVC 系統(tǒng)開發(fā)的人員。
經過前一篇文章的講解,初步了解ASP.NET Core MVC項目創(chuàng)建,啟動運行,以及ASP.NET Core MVC的命名約定,創(chuàng)建控制器,視圖等內容,今天繼續(xù)講解ASP.NET Core MVC 參數(shù)接收,傳遞等相關內容,僅供學習分享使用。
在ASP.NET Core MVC項目中,模型是描述用戶界面上需要渲染的數(shù)據(jù),或是這些數(shù)據(jù)的一部分。這里要區(qū)分實體和模型的概念,Entity-實體,是業(yè)務邏輯中使用的數(shù)據(jù)結構,一般與數(shù)據(jù)庫中對應的表一致;模型是經過轉化處理的頁面可接收的數(shù)據(jù)。比如:數(shù)據(jù)庫中的ID等敏感信息,bool類型,日期類型的轉換等,均不適宜直接綁定Entity實體到頁面,需要轉換成模型進行展示。
在ASP.NET Core MVC項目中,模型就是一個普通的類。在Models文件夾上,右鍵點擊【添加】【類(C)...】,打開添加類對話框,如下所示:
在添加類對話框,輸入名稱Student,點擊確定,如下所示:
注意:在ASP.NET Core MVC項目中,模型名稱沒有約定,符合類命名規(guī)范即可。除了標識符必須以字母或下劃線 (_
) 開頭。建議命名遵循以下規(guī)則:
【規(guī)則1-1】使用Pascal規(guī)則命名類名,即首字母要大寫。
【規(guī)則1-2】使用能夠反映類功能的名詞或名詞短語命名類。
【規(guī)則1-3】不要使用“I”、“C”、“_”等特定含義前綴。
【規(guī)則1-4】自定義異常類應以Exception結尾。
【規(guī)則1-5】文件名要能反映類的內容,最好是和類同名。
在模型Student創(chuàng)建成功后,添加相關屬性,如下所示:
namespace DemoCoreMVC.Models
{
/// <summary>
/// 學生模型
/// </summary>
public class Student
{
/// <summary>
/// 唯一標識
/// </summary>
public int Id { get; set; }
/// <summary>
/// 學生名稱
/// </summary>
public string Name { get; set; }
/// <summary>
/// 學生年齡
/// </summary>
public int Age { get; set; }
/// <summary>
/// 學生性別
/// </summary>
public string Sex { get; set; }
}
}
首先創(chuàng)建一個空視圖模型【也可以創(chuàng)建強類型模型視圖】,通過@model DemoCoreMVC.Models.Student為視圖指定模型。然后即可使用模型進行數(shù)據(jù)綁定,如下所示:
@model DemoCoreMVC.Models.Student
@{
}
<h1>歡迎公子小六</h1>
<div>
<span>學號:</span>
<span>@Model.Id</span>
</div>
<div>
<span>姓名:</span>
<span>@Model.Name</span>
</div>
<div>
<span>年齡:</span>
<span>@Model.Age</span>
</div>
<div>
<span>性別:</span>
<span>@Model.Sex</span>
</div>
在控制器中 初始化模型數(shù)據(jù),然后通過View(model)方法將創(chuàng)建的模型數(shù)據(jù)傳遞給視圖,如下所示:
using DemoCoreMVC.Models;
using Microsoft.AspNetCore.Mvc;
namespace DemoCoreMVC.Controllers
{
public class HelloController : Controller
{
public IActionResult Index()
{
var student = new Student()
{
Id = 1,
Name = "公子小六",
Age = 21,
Sex = "男"
};
return View(student);
}
public string Welcome()
{
return "歡迎公子小六...";
}
}
}
在Visual Studio 2022中運行程序,在瀏覽器輸入https://localhost:7116/Hello,如下所示:
經過以上步驟,就完成了一個模型數(shù)據(jù)的流轉。
通過URL傳參是HTTP最最常用的辦法。這里簡單介紹下URL相關的知識。一個URL主要分成4個部分,以https://localhost:7116/Hello/Show?name=公子小六&age=10為例:
https:// | 協(xié)議 |
localhost:7116 | 主機地址 |
/hello/show | PATH |
name=公子小六&age=10 | QueryString |
在ASP.NET Core項目中,瀏覽器端通過URL往服務器端傳遞參數(shù),可以通過以下幾種方式獲?。?/span>
1. 參數(shù)名稱自動匹配法
在ASP.NET Core MVC項目中,如果Action的型參的名稱跟QueryString的Key一致,則MVC框架會自動幫我們綁定參數(shù)的值,不用手動獲取。可以根據(jù)參數(shù)的名稱和自動匹配參數(shù)值,如下所示:
/// <summary>
/// 自動匹配參數(shù)名稱
/// </summary>
/// <param name="id"></param>
/// <param name="name"></param>
/// <param name="age"></param>
/// <param name="sex"></param>
/// <returns></returns>
public IActionResult ShowStudent(int id, string name, int age, string sex)
{
var student = new Student()
{
Id = id,
Name = name,
Age = age,
Sex = sex
};
return Json(student);
}
在瀏覽器中,通過請求URL中帶參數(shù)【https://localhost:7116/Hello/ShowStudent?id=23&name=公子小六&age=25&sex=男】多個參數(shù)用&符號隔開。如下所示:
注意:如果在瀏覽器中,中文被重新編碼成如下格式:
則可以通過在Porgram.cs中注入MVC服務時修改返回JSON編碼的方式來修正,如下所示:
// Add services to the container.
builder.Services.AddControllersWithViews().AddJsonOptions(options =>
{
options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);
});
注意:如果參數(shù)綁定的名稱跟QueryString的Key不一致,可以使用FromQueryAttribute強制指定綁定的Key的名稱。
2. Request.Query獲取參數(shù)
在Http請求中,可以通過Request.Query["參數(shù)名稱"]的方式獲取參數(shù),如下所示:
/// <summary>
/// 請求參數(shù):Request.Query
/// </summary>
/// <returns></returns>
public IActionResult ShowStudent2()
{
var id = Request.Query["id"];
var name = Request.Query["name"];
var age = Request.Query["age"];
var sex = Request.Query["sex"];
var student = new Student()
{
Id = string.IsNullOrEmpty(id) ? 0 : int.Parse(id),
Name = name,
Age = string.IsNullOrEmpty(age) ? 0 : int.Parse(age),
Sex = sex
};
return Json(student);
}
運行程序,在瀏覽器輸入網址【https://localhost:7116/Hello/ShowStudent2?id=23&name=公子小六&age=25&sex=男】
3. 通過路由獲取參數(shù)
在ASP.NET Core MVC項目中,同樣可以通過路由匹配的方式獲取參數(shù),如下所示:
/// <summary>
/// 通過Route匹配參數(shù)
/// </summary>
/// <param name="id"></param>
/// <param name="name"></param>
/// <param name="age"></param>
/// <param name="sex"></param>
/// <returns></returns>
[Route("Hello/ShowStudent3/{id}/{name}/{age}/{sex}")]
public IActionResult ShowStudent3(int id, string name, int age, string sex)
{
var student = new Student()
{
Id = id,
Name = name,
Age = age,
Sex = sex
};
return Json(student);
}
運行程序,在瀏覽器中輸入【https://localhost:7116/Hello/ShowStudent3/23/公子小六/25/男】,測試效果如下所示:
注意:如果Action的型參名稱跟RouteAttribute模板的中的名稱不一樣,那么可以使用FromRoute強制指定解析的名稱。
在ASP.NET Core MVC項目中,Request.Body是一個Stream對象,通過獲取流對象中的內容,然后進行轉化,就可以獲取參數(shù),如下所示:
[HttpPost]
public IActionResult TestBody()
{
Request.EnableBuffering();
var body = "";
var stream = Request.Body;
if (stream != null)
{
stream.Seek(0, SeekOrigin.Begin);
using (var reader = new StreamReader(stream, Encoding.UTF8, true, 1024, true))
{
body = reader.ReadToEnd();
}
stream.Seek(0, SeekOrigin.Begin);
}
var student = JsonConvert.DeserializeObject<Student>(body);
return Json(student);
}
通過Body獲取,然后JsonConvert進行反序列化,前提是Body內容是JSON格式,否則不能進行反序列化。通過Postman測試如下所示:
以上Body接收參數(shù),主要應用于接口調用,Ajax方式請求等方式。
在ASP.NET Core MVC項目中,最常用的是Form表單傳遞參數(shù),客戶端將所有需要傳遞的內容包括在Form表單內容,在服務器端Action中通過Request.Form["Key"]進行獲取。如下所示:
Add.cshtml視圖中Form表單內容,如下所示:
<form action="~/Hello/Save" method="post">
<div style="margin:10px;">
<span>學號:</span>
<input type="text" name="Id" />
</div>
<div style="margin:10px;">
<span>姓名:</span>
<input type="text" name="Name" />
</div style="margin:10px;">
<div style="margin:10px;">
<span>年齡:</span>
<input type="text" name="Age" />
</div>
<div style="margin:10px;">
<span>性別:</span>
<input type="text" name="Sex" />
</div>
<div style="margin:10px;">
<input type="submit" name="submit" value="保存" />
</div>
</form>
HelloController中Save方法,如下所示:
[HttpPost]
public IActionResult Save()
{
var id = Request.Form["Id"];
var name = Request.Form["Name"];
var age = Request.Form["Age"];
var sex = Request.Form["Sex"];
var student = new Student()
{
Id = string.IsNullOrEmpty(id) ? 0 : int.Parse(id),
Name = name,
Age = string.IsNullOrEmpty(age) ? 0 : int.Parse(age),
Sex = sex
};
return Json(student);
}
運行測試,在瀏覽器中輸入網址【https://localhost:7116/Hello/add】進行測試,如下所示:
在更多的時候,為了簡便,我們通常采用模型來接收參數(shù),如果模型的屬性名和參數(shù)的Key一致,則可以自動匹配,非常方便,如下所示:
/// <summary>
/// 通過模型接收參數(shù)
/// </summary>
/// <param name="student"></param>
/// <returns></returns>
public IActionResult ShowStudent4(Student student)
{
return Json(student);
}
[HttpPost]
public IActionResult Save2(Student student)
{
return Json(student);
}
注意:無論是Get方式,還是Post方式,均可以采用Model模型接收參數(shù),效果和上面一致,此處不再演示。
以上就是ASP.NET Core MVC從入門到精通之接化發(fā)第一部分內容,后續(xù)會進一步講解接化發(fā)第二部分內容。
關于ASP.NET Core MVC相關文章,如下所示:
本系列文章,旨在拋磚引玉,溫故而知新,一起學習,共同進步。學習編程,從關注【老碼識途】開始?。?!
聯(lián)系客服