我使用 ASP.NET 5 LinkGenerator 类的 GetPathByAction 方法为我的 Controller 操作创建链接。一般来说,这工作得很好,但我刚刚遇到了它创建错误查询参数的情况。在本例中,我传入查询参数并使用当前 Controller 和操作:
GetPathByAction(httpContextAccessor.HttpContext, null, null, values);
values
这是一个有几个成员的对象,有问题的是 MyDict
成员是 Dictionary<string,string>
一键“foo”,值为“bar”。
调用此端点时的查询字符串如下所示:
/myEndpoint?page=1&myDict[foo]=bar
这由模型绑定(bind)正确处理,我使用 myDict 字典和正确的值获取对象。当我现在尝试修改页面参数并使用 GetPathByAction 生成新 URL 时,我会得到以下输出:
/myEndpoint?page=2&myDict=[foo, bar]
输出是 URL 编码的,我在这里对其进行了解码,以便于阅读。对我来说,这个输出似乎是完全错误的,它将字典视为一个数组(即使如此,这也不是在模型绑定(bind)中处理数组的方式)。
我的期望是 ASP.NET Url 生成函数的工作方式与模型绑定(bind)相同。如果 ASP.NET 可以理解 URL 中的参数,它应该能够再次从该参数生成有效的 URL。
我在这里做错了什么还是这是一个错误?是否有其他方法可以为具有可以处理字典参数的特定参数的 Controller 操作生成 URL?
最佳答案
我认为将所有参数捕获到字典中(开箱即用支持)的最简单解决方案如下。
假设您的 GET 方法签名如下所示:
public IActionResult Get(int page, [FromQuery] Dictionary<string,string> mydict)
然后,如果您像这样调用此端点:
/yourController?page=1&prop1=string1&prop2=string2&prop3=string3
- 您的
page
参数将包含1 - 您的
mydict
参数将有 4 个键值对“页面”:“1”
“prop1”:“string1”
"prop2":"string2"
“prop3”:“string3”
您可以通过调用以下命令简单地删除额外的 key :
if(mydict.ContainsKey(nameof(page))) mydict.Remove(nameof(page));
您可以将字典作为已格式化的查询字符串传递给 GetPathByAction
:
var mydictAsQueryString = string.Join("&", mydict.Select(_ => $"{_.Key}={_.Value}"));
有几个内置的帮助器类(例如QueryHelpers
、QueryBuilder
、HttpUtility
等),但我发现这个片段非常简单并且易于在任何地方使用。
关于c# - GetPathByAction 为 Dictionary<string,string> 创建错误的查询参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69032534/