c# - GetPathByAction 为 Dictionary<string,string> 创建错误的查询参数

标签 c# asp.net-core url .net-core

我使用 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}"));

有几个内置的帮助器类(例如QueryHelpersQueryBuilderHttpUtility等),但我发现这个片段非常简单并且易于在任何地方使用。

关于c# - GetPathByAction 为 Dictionary<string,string> 创建错误的查询参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69032534/

相关文章:

html - 将引用 SVG 图像嵌入 HTML 文件

java - 通过Jsoup下载的网页源不等于实际网页源

c# - CustomValidator 不调用 javascript

c# - .net core 2.2 中初始化设置的正确方法?

c# - 只读输入属性和 [Required] 数据注释的验证错误

c# - Net 核心 Web 应用程序中不同端口的健康检查

url - 用于替换部分 URL 的用户脚本

c# - 如何明智地在 C# 中存储大量序列化的二进制文件?

c# - 将图像转换为位图会使背景变黑

c# - 如何使用 .NET Core Web 应用程序分发数据保护 key ?