栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

在 ASP.NET Core 中使用多种方式给 Action 传参

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在 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 authors = new List()
 {
     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 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 =
   "^(?:(?4[0-9]{12}(?:[0-9]{3})?)|" +
   "(?5[1-5][0-9]{14})|" +
   "(?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 =
     "^(?:(?4[0-9]{12}(?:[0-9]{3})?)|" +
     "(?5[1-5][0-9]{14})|" +
     "(?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 去搞定。

更多高质量干货:参见我的 GitHub: [csharptranslate] github.com/ctripxchuang/csharptranslate

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号