在 ASP.NET Core 中使用多种方式给 Action 传参
ASP.NET Core 是一個跨平臺,開源的,輕量級,高性能 并且 高度模塊化的web框架。在 ASP.NET Core MVC 中有很多種方式可以給 Action 方法傳遞參數,比如說:url方式,querystring方式,request header,request body,form 等等。本篇就和大家一起討論下如何使用這些方式,并且用代碼去一一驗證。
創建 AuthorRepository 類
在這個例子中我會使用一個 Repository 類,然后在 Controller 下的 Action 方法調用這個 Repository 來實現基本的 CURD 操作,首先我們聲明一個 Author 類,代碼如下:
public?class?Author{public?int?Id?{?get;?set;?}public?string?FirstName?{?get;?set;?}public?string?LastName?{?get;?set;?}}AuthorRepository 類提供了如下三個方法。
GetAuthor 用于從泛型集合中獲取 Author 實體
Save 用于將 Author 保存到底層的 泛型集合中
GetAuthors 用于分頁獲取 泛型集合中的數據
具體代碼如下:
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 進行傳參。
[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 的結構信息,所以它具有向后兼容性,考慮下面的代碼片段,它是如何使用 querystring 方式向 action 傳參的?
[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 參數是可選的,意味著如果不傳入的話,默認按照 1 來計算,舉個例子,如果底層的 AuthorList 有 100 條記錄 同時當前傳遞的 page =3,那么該方法將會返回 31-40 這10條記錄,這里的每頁返回多少條是采用硬編碼的,比如我這里定義的是10,大家可以根據自己的情況設置合理的值。
通過 request header 方式
大多情況下,在傳遞身份信息,隱私數據 等場景下會用到這種方式,比如說 Basic 驗證,如下圖:
又或者是將 信用卡 塞入到 header 中,下面的代碼展示了如何在 Action 中接收 header 中的信用卡號碼。
[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 方法只能驗證 Visa,MasterCard,Amex 這三種類型的信用卡,如果還想擴展到其他信用卡的話,你可以自己修改一下,因為信用卡號碼一般需要被安全的傳遞,所以采用這種方式還是很不錯的選擇,下面展示了如何通過 PostMan 將 信用卡號碼 塞入到 header 中。
使用 request body 方式
request body 常常用于執行 insert 或者 update 操作,也是我們平時在web開發中用的最多的一種參數傳遞方式,下面的代碼片段展示了如何使用在 Action 中接收 request body。
[HttpPost] [Route("Default/Insert")] public?IActionResult?Insert([FromBody]?Author?author) {return?Ok(authorRepository.Save(author)); }接下來看看前端如何 post 數據到 后端來,這里繼續使用 Postman 來進行測試。
DefaultController 的完整代碼
為了能夠看到全貌,下面用 DefaultController 羅列了本篇聊到了所有傳值方式。
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 傳遞參數,不過 form 的場景更多的用于 文件上傳,要這么做的話,可以利用 IFormFile 去搞定。
譯文鏈接:https://www.infoworld.com/article/3568209/how-to-pass-parameters-to-action-methods-in-asp-net-core-mvc.html
總結
以上是生活随笔為你收集整理的在 ASP.NET Core 中使用多种方式给 Action 传参的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020 . NET大会日程公布!行程亮
- 下一篇: WinUI 3 Preview 3 发布