在 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306306.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WinUI 3 Preview 3 发布了,再一次试试它的性能

1. WinUI 3在微软 Build 2020 开发者大会上&#xff0c;WinUI 团队宣布可公开预览的 WinUI 3 Preview 1&#xff0c;它让开发人员可以在 Win32 中使用 WinUI。最终 XAML 的新功能不再和 Windows SDK 绑定&#xff0c;所有新的 XAML 功能都将作为 WinUI 的一部分发布。作为 OS 的…

m苹果放n篮子_egg appple千万别翻译为“鸡蛋苹果”,老外听到会懵圈的

egg很熟悉&#xff0c;apple也很熟悉&#xff0c;可是egg apple就让人一脸懵了&#xff0c;鸡蛋苹果是啥玩意&#xff1f;难道中国人有番茄鸡蛋&#xff0c;而歪果仁喜欢鸡蛋炒苹果&#xff1f;1&#xff1a;egg apple 是什么意思&#xff1f;其实英国人眼中的茄子是 egg apple…

基于.NET Core的简单,跨平台,模块化的电子商务系统-SimplCommerce

SimplCommerce是基于.NET Core的简单&#xff0c;跨平台&#xff0c;模块化的电子商务系统官网&#xff1a;www.simplcommerce.com开源地址&#xff1a;https://github.com/simplcommerce/SimplCommerce高层架构在线演示&#xff08;Azure网站&#xff09;店面&#xff1a;http…

grade项目导入新external libraries_【易推荐】德意志银行学院中国项目启动

展翅高飞 开阔眼界探索新的机遇总会令人振奋不已。德意志银行集团(以下简称德意志银行或德银)举办了“德意志银行学院”项目(DB Academy&#xff0c;以下简称“德银学院”)。如果同学们有投身金融服务行业的志向&#xff0c;欢迎加入德银学院在中国的项目。“德银学院”项目为…

程序员过关斩将--请不要误会redis 6.0 的多线程

“你对redis的单线程是不是有点误会&#xff1f;“你对redis 6.0的多线程是不是也有点误会&#xff1f;“redis多线程一定可以提高性能吗&#xff1f;redis官方刚刚发布的6.0版本已经掀起了业界一阵热波&#xff0c;在这个版本中新加了很多新特性&#xff0c;如果你打开redis的…

python 防止转义_python字符串前加r、f、u、l 的区别

f-strings 是指以f或F 开头的字符串&#xff0c;其中以 {}包含的表达式会进行值替换。&#xff08;目前支持python3.6版本&#xff09;下面看下f-strings的使用方法基本使用&#xff08;作用&#xff1a;替换值&#xff09;在字符串前加r可防止字符串转义作用&#xff1a;没有转…

动手实现深度学习pytroch版

深度学习介绍&#xff1a; 数据预处理

c++ eos智能合约开发_[EOS智能合约]第二节:用EOS开发一个To-do List小应用

EOS Asia本教程原文作者为EOS Asia&#xff0c;亚洲最具技术实力和最国际化的EOS超级节点竞选者。EOS Asia 同时也是EOS Gems和Traffic Exchange Token这两个项目背后的开发者。本文由 DappReview 获得 EOS Asia 授权进行翻译并发表。本篇是EOS智能合约系列第二弹&#xff0c;该…

acwing2058. 笨拙的手指(进制转换)

题目含义: 给出一个二进制数,三进制数(这俩数有且一位是错误的) 请输出他们对应的十进制数 原题链接 视频讲解 问题难点: 其他进制转化为十进制算法 大数据的读入 string 按位异或运算(常用的ACSII码值)

使用Github部署Azure应用服务

上次我们介绍了如果使用Azure应用服务(不用虚机不用Docker使用Azure应用服务部署ASP.NET Core程序)。我们通过Visual studio新建一个项目后手动编译发布代码。然后通过FTP上传我们的发布文件。整个过程跟我们手动发布项目到IIS上其实没啥差别。这么操作有点繁琐&#xff0c;显然…

7搭建zabbix_监控03分布式监控Zabbix

监控03-分布式监控Zabbix一、Zabbix概述Zabbix是一个基于Web界面的分布式系统监控与网络设备监控系统&#xff0c;能够监控各种网络参数&#xff0c;并提供灵活的通知机制&#xff0c;以使管理员能快速定位故障并解决。由于zabbix server端与zabbix agent组成&#xff0c;可通过…

acwing2041. 干草堆(差分数组)

题目描述: 原题链接 视频讲解 差分算法(前缀和的逆运算) 差法算法(差分与前缀和的下标都从1开始,避免出现越界) 算法思路:给l,r区间内加上x,则表示为在l的位置+x,在r+1的位置上-x,就可抵消掉+x在r+1开始后的贡献,再利用前缀和就能一次求出答案

各纬度气候分布图_欧洲气候特征:以温带气候类型为主,是海洋性气候最显著的大洲...

气候是一个区域内大气物理特征的长期多年平均状态&#xff0c;是一种相对稳定的自然地理要素&#xff0c;包括气温、热量、降水、光照等气候要素组成。根据全球不同区域的气候特征来划分出不同的气候类型&#xff0c;主要的气候类型包括热带雨林气候、热带草原气候、热带沙漠气…

.NET 5开源项目:b站账号快速升级到 Lv6,每天自动签到,观看,分享,投币视频!...

推荐一个神奇的开源项目&#xff1a;BiliBiliToolhttps://github.com/RayWangQvQ/BiliBiliTool.Net 5 编写的B站&#xff08;哔哩哔哩&#xff09;任务工具&#xff0c;通过GitHub Actions实现每日线上自动运行任务&#xff1a;每日自动登录、观看、分享、投币视频&#xff0c;…

acwing2060. 奶牛选美(bfs)

题目描述: 题目描述:在一个二维矩阵中,有两个点的集合,找到最短的距离(从一个集合到另一个集合中)距离的计算方式为(曼哈顿距离) 曼哈顿距离:两点间的曼哈顿距离 = | x1 - x2 | + | y1 - y2 | 输出最短距离 原题链接 视频讲解 问题难点: 二维矩阵使用了字符类型存储 PI…

pandas用均值填充nan_Pandas学习笔记(三)

前言学习Pandas的最好方式就是多用它&#xff0c;只有在实际中多用&#xff0c;才能更好地掌握其中的技巧&#xff0c;这一次我们从数据的聚合来开始。GroupBy的使用聚合的意思指的是对数据框架中某一类型的数据进行整合&#xff0c;在整合后可以对其进行求和、求平均值等操作&…

acwing2019. 拖拉机(最短路径)

题目描述:(边权只有0和1的最短路径问题) 可以走出矩阵 点权{走障碍物:1,不走障碍物:0} 最短路径=路径上障碍物的数量 双端队列:0的时候入队首,1的时候入队尾(只能出队一次,但可以入队很多次) 双端队列的前半段是全为0,后半段全为1. bfs(实际上是一种迪杰斯特拉算法…

有关Quartz.NET,与一线码农大佬对个线?

跟[一线码农大佬]翻译的某技术文对个线最近看到一线码农大佬翻译的《如何在 ASP.NET Core 中使用 Quartz.NET 执行任务调度》&#xff0c;行文思路&#xff1a;安装Quartz.NETQuartz.NET 中的Job,triggers 和 Schedulers创建 Scheduler开启和停止 scheduler创建 job 工厂创建 J…

真的,太多人辜负了.NET5!

.NET5发布一个月了&#xff0c;有没有动手试试&#xff1f;Windows服务器Visual Studio SQL Server做跨平台开发&#xff1f;那你真的辜负了这个时代&#xff01;强烈建议尝试下Linux&#xff0c;不仅是程序部署&#xff0c;而是全Linux环境开发、运行、部署.NET 5项目&#x…

总结 Visual Studio 2019 发布以来 XAML 工具的改进

不知不觉&#xff0c;Visual Studio 2019 已经出到 16.8 和 16.9 Preview 了。虽然每次更新都林林总总地一大堆新功能和改进&#xff0c;但关于 XAML 的内容总是&#xff0c;always&#xff0c;每次都只有一点点。其实 Xamarin 相关的内容有在使劲地更新&#xff0c;不过和我做…