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 传参相关推荐

  1. 初探CSRF在ASP.NET Core中的处理方式

    前言 前几天,有个朋友问我关于AntiForgeryToken问题,由于对这一块的理解也并不深入,所以就去研究了一番,梳理了一下. 在梳理之前,还需要简单了解一下背景知识. AntiForgeryTo ...

  2. ASP.NET Core中如何调整HTTP请求大小的几种方式

    一.前言 一般的情况下,我们都无需调用HTTP请求的大小,只有在上传一些大文件,或者使用HTTP协议写入较大的值时(如调用WebService)才可能会调用HTTP最大请求值. 在ASP.NET Co ...

  3. .ASP NET Core中缓存问题案例

    本篇博客中,我将描述一个关于会话状态(Session State)的问题, 这个问题我已经被询问了好几次了. 问题的场景 创建一个新的ASP.NET Core应用程序 一个用户在会话状态中设置了一个字 ...

  4. ASP.NET Core 中文文档 第三章 原理(13)管理应用程序状态

    原文:Managing Application State 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:高嵩 在 ASP.NET Core 中,有多种途径可以对应用程序的状态进行 ...

  5. ASP.NET Core中的响应压缩

    介绍 响应压缩技术是目前Web开发领域中比较常用的技术,在带宽资源受限的情况下,使用压缩技术是提升带宽负载的首选方案.我们熟悉的Web服务器,比如IIS.Tomcat.Nginx.Apache等都可以 ...

  6. 在ASP.NET Core中创建自定义端点可视化图

    在上篇文章中,我为构建自定义端点可视化图奠定了基础,正如我在第一篇文章中展示的那样.该图显示了端点路由的不同部分:文字值,参数,动词约束和产生结果的端点: 在本文中,我将展示如何通过创建一个自定义的D ...

  7. 重学ASP.NET Core 中的标记帮助程序

    标记帮助程序是什么 标记帮助程序使服务器端代码可以在 Razor 文件中参与创建和呈现 HTML 元素. 例如,内置的 ImageTagHelper 可以将版本号追加到图片名称.  每当图片发生变化时 ...

  8. 在ASP.NET Core中创建基于Quartz.NET托管服务轻松实现作业调度

    在这篇文章中,我将介绍如何使用ASP.NET Core托管服务运行Quartz.NET作业.这样的好处是我们可以在应用程序启动和停止时很方便的来控制我们的Job的运行状态.接下来我将演示如何创建一个简 ...

  9. Asp.Net Core 中IdentityServer4 授权中心之自定义授权模式

    一.前言 上一篇我分享了一篇关于 Asp.Net Core 中IdentityServer4 授权中心之应用实战的文章,其中有不少博友给我提了问题,其中有一个博友问我的一个场景,我给他解答的还不够完美 ...

最新文章

  1. 大数据概念思维导图_思维导图|数据化风控(信用评分建模教程)
  2. ADC的参数分析以及采样分析
  3. Supervisor 托管服务
  4. MFC UI按钮多线程
  5. android jni java类型与c语言类型互换
  6. 【HDU - 3466 】Proud Merchants(dp,背包问题,巧妙排序)
  7. 数据结构之线性表(附代码)
  8. 转:一个网页图表的demon网站
  9. 谷歌搜索将于 2019 年年底停止索引任何 Flash 内容
  10. php中while能break吗,php中break的作用
  11. 在Tomcat 与weblogic 中的 日志(log4j) 配置系列三(log文件的存放路径)
  12. 句句真研—每日长难句打卡Day17
  13. 易语言使用超级模块 全局热键
  14. python判断中文近义词_近义词查询工具easySynonyms
  15. java缓冲溜大题_求大神解答这一道Java题 第20题 跪谢!
  16. 超级无敌小小迷你宝宝小可爱大仙女芊老婆~
  17. 自己编写的数据库如何和mapkeeper相连进行评测
  18. React 中constructor 作用
  19. 云耀服务器切换系统,云耀云服务器切换操作系统
  20. Gamemaker studio2经验(2)——TCP联机

热门文章

  1. LeetCode 最大正方形
  2. tomcat一闪而过
  3. 使用badboy录制脚本 结合Jmeter一起测试。
  4. octave中的一些基本操作
  5. C语言 linux环境基于socket的简易即时通信程序
  6. RTP在。net中的使用(资料)
  7. android之在view中内嵌浏览器的方法
  8. Git删除不存在对应远程分支的本地分支
  9. Windows按名称排序问题
  10. c# 类的基本知识,未完,待续