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/art…
更多高质量干货:参见我的 GitHub: csharptranslate