ASP.NET Core中如何利用多種方式給Action傳參
前言
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 類,代碼如下:
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ù)
具體代碼如下:
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 方式
最簡(jiǎn)單粗暴的給 Action 傳參就是通過 url 方式,下面的代碼片段展示了如何通過 url 進(jìn)行傳參。
[HttpGet]
[Route("Default/GetAuthor/{authorId:int}")]
public IActionResult GetAuthor(int authorId)
{
var data = authorRepository.GetAuthor(authorId);
return View(data);
}
輸入的 url 格式如下:
通過 querystring 方式
這種方式的做法就是采用 ? 的模式,好處在于可以不修改 url 的結(jié)構(gòu)信息,所以它具有向后兼容性,考慮下面的代碼片段,它是如何使用 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 格式如下:
值得注意的是 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ù) 等場(chǎng)景下會(huì)用到這種方式,比如說 Basic 驗(yàn)證,如下圖:

又或者是將 信用卡 塞入到 header 中,下面的代碼展示了如何在 Action 中接收 header 中的信用卡號(hào)碼。
[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);
}
為了簡(jiǎn)化目的, 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。
[HttpPost]
[Route("Default/Insert")]
public IActionResult Insert([FromBody] Author author)
{
return Ok(authorRepository.Save(author));
}
接下來看看前端如何 post 數(shù)據(jù)到 后端來,這里繼續(xù)使用 Postman 來進(jìn)行測(cè)試。

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 傳遞參數(shù),不過 form 的場(chǎng)景更多的用于 文件上傳,要這么做的話,可以利用 IFormFile 去搞定。
到此這篇關(guān)于ASP.NET Core中如何利用多種方式給Action傳參的文章就介紹到這了,更多相關(guān)ASP.NET Core用多種方式給Action傳參內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ASP.NET與ASP互通COOKIES的一點(diǎn)經(jīng)驗(yàn)
ASP與ASP.NET互相整合時(shí),其中文COOKIES信息無法被互通共享,當(dāng)使用ASP.NET寫入中文COOKIES信息后,使用ASP進(jìn)行讀取,讀出來的卻是亂碼,而非中文。2010-03-03
asp.net下經(jīng)典數(shù)據(jù)庫記錄分頁代碼
asp.net下經(jīng)典數(shù)據(jù)庫記錄分頁代碼...2007-04-04
用戶控件(ASCX)向網(wǎng)頁(ASPX)傳值使用反射實(shí)現(xiàn)
用戶控件向網(wǎng)頁傳遞值,網(wǎng)上的方法有很多,本文嘗試一下使用反射來實(shí)現(xiàn),感興趣的朋友可以參考下哈,希望可以幫助到你2013-03-03
Asp.Net2.0權(quán)限樹中Checkbox的操作
Asp.Net2.0權(quán)限樹中Checkbox的操作...2006-09-09
通過ASP.net實(shí)現(xiàn)flash對(duì)數(shù)據(jù)庫的訪問
近來網(wǎng)站需要在flash中提取數(shù)據(jù)庫中的數(shù)據(jù),從網(wǎng)上找了一點(diǎn)資料,今天下午在自己的機(jī)器上實(shí)現(xiàn)了一下,還是比較簡(jiǎn)單的。2009-08-08
Asp.net開發(fā)常用的51個(gè)非常實(shí)用的代碼
Asp.net開發(fā)常用的51個(gè)非常實(shí)用的代碼,需要的朋友可以參考下。2010-06-06
使用visual studio自動(dòng)創(chuàng)建IIS虛擬目錄
使用visual studio自動(dòng)創(chuàng)建IIS虛擬目錄,需要的朋友可以參考一下2013-02-02
ASP.NET Core MVC/WebApi基礎(chǔ)系列1
這篇文章主要介紹了ASP.NET Core MVC/WebApi基礎(chǔ)系列,后續(xù)會(huì)穿插講EF Core和ASP.NET Core,雖說是基礎(chǔ)系列但也是也有你不知道的。2019-04-04

