在 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 { getset; }
        public string FirstName { getset; }
        public string LastName { getset; }
    }

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


本文分享自微信公衆號 - Dotnet9(dotnet9_com)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章