前言

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">ASP.NET Core中如何利用多种方式给Action传参

又或者是将 信用卡 塞入到 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 来进行测试。

ASP.NET Core中如何利用多种方式给Action传参

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

华山资源网 Design By www.eoogi.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
华山资源网 Design By www.eoogi.com

稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!

昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。

这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。

而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?