[英]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 為參數的模型綁定創建上下文時,模型名稱來自以下來源之一:
[FromQuery(Name = ...)]
QueryStringValueProvider
)在您的示例中,以上都不正確,因此綁定上下文中的模型名稱將為空。 這將導致DictionaryModelBinder將查詢字符串中的任意參數填充到字典中。
我建議根據您引用的文檔修復您的查詢字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.