前言
ASP.NET Core 是一個(gè)跨平臺(tái),開源的,輕量級(jí),高性能 并且 高度模塊化的web框架。在 ASP.NET Core MVC 中有很多種方式可以給 Action 方法傳遞參數(shù),比如說:url方式,querystring方式,request header,request body,form 等等。本篇就和大家一起討論下如何使用這些方式,并且用代碼去一一驗(yàn)證。
創(chuàng)建 AuthorRepository 類
在這個(gè)例子中我會(huì)使用一個(gè) Repository 類,然后在 Controller 下的 Action 方法調(diào)用這個(gè) Repository 來實(shí)現(xiàn)基本的 CURD 操作,首先我們聲明一個(gè) Author 類,代碼如下:
1
2
3
4
5
6
|
public class Author { public int Id { get ; set ; } public string FirstName { get ; set ; } public string LastName { get ; set ; } } |
AuthorRepository 類提供了如下三個(gè)方法。
- GetAuthor 用于從泛型集合中獲取 Author 實(shí)體
- Save 用于將 Author 保存到底層的 泛型集合中
- GetAuthors 用于分頁獲取 泛型集合中的數(shù)據(jù)
具體代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
public class AuthorRepository { List<Author> authors = new List<Author>() { new Author { Id = 1, FirstName = "Joydip" , LastName = "Kanjilal" }, new Author { Id = 2, FirstName = "Steve" , LastName = "Smith" } }; public Author GetAuthor( int id) { return authors.FirstOrDefault(a => a.Id == id); } public List<Author> GetAuthors( int pageNumber = 1) { int pageSize = 10; int skip = pageSize * (pageNumber - 1); if (authors.Count < pageSize) pageSize = authors.Count; return authors .Skip(skip) .Take(pageSize).ToList(); } public bool Save(Author author) { var result = authors.Where(a => a.Id == author.Id); if (result != null ) { if (result.Count() == 0) { authors.Add(author); return true ; } } return false ; } } |
通過 url 方式
最簡單粗暴的給 Action 傳參就是通過 url 方式,下面的代碼片段展示了如何通過 url 進(jìn)行傳參。
1
2
3
4
5
6
7
|
[HttpGet] [Route( "Default/GetAuthor/{authorId:int}" )] public IActionResult GetAuthor( int authorId) { var data = authorRepository.GetAuthor(authorId); return View(data); } |
輸入的 url 格式如下:
GET: http://localhost:8061/Default/GetAuthor/1
通過 querystring 方式
這種方式的做法就是采用 ? 的模式,好處在于可以不修改 url 的結(jié)構(gòu)信息,所以它具有向后兼容性,考慮下面的代碼片段,它是如何使用 querystring 方式向 action 傳參的?
1
2
3
4
5
6
7
8
|
[HttpGet] [Route( "Default/GetAuthors/{pageNumber:int}" )] public IActionResult GetAuthors([FromQuery (Name = "pageNumber" )] int pageNumber = 1) { var data = authorRepository.GetAuthors(pageNumber); return Ok(data); } |
輸入的 url 格式如下:
GET: http://localhost:8061/Default/GetAuthors?pageNumber=1
值得注意的是 Action 方法的 pageNumber 參數(shù)是可選的,意味著如果不傳入的話,默認(rèn)按照 1 來計(jì)算,舉個(gè)例子,如果底層的 AuthorList 有 100 條記錄 同時(shí)當(dāng)前傳遞的 page =3,那么該方法將會(huì)返回 31-40 這10條記錄,這里的每頁返回多少條是采用硬編碼的,比如我這里定義的是10,大家可以根據(jù)自己的情況設(shè)置合理的值。
通過 request header 方式
大多情況下,在傳遞身份信息,隱私數(shù)據(jù) 等場景下會(huì)用到這種方式,比如說 Basic 驗(yàn)證,如下圖:
又或者是將 信用卡 塞入到 header 中,下面的代碼展示了如何在 Action 中接收 header 中的信用卡號(hào)碼。
1
2
3
4
5
6
7
8
9
10
11
12
|
[HttpGet] [Route( "Default/IsCreditCardValid/{creditCardNumber}" )] public IActionResult IsCreditCardValid([FromHeader] string creditCardNumber) { string regexExpression = "^(?:(?<visa>4[0-9]{12}(?:[0-9]{3})?)|" + "(?<mastercard>5[1-5][0-9]{14})|" + "(?<amex>3[47][0-9]{13})|)$" ; Regex regex = new Regex(regexExpression); var match = regex.Match(creditCardNumber); return Ok(match.Success); } |
為了簡化目的, IsCreditCardValid 方法只能驗(yàn)證 Visa,MasterCard,Amex 這三種類型的信用卡,如果還想擴(kuò)展到其他信用卡的話,你可以自己修改一下,因?yàn)樾庞每ㄌ?hào)碼一般需要被安全的傳遞,所以采用這種方式還是很不錯(cuò)的選擇,下面展示了如何通過 PostMan 將 信用卡號(hào)碼 塞入到 header 中。
使用 request body 方式
request body 常常用于執(zhí)行 insert 或者 update 操作,也是我們平時(shí)在web開發(fā)中用的最多的一種參數(shù)傳遞方式,下面的代碼片段展示了如何使用在 Action 中接收 request body。
1
2
3
4
5
6
|
[HttpPost] [Route( "Default/Insert" )] public IActionResult Insert([FromBody] Author author) { return Ok(authorRepository.Save(author)); } |
接下來看看前端如何 post 數(shù)據(jù)到 后端來,這里繼續(xù)使用 Postman 來進(jìn)行測試。
DefaultController 的完整代碼
為了能夠看到全貌,下面用 DefaultController 羅列了本篇聊到了所有傳值方式。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
public class DefaultController : Controller { private readonly AuthorRepository authorRepository = new AuthorRepository(); [HttpGet] [Route( "Default/GetAuthor/{authorId:int}" )] public IActionResult GetAuthor( int authorId) { var data = authorRepository.GetAuthor(authorId); return Ok(data); } [HttpGet] [Route( "Default/GetAuthors/{pageNumber:int}" )] public IActionResult GetAuthors([FromQuery (Name = "pageNumber" )] int pageNumber = 1) { var data = authorRepository.GetAuthors(pageNumber); return Ok(data); } [HttpGet] [Route( "Default/IsCreditCardValid/{creditCardNumber}" )] public IActionResult IsCreditCardValid ([FromHeader] string creditCardNumber) { string regexExpression = "^(?:(?<visa>4[0-9]{12}(?:[0-9]{3})?)|" + "(?<mastercard>5[1-5][0-9]{14})|" + "(?<amex>3[47][0-9]{13})|)$" ; Regex regex = new Regex(regexExpression); var match = regex.Match(creditCardNumber); return Ok(match.Success); } [HttpPost] [Route( "Default/Insert" )] public IActionResult Insert([FromBody] Author author) { return Ok(authorRepository.Save(author)); } } |
最后,你也可以采用 form 的形式給 Action 傳遞參數(shù),不過 form 的場景更多的用于 文件上傳,要這么做的話,可以利用 IFormFile 去搞定。
到此這篇關(guān)于ASP.NET Core中如何利用多種方式給Action傳參的文章就介紹到這了,更多相關(guān)ASP.NET Core用多種方式給Action傳參內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
譯文鏈接:https://www.infoworld.com/article/3568209/how-to-pass-parameters-to-action-methods-in-asp-net-core-mvc.html
原文鏈接:https://mp.weixin.qq.com/s/FShk6zUP-p58o-MM1_I9bA