前言
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 方式
这种方式的做法就是采用 "htmlcode">
[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"text-align: center">
又或者是将 信用卡 塞入到 header 中,下面的代码展示了如何在 Action 中接收 header 中的信用卡号码。
[HttpGet] [Route("Default/IsCreditCardValid/{creditCardNumber}")] public IActionResult IsCreditCardValid([FromHeader] string creditCardNumber) { string regexExpression = "^(" + "(" + "("; 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 = "^(" + "(" + "("; 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
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。