首页 > 解决方案 > 为模型绑定到集合类型指定相等比较器

问题描述

我有一个 API,您可以在其中指定要获取的名称列表。不允许重复名称,如果两个名称仅在大小写上有所不同,则它们被视为重复名称。

GET /api/people?names=john&names=alice

在我自己的 .NET 代码中,我将HashSet使用自定义相等比较器收集所有这些名称。

var names = new HashSet<string>(StringComparer.OrdinalIgnoreCase);

但我认为 ASP.NET Core 模型绑定不够灵活。

// GET /api/people?names=john&names=JOHN
[HttpGet("api/people")]
public GetPeople([FromQuery] HashSet<string> names)
{
    // this works but names contains both john and JOHN
}

我必须更改什么以使该names集合仅包含 john 而不是 JOHN?

标签: c#asp.net-coremodel-binding

解决方案


您可以List<string>在方法头中使用 a ,然后根据您的规则将其加载到 HashSet 中:

public GetPeople([FromQuery] List<string> names)
{
    var hashed = new HashSet<string>(names, StringComparer.OrdinalIgnoreCase);
}

作为替代方案,您可以查看自定义模型绑定,但只有在多个地方需要它时才值得付出努力。


推荐阅读