ASP.NET Core MVC獲取請求的參數(shù)方法示例
前言
一次HTTP請求,就是一次標準IO操作。請求是I,是輸入;響應(yīng)式O,是輸出。任何web開發(fā)框架,其實都是在干這兩件事:
- 接受請求并進行解析獲取參數(shù)
- 根據(jù)參數(shù)進行渲染并輸出響應(yīng)內(nèi)容
所以我們學習一個框架,我認為最首要的是知道如何從請求中獲取參數(shù)。http請求攜帶參數(shù)的地方主要有下面幾個地方:
- URL
- Header
- Body
下面看看ASP.NET Core是如何從這幾個位置獲取參數(shù)的。
通過URL獲取參數(shù)
通過URL傳參是HTTP最最常用的辦法。這里簡單介紹下URL相關(guān)的知識。一個URL主要分成4個部分,以http://localhost:5000/fromurl/test?name=mjzhou&age=10為例:
http:// | 協(xié)議 |
localhost:5000 | 主機地址 |
/fromurl/test | PATH |
name=mjzhou&age=10 | QueryString |
我們通常使用PATH跟QueryString來傳遞參數(shù)。新建一個MVC項目,新建一個Controller名為FromUrlController,通過幾個Action來演示如何從URL上獲取參數(shù)。
通過QuerySting獲取參數(shù)
Request.Query對象
// /fromurl/test?name=mjzhou public IActionResult Test() { var name = Request.Query["name"]; return Content(name); }
Request.Query對象包含了本次請求的QueryString的鍵值對列表,所以可以通過它輕松獲取QueryString上攜帶的參數(shù)。
自動參數(shù)綁定
// /fromurl/test?name=mjzhou public IActionResult Test1(string name) { return Content(name); }
如果Action的型參的名稱跟QueryString的Key一致,則MVC框架會自動幫我們綁定參數(shù)的值,不用手動獲取。
public IActionResult Test2([FromQuery(Name = "id")]string bh) { return Content(bh); }
如果參數(shù)綁定的名稱跟QueryString的Key不一致,可以使用FromQueryAttribute強制指定綁定的Key的名稱。
通過PATH獲取參數(shù)
Request.Path對象
// /fromurl/test3 public IActionResult Test3() { var path = Request.Path; return Content(path); }
Request.Path對象包含了本次http請求的Path的原始信息,一般可以通過/來分隔,手工獲取想要的參數(shù)。
自動參數(shù)綁定
// /fromurl/Test4/mjzhou/1000 [Route("FromUrl/test4/{name}/{id}")] public IActionResult Test4(string name, int id) { return Content($"{name}/{id}"); }
Path的自動參數(shù)綁定,需要配合RouteAttribute實現(xiàn),RouteAttribute主要是指定一個Path的模板,通過這個模板可以告訴路由是否匹配這個Action,另外一個就是可以告訴參數(shù)綁定,如何解析這個path實現(xiàn)參數(shù)綁定。
[Route("FromUrl/test6/{name}/{id}")] public IActionResult Test6([FromRoute(Name ="name")]string xm, [FromRoute(Name = "id")]int bh) { return Content($"{xm}/{bh}"); }
如果Action的型參名稱跟RouteAttribute模板的中的名稱不一樣,那么可以使用FromRoute強制指定解析的名稱。
[HttpGet("FromUrl/test5/{name}/{id}")] public IActionResult Test5(string name, int id) { return Content($"{name}/{id}"); }
HttpGetAttribute、HttpPostAttribute等attribute同樣可以完成RouteAttribute的效果,而且還指定了action接受的HTTP Method的方法,可以說是加強版的RouteAttribute。
從Header上獲取參數(shù)
添加一個FromHeaderController,通過幾個action來演示如果從http headers上獲取參數(shù)。
Request.Headers對象
// /FromHeader/test public IActionResult Test() { var myName = Request.Headers["myName"]; return Content(myName); }
Request.Headers是一個字典,包含了本次請求的Headers。所以我們可以通過Request.Headers對象輕松獲取某個header的值。
自動參數(shù)綁定
public IActionResult Test1([FromHeader]string myName) { return Content(myName); }
通過在action的型參上打上FromHeaderAttribute,可以告訴框架自動從header獲取參數(shù)。
public IActionResult Test2([FromHeader(Name = "myName")]string name) { return Content(name); }
如果action的型參跟header的key值不一致,可以通過FromHeaderAttribute強制指定匹配的header的key值。
從Body獲取參數(shù)
我們開發(fā)的時候經(jīng)常通過表單提交數(shù)據(jù),或者通過AJAX往后臺提交一個JavaScript對象,本質(zhì)上這些數(shù)據(jù)都是通過HTTP的Bady提交回去的。新建一個FromBodyController控制器,通過幾個Action來演示如何獲取Body的參數(shù)。
Request.Body對象
public class model1 { public string NAME { get; set; } } public async Task<IActionResult> Test() { Request.EnableBuffering(); string body = ""; var stream = Request.Body; if (stream != null) { stream.Seek(0, SeekOrigin.Begin); using (var reader = new StreamReader(stream, Encoding.UTF8, true, 1024, true)) { body = await reader.ReadToEndAsync(); } stream.Seek(0, SeekOrigin.Begin); } var model = JsonConvert.DeserializeObject<model1>(body); return Content(model.NAME); }
Request.Body是一個Stream,保存了本次請求的body數(shù)據(jù)。所以我們只要把這個stream讀出來,就能獲取提交的數(shù)據(jù)。有了原始的數(shù)據(jù),就可以通過反序列化等操作轉(zhuǎn)換為模型,更簡單的獲取參數(shù)了。注意,ASP.NET Core想要讀取這個對象,必須先調(diào)用Request.EnableBuffering()這個方法。
使用postman測試一下:
參數(shù)自動綁定
public IActionResult Test1([FromBody]model1 model) { return Content(model.NAME); }
使用FromBodyAttribute可以把body的數(shù)據(jù)自動反序列化成型參的模型。但是請注意使用[FromBody]請求的Content-Type必須是application-json。
使用postman測試下:
public IActionResult Test2([FromForm]model1 model) { return Content(model.NAME); }
使用FromFormAttribute可以把body的數(shù)據(jù)自動反序列化成型參的模型。但是請注意使用[FromForm]請求的Content-Type必須是application/x-www-form-urlencoded。
總結(jié)
ASP.NET Core獲取請求參數(shù)主要從URL,Headers,Body等位置獲取。我們可以通過Request.Query、Request.Headers、Request.Body來手工獲取數(shù)據(jù)。也可以通過[FromQuery]、[FromHeader]、[Frombody]等Attribute來實現(xiàn)參數(shù)的自動綁定。
好了,到此這篇關(guān)于ASP.NET Core MVC獲取請求的參數(shù)的文章就介紹到這了,更多相關(guān)ASP.NET Core MVC獲取請求參數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ASP.NET 修復(fù) IIS 映射具體實現(xiàn)步驟
本文主要介紹IIS映射的具體步驟,希望對大家有所幫助。2016-05-05如何使用ASP.NET MiniAPI 調(diào)試未匹配請求路徑
ASP.NET MiniAPI是一個輕量級的Web API框架,它可以讓我們快速地構(gòu)建和部署RESTful服務(wù),本文給大家介紹使用ASP.NET MiniAPI 調(diào)試未匹配請求路徑的方法,感興趣的朋友一起看看吧2024-01-01使用NLog給Asp.Net Core做請求監(jiān)控的方法
這篇文章主要介紹了使用NLog給Asp.Net Core做請求監(jiān)控的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05ASP.NET對HTML頁面元素進行權(quán)限控制(三)
界面每個元素的權(quán)限也是需要控制的。比如一個查詢用戶的界面里面有查詢用戶按鈕,添加用戶按鈕,刪除用戶按鈕,不同的角色我們得分配不同的權(quán)限2013-12-12c#實現(xiàn)根據(jù)網(wǎng)絡(luò)IP顯示地理位置功能示例
通常都會有類似 注冊IP和最后登錄IP這兩個的字段來存儲用戶注冊時候的IP地址和最后登錄的IP的地址,現(xiàn)在我們就簡單的實現(xiàn)一下如標題所示的功能2013-06-06.Net Core WebApi部署到Windows服務(wù)器上的步驟
這篇文章主要介紹了.Net Core WebApi部署到Windows服務(wù)器上的步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03C#實現(xiàn)HTTP協(xié)議迷你服務(wù)器(兩種方法)
用C#語言實現(xiàn)HTTP協(xié)議的服務(wù)器類本文將以兩種稍微有差別的方式用C#語言實現(xiàn);要完成高性能的Web服務(wù)功能,通常都是需要寫入到服務(wù),如IIS,Apache Tomcat感興趣的朋友可以了解下,或許對你學習c#有所幫助2013-02-02