ASP.NET Core MVC獲取請(qǐng)求的參數(shù)方法示例
前言
一次HTTP請(qǐng)求,就是一次標(biāo)準(zhǔn)IO操作。請(qǐng)求是I,是輸入;響應(yīng)式O,是輸出。任何web開(kāi)發(fā)框架,其實(shí)都是在干這兩件事:
- 接受請(qǐng)求并進(jìn)行解析獲取參數(shù)
- 根據(jù)參數(shù)進(jìn)行渲染并輸出響應(yīng)內(nèi)容
所以我們學(xué)習(xí)一個(gè)框架,我認(rèn)為最首要的是知道如何從請(qǐng)求中獲取參數(shù)。http請(qǐng)求攜帶參數(shù)的地方主要有下面幾個(gè)地方:
- URL
- Header
- Body
下面看看ASP.NET Core是如何從這幾個(gè)位置獲取參數(shù)的。
通過(guò)URL獲取參數(shù)
通過(guò)URL傳參是HTTP最最常用的辦法。這里簡(jiǎn)單介紹下URL相關(guān)的知識(shí)。一個(gè)URL主要分成4個(gè)部分,以http://localhost:5000/fromurl/test?name=mjzhou&age=10為例:
| http:// | 協(xié)議 |
| localhost:5000 | 主機(jī)地址 |
| /fromurl/test | PATH |
| name=mjzhou&age=10 | QueryString |
我們通常使用PATH跟QueryString來(lái)傳遞參數(shù)。新建一個(gè)MVC項(xiàng)目,新建一個(gè)Controller名為FromUrlController,通過(guò)幾個(gè)Action來(lái)演示如何從URL上獲取參數(shù)。
通過(guò)QuerySting獲取參數(shù)
Request.Query對(duì)象
// /fromurl/test?name=mjzhou
public IActionResult Test()
{
var name = Request.Query["name"];
return Content(name);
}
Request.Query對(duì)象包含了本次請(qǐng)求的QueryString的鍵值對(duì)列表,所以可以通過(guò)它輕松獲取QueryString上攜帶的參數(shù)。
自動(dòng)參數(shù)綁定
// /fromurl/test?name=mjzhou
public IActionResult Test1(string name)
{
return Content(name);
}
如果Action的型參的名稱跟QueryString的Key一致,則MVC框架會(huì)自動(dòng)幫我們綁定參數(shù)的值,不用手動(dòng)獲取。
public IActionResult Test2([FromQuery(Name = "id")]string bh)
{
return Content(bh);
}
如果參數(shù)綁定的名稱跟QueryString的Key不一致,可以使用FromQueryAttribute強(qiáng)制指定綁定的Key的名稱。
通過(guò)PATH獲取參數(shù)
Request.Path對(duì)象
// /fromurl/test3
public IActionResult Test3()
{
var path = Request.Path;
return Content(path);
}
Request.Path對(duì)象包含了本次http請(qǐng)求的Path的原始信息,一般可以通過(guò)/來(lái)分隔,手工獲取想要的參數(shù)。
自動(dòng)參數(shù)綁定
// /fromurl/Test4/mjzhou/1000
[Route("FromUrl/test4/{name}/{id}")]
public IActionResult Test4(string name, int id)
{
return Content($"{name}/{id}");
}
Path的自動(dòng)參數(shù)綁定,需要配合RouteAttribute實(shí)現(xiàn),RouteAttribute主要是指定一個(gè)Path的模板,通過(guò)這個(gè)模板可以告訴路由是否匹配這個(gè)Action,另外一個(gè)就是可以告訴參數(shù)綁定,如何解析這個(gè)path實(shí)現(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強(qiáng)制指定解析的名稱。
[HttpGet("FromUrl/test5/{name}/{id}")]
public IActionResult Test5(string name, int id)
{
return Content($"{name}/{id}");
}
HttpGetAttribute、HttpPostAttribute等attribute同樣可以完成RouteAttribute的效果,而且還指定了action接受的HTTP Method的方法,可以說(shuō)是加強(qiáng)版的RouteAttribute。
從Header上獲取參數(shù)
添加一個(gè)FromHeaderController,通過(guò)幾個(gè)action來(lái)演示如果從http headers上獲取參數(shù)。
Request.Headers對(duì)象
// /FromHeader/test
public IActionResult Test()
{
var myName = Request.Headers["myName"];
return Content(myName);
}
Request.Headers是一個(gè)字典,包含了本次請(qǐng)求的Headers。所以我們可以通過(guò)Request.Headers對(duì)象輕松獲取某個(gè)header的值。
自動(dòng)參數(shù)綁定
public IActionResult Test1([FromHeader]string myName)
{
return Content(myName);
}
通過(guò)在action的型參上打上FromHeaderAttribute,可以告訴框架自動(dòng)從header獲取參數(shù)。
public IActionResult Test2([FromHeader(Name = "myName")]string name)
{
return Content(name);
}
如果action的型參跟header的key值不一致,可以通過(guò)FromHeaderAttribute強(qiáng)制指定匹配的header的key值。
從Body獲取參數(shù)
我們開(kāi)發(fā)的時(shí)候經(jīng)常通過(guò)表單提交數(shù)據(jù),或者通過(guò)AJAX往后臺(tái)提交一個(gè)JavaScript對(duì)象,本質(zhì)上這些數(shù)據(jù)都是通過(guò)HTTP的Bady提交回去的。新建一個(gè)FromBodyController控制器,通過(guò)幾個(gè)Action來(lái)演示如何獲取Body的參數(shù)。
Request.Body對(duì)象
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是一個(gè)Stream,保存了本次請(qǐng)求的body數(shù)據(jù)。所以我們只要把這個(gè)stream讀出來(lái),就能獲取提交的數(shù)據(jù)。有了原始的數(shù)據(jù),就可以通過(guò)反序列化等操作轉(zhuǎn)換為模型,更簡(jiǎn)單的獲取參數(shù)了。注意,ASP.NET Core想要讀取這個(gè)對(duì)象,必須先調(diào)用Request.EnableBuffering()這個(gè)方法。
使用postman測(cè)試一下:
參數(shù)自動(dòng)綁定
public IActionResult Test1([FromBody]model1 model)
{
return Content(model.NAME);
}
使用FromBodyAttribute可以把body的數(shù)據(jù)自動(dòng)反序列化成型參的模型。但是請(qǐng)注意使用[FromBody]請(qǐng)求的Content-Type必須是application-json。
使用postman測(cè)試下:
public IActionResult Test2([FromForm]model1 model)
{
return Content(model.NAME);
}
使用FromFormAttribute可以把body的數(shù)據(jù)自動(dòng)反序列化成型參的模型。但是請(qǐng)注意使用[FromForm]請(qǐng)求的Content-Type必須是application/x-www-form-urlencoded。
總結(jié)
ASP.NET Core獲取請(qǐng)求參數(shù)主要從URL,Headers,Body等位置獲取。我們可以通過(guò)Request.Query、Request.Headers、Request.Body來(lái)手工獲取數(shù)據(jù)。也可以通過(guò)[FromQuery]、[FromHeader]、[Frombody]等Attribute來(lái)實(shí)現(xiàn)參數(shù)的自動(dòng)綁定。
好了,到此這篇關(guān)于ASP.NET Core MVC獲取請(qǐng)求的參數(shù)的文章就介紹到這了,更多相關(guān)ASP.NET Core MVC獲取請(qǐng)求參數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
.NET實(shí)現(xiàn)微信公共平臺(tái)上傳下載多媒體文件
這篇文章主要介紹了.NET實(shí)現(xiàn)微信公共平臺(tái)上傳下載多媒體文件的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-07-07
asp.net GridView控件中實(shí)現(xiàn)全選的解決方案
在GridView中我們經(jīng)常要利用復(fù)選按鈕實(shí)現(xiàn)全選的功能,下面針對(duì)這一解決方案做以總結(jié)2010-03-03
VS2015 IIS Express無(wú)法啟動(dòng)的解決方法
這篇文章主要介紹了VS2015 IIS Express無(wú)法啟動(dòng)的解決方法 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
asp.net中Null在從數(shù)據(jù)庫(kù)讀取的時(shí)候的一點(diǎn)點(diǎn)小技巧
我們先看下面的一段代碼,這段代碼其實(shí)很平常,也是我們平時(shí)做項(xiàng)目很常用的一段2012-04-04
Sqlite 常用函數(shù)封裝提高Codeeer的效率
以下是頻繁用到的Sqlite函數(shù),內(nèi)容格式相對(duì)固定,封裝一下有助于提高開(kāi)發(fā)效率^_^至少提高Codeeer的效率了2012-12-12
.net生成縮略圖及水印圖片時(shí)出現(xiàn)GDI+中發(fā)生一般性錯(cuò)誤解決方法
這篇文章主要介紹了.net生成縮略圖及水印圖片時(shí)出現(xiàn)GDI+中發(fā)生一般性錯(cuò)誤解決方法 ,需要的朋友可以參考下2014-11-11
asp.net網(wǎng)站安全從小做起與防范小結(jié)
我是做asp.net網(wǎng)站開(kāi)發(fā)的,QQ群里一個(gè)網(wǎng)友的站被掛馬了。他說(shuō)讓我寫(xiě)點(diǎn)安全方面的文章。我就介紹下我的經(jīng)驗(yàn)吧,各位大牛不要拿磚頭砸我。。。2008-09-09
asp.net Repeater取得CheckBox選中的某行某個(gè)值的c#寫(xiě)法
asp.net(c#)利用Repeater取得CheckBox選中行的某個(gè)值的代碼2008-08-08
ASP.NET XmlHttp跨域訪問(wèn)實(shí)現(xiàn)代碼
最近項(xiàng)目需要實(shí)現(xiàn)XmlHttp的POST方法到另一服務(wù)器上的頁(yè)面進(jìn)行數(shù)據(jù)的更新,可是IE會(huì)提出“該頁(yè)正在訪問(wèn)其控制范圍之外的信息,是否繼續(xù)?”等警告信息,而在其他瀏覽器上直接禁止掉,GOOGLE一下原來(lái)是XmlHttp的跨域訪問(wèn)問(wèn)題,找了很多資料,說(shuō)是提供很多解決方案,可是都沒(méi)有用處。2008-11-11






