我正在使用ASP.NET 5 LinkGenerator類的GetPathByAction方法來為我的控制器動作創建鏈接。這在一般情況下效果很好,但我剛剛遇到了一個情況,它創建的查詢引數不好。在這種情況下,我傳入了查詢引數,并使用了當前的控制器和動作:
GetPathByAction(httpContextAccessor.HttpContext, null, null, values) 。
values這里有一個物件,它有幾個成員,有問題的是MyDict成員,它是一個Dictionary<string,string>,有一個鍵 "foo",值是 "bar"。
當我呼叫這個端點時,查詢字串類似于以下內容:
/myEndpoint?page=1& myDict[foo]=bar
這被模型系結正確處理了,我得到了帶有 myDict 字典和適當值的物件。當我現在嘗試修改頁面引數并使用 GetPathByAction 生成一個新的 URL 時,我從它那里得到了以下輸出:
。/myEndpoint?page=2& myDict=[foo, bar]
輸出是URL編碼的,我在這里對其進行了解碼,使之更容易閱讀。對我來說,這個輸出似乎根本就是錯誤的,它把字典當成了陣列(即使如此,這也不是模型系結中處理陣列的方式)。
我在這里的期望是,ASP.NET Url 生成函式將以與模型系結相同的方式作業。如果 ASP.NET 能夠理解來自 URL 的引數,它應該能夠再次從該引數生成有效的 URL。
我是不是做錯了什么,或者這是個錯誤?是否有其他方法可以為帶有特定引數的控制器動作生成URL,可以處理字典引數?
uj5u.com熱心網友回復:
我認為最簡單的解決方案是將所有的引數捕獲到一個字典中(開箱即支持),如下所示。
我們假設你的GET方法簽名是這樣的:
public IActionResult Get(int page, [FromQuery] Dictionary< string,string> mydict)
那么如果你像這樣呼叫這個端點:
/yourController?page=1& prop1=string1& prop2=string2& prop3=string3
- 你的
page引數將包含1 。
- 你的
mydict引數將有4個鍵值對 "page": "1""prop1": "string1"/code>"prop2": "string2"<
"prop3": "string3"/code>
你可以通過呼叫以下內容來簡單地擺脫額外的鍵:
你可以通過呼叫以下內容來簡單地擺脫額外的鍵。
if(mydict.ContainsKey(nameof(page))) mydict.Remove(nameof(page)) 。
你可以把字典傳給你的朋友,讓他們來處理。
你可以把字典傳遞給GetPathByAction作為一個已經格式化的查詢字串:
var mydictAsQueryString = string. Join("&", mydict.Select(_ => $"{_.Key}={_.Value}") 。)
有幾個內置的輔助類(如QueryHelpers,QueryBuilder,HttpUtility,等等),但我發現這個片段相當簡單,而且容易在任何地方使用。
uj5u.com熱心網友回復:
在這種情況下,MVC對集合的系結確實顯得有些奇怪。
用于字典型別的系結提供者,擴展了系結簡單集合的行為,如List<KeyPair<K,V>>。每個元素都被一個特殊的KeyPair<K,V>binder系結。在通過Linq將該集合轉換為一個字典之前。
然后字典系結器將尋找額外的 prefix[Key]=Value 或 prefix.Key=Value values.
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/319554.html
標籤:
下一篇:無法將分支部署到Heroku
