簡體   English   中英

Asp.net Core 3.1 綁定:在 GET 中使用字典作為參數的操作

[英]Asp.net Core 3.1 Binding: Action with a Dictionary as parameter in GET

我們正在定義一個動作,用於搜索存儲在存儲庫中的文檔; 該界面允許指定過濾器列表以縮小結果范圍。

[Route("search")]
        [HttpGet]
        [ProducesResponseType(typeof(List<DocumentDto>), (int)HttpStatusCode.OK)]
        public async Task<ActionResult<DocumentDto>> GetDocuments(
        [FromServices] IDocumentManager documentManager,
        [FromQuery] Dictionary<string, string> filters)
        {
            //Do something
        }

我們在動作簽名中使用像Dictionary<string, string> filters這樣的參數Dictionary<string, string> filters因為我們想使用 GET 方法實現搜索,但使用動態參數列表。
過濾器只是一個key:value對象列表,操作將傳遞給數據庫,這是唯一知道如何處理它們的層。
我們使用調用 url 的服務,如下所示:

  /search?filter1=value1&filter2=value2&filter3=value3

綁定似乎“有效”, filters填充了如下內容:

filters
[0] {[filter1, value1]}
[1] {[filter2, value2]}
[2] {[filter3, value3]}

檢查與字典相關的綁定章節,似乎沒有記錄我們正在執行的查詢字符串中傳遞的參數。

我們是否看到了具有約束力的副作用?
我們用於將過濾器從查詢字符串傳遞到字典的語法是否受支持?

使用這樣的綁定或多或少有點問題。 控制器上的字典正在捕獲所有查詢參數,例如,如果您的查詢字符串是:

/search?filter1=value1&filter2=value2&filter3=value3&random=randomValue

你會在字典中看到:

filters
[0] {[filter1, value1]}
[1] {[filter2, value2]}
[2] {[filter3, value3]}
[3] {[random, randomValue]}

當 ASP.NET Core 為參數的模型綁定創建上下文時,模型名稱來自以下來源之一

  1. 顯式名稱(例如[FromQuery(Name = ...)]
  2. 來自值提供者(在本例中為QueryStringValueProvider

在您的示例中,以上都不正確,因此綁定上下文中的模型名稱將為空。 這將導致DictionaryModelBinder將查詢字符串中的任意參數填充到字典中。

我建議根據您引用的文檔修復您的查詢字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM