首頁>技術>

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 去搞定。

20
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • TCP網路面試知識