ASP.NET Core MVC 如何獲取請求的參數

来源:https://www.cnblogs.com/kklldog/archive/2020/05/06/core-mvc-modelbind.html
-Advertisement-
Play Games

一次HTTP請求,就是一次標準IO操作。請求是I,是輸入;響應式O,是輸出。任何web開發框架,其實都是在乾這兩件事: + 接受請求併進行解析獲取參數 + 根據參數進行渲染並輸出響應內容 所以我們學習一個框架,我認為最首要的是知道如何從請求中獲取參數。http請求攜帶參數的地方主要有下麵幾個地方: ...


一次HTTP請求,就是一次標準IO操作。請求是I,是輸入;響應式O,是輸出。任何web開發框架,其實都是在乾這兩件事:

  • 接受請求併進行解析獲取參數
  • 根據參數進行渲染並輸出響應內容

所以我們學習一個框架,我認為最首要的是知道如何從請求中獲取參數。http請求攜帶參數的地方主要有下麵幾個地方:

  • URL
  • Header
  • Body
    下麵看看ASP.NET Core是如何從這幾個位置獲取參數的。

通過URL獲取參數

通過URL傳參是HTTP最最常用的辦法。這裡簡單介紹下URL相關的知識。一個URL主要分成4個部分,以http://localhost:5000/fromurl/test?name=mjzhou&age=10為例:

http:// 協議
localhost:5000 主機地址
/fromurl/test PATH
name=mjzhou&age=10 QueryString

我們通常使用PATH跟QueryString來傳遞參數。新建一個MVC項目,新建一個Controller名為FromUrlController,通過幾個Action來演示如何從URL上獲取參數。

通過QuerySting獲取參數

Request.Query對象

        // /fromurl/test?name=mjzhou
        public IActionResult Test()
        {
            var name = Request.Query["name"];
            return Content(name);
        }

Request.Query對象包含了本次請求的QueryString的鍵值對列表,所以可以通過它輕鬆獲取QueryString上攜帶的參數。

自動參數綁定

        // /fromurl/test?name=mjzhou
        public IActionResult Test1(string name)
        {
            return Content(name);
        }

如果Action的型參的名稱跟QueryString的Key一致,則MVC框架會自動幫我們綁定參數的值,不用手動獲取。

        public IActionResult Test2([FromQuery(Name = "id")]string bh)
        {
            return Content(bh);
        }

如果參數綁定的名稱跟QueryString的Key不一致,可以使用FromQueryAttribute強制指定綁定的Key的名稱。

通過PATH獲取參數

Request.Path對象

//      /fromurl/test3
        public IActionResult Test3()
        {
            var path = Request.Path;
            return Content(path);
        }

Request.Path對象包含了本次http請求的Path的原始信息,一般可以通過/來分隔,手工獲取想要的參數。

自動參數綁定

//      /fromurl/Test4/mjzhou/1000
        [Route("FromUrl/test4/{name}/{id}")]
        public IActionResult Test4(string name, int id)
        {
            return Content($"{name}/{id}");
        }

Path的自動參數綁定,需要配合RouteAttribute實現,RouteAttribute主要是指定一個Path的模板,通過這個模板可以告訴路由是否匹配這個Action,另外一個就是可以告訴參數綁定,如何解析這個path實現參數綁定。

        [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上獲取參數

添加一個FromHeaderController,通過幾個action來演示如果從http headers上獲取參數。

Request.Headers對象

        // /FromHeader/test
        public IActionResult Test()
        {
            var myName = Request.Headers["myName"];

            return Content(myName);
        }

Request.Headers是一個字典,包含了本次請求的Headers。所以我們可以通過Request.Headers對象輕鬆獲取某個header的值。

自動參數綁定

        public IActionResult Test1([FromHeader]string myName)
        {
            return Content(myName);
        }

通過在action的型參上打上FromHeaderAttribute,可以告訴框架自動從header獲取參數。

        public IActionResult Test2([FromHeader(Name = "myName")]string name)
        {
            return Content(name);
        }

如果action的型參跟header的key值不一致,可以通過FromHeaderAttribute強制指定匹配的header的key值。

從Body獲取參數

我們開發的時候經常通過表單提交數據,或者通過AJAX往後臺提交一個JavaScript對象,本質上這些數據都是通過HTTP的Bady提交回去的。新建一個FromBodyController控制器,通過幾個Action來演示如何獲取Body的參數。

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數據。所以我們只要把這個stream讀出來,就能獲取提交的數據。有了原始的數據,就可以通過反序列化等操作轉換為模型,更簡單的獲取參數了。註意,ASP.NET Core想要讀取這個對象,必須先調用Request.EnableBuffering()這個方法。
使用postman測試一下:
YiygVP.md.png

參數自動綁定

        public IActionResult Test1([FromBody]model1 model)
        {
            return Content(model.NAME);
        }

使用FromBodyAttribute可以把body的數據自動反序列化成型參的模型。但是請註意使用[FromBody]請求的Content-Type必須是application-json。
使用postman測試下:
Yica1e.md.png
Yicch8.md.png

        public IActionResult Test2([FromForm]model1 model)
        {
            return Content(model.NAME);
        }

使用FromFormAttribute可以把body的數據自動反序列化成型參的模型。但是請註意使用[FromForm]請求的Content-Type必須是application/x-www-form-urlencoded。
使用postman測試下:
Yigkge.md.png
YigeHI.md.png

總結

ASP.NET Core獲取請求參數主要從URL,Headers,Body等位置獲取。我們可以通過Request.Query、Request.Headers、Request.Body來手工獲取數據。也可以通過[FromQuery]、[FromHeader]、[Frombody]等Attribute來實現參數的自動綁定。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 以前一直想著有沒有一個方法能夠把字元串直接轉化成函數的,剛好有需求就找了下,還真有。 微軟地址:https://docs.microsoft.com/en-us/previous-versions/bb894665(v=msdn.10)?redirectedfrom=MSDN 一、安裝 NuGet程 ...
  • 綜述 .NET CORE 3.0開始,桌面端支持WPF了。很多.NET FRAMEWORK的項目已經跑了一陣子了,不是很有必要支持.NET CORE,不過最近用一個程式,為了貫徹一些C 8的特性,需要升級項目到.NET CORE 3.1。 方法 參考 "官方指導" ,需要這麼幾步: 1. 瞭解並更新 ...
  • vue+element部署 一.環境準備 1.因為Nginx依賴於gcc的編譯環境,所以,需要安裝編譯環境來使Nginx能夠編譯起來。 命令:yum install gcc-c++ 2.Nginx的http模塊需要使用pcre來解析正則表達式,需要安裝pcre。 命令:yum install -y ...
  • EFCore數據操作 ...
  • 0. 前言 這是C 基礎知識系列的最後一個內容講解篇,下一篇是基礎知識 實戰篇。這一篇主要講解一下C 程式的結構和主要編程工具。 1. 工具 工欲善其事必先利其器,在實際動手之前我們先來看看想要編寫一套C 程式需要做哪些準備吧。 1.1 選擇 C 的sdk在之前的某個時間點分為了三個方向: 1. . ...
  • 關於數據類型 c#的類型一般分為值類型和引用類型兩種, 值類型的變數包含類型的實例,值類型存放棧中 引用類型的變數包含對類型實例的引用,引用類型放在堆中,在棧中設置一個指針指向堆 值類型: 1.整數型數值:所有的整型數值類型均為值類型,可以用文本進行初始化,每個整型類型的預設值都是0,c#支持以下預 ...
  • 今年年初進了一家新公司,進入之後一邊維護老項目一邊瞭解項目流程,為了接下來的項目重做積累點經驗。 先說下老項目吧,.net fx 3.5+oracle...... 在實際維護中逐漸發現,老項目有標準版、定製版兩種,標準版就是一套代碼,粗略計算了下,全部版本加起來有20+個版本,如果項目重做後還是依照 ...
  • 環境和工具 服務端電腦IP:192.168.1.130 客戶端電腦IP:192.168.1.120 1、在服務端電腦運行 "IoTClientTool" 2、運行 "Wireshark" 3、在客戶端電腦運行 "IoTClientTool" 4、Wireshark得到如下報文 報文分析,plc的連接 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...