在 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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2983/viewspace-2826890/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ASP.NET Core中配置監聽URLs的五種方式ASP.NET
- 如何在 ASP.NET Core 5 中過載 Action 方法ASP.NET
- jwt-在asp.net core中的使用jwtJWTASP.NET
- CodeIgniter3 獲取GET/POST/PUT/DELETE方法多種方式傳參delete
- 在ASP.NET Core 中使用 .NET Aspire 訊息傳遞元件ASP.NET元件
- vue路由傳參的三種基本方式Vue路由
- 在ASP.NET Core中用HttpClient(六)——ASP.NET Core中使用HttpClientFactoryASP.NETHTTPclient
- 在ASP.NET Core中使用ViewComponentASP.NETView
- 在 ASP.NET Core 中禁用HTTPSASP.NETHTTP
- query傳參 和 params傳參方式
- 自動擋換手動擋:在 ASP.NET Core 3.0 Middleware 中手動執行 Controller ActionASP.NETController
- Mybatis的幾種傳參方式,你瞭解嗎?MyBatis
- ASP.net core 使用UEditor.Core 實現 ueditor 上傳功能ASP.NET
- 在ASP.NET Core MVC 2.2 中使用AutoMapperASP.NETMVCAPP
- 在ASP.NET Core中使用brotli壓縮ASP.NET
- 在Keycloak中實現多租戶並在ASP.NET Core下進行驗證ASP.NET
- go 陣列傳遞給函式三種方式Go陣列函式
- 幾種常見的Vue元件間的傳參方式Vue元件
- ASP.NET Core 3 起架設在 Windows IIS 方式改變ASP.NETWindows
- 【ASP.NET Core】配置應用程式地址的N多種方法ASP.NET
- ASP.NET Core ----ASP.NET Core中使用Code FirstASP.NET
- Asp.Net Core WebAPI+PostgreSQL部署在Docker中ASP.NETWebAPISQLDocker
- 在ASP.Net Core和Java中配置金鑰ASP.NETJava
- gRPC在 ASP.NET Core 中應用學習RPCASP.NET
- 在ASP.NET Core中用HttpClient(三)——傳送HTTP PATCH請求ASP.NETHTTPclient
- CSS中的多種居中方式CSS
- JS中的多種繼承方式JS繼承
- DotNetCore系列:在ASP.NET Core 3.1中獲取xml格式的介面入參並轉化為jsonNetCoreASP.NETXMLJSON
- Asp.Net中的Action和Func委託ASP.NET
- 何時以引用方式傳參
- sc-token傳參方式20240613
- 翻譯 - ASP.NET Core 託管和部署 - 在 Linux 上使用 Nginx 託管 ASP.NET Core 網站ASP.NETLinuxNginx網站
- .net6中使用EF core多個上下文遷移方式
- 在 asp.net core 中使用類似 Application 的服務ASP.NETAPP
- 用Vue來實現圖片上傳多種方式Vue
- 你需要知道的這幾種 asp.net core 修改預設埠的方式ASP.NET
- Asp.Net MVC控制器獲取檢視傳值幾種方式ASP.NETMVC
- 在Asp.NET Core中如何優雅的管理使用者機密資料ASP.NET