3 回答
TA贡献1801条经验 获得超8个赞
您可以List<string>在方法头中使用 a ,然后根据您的规则将其加载到 HashSet 中:
public GetPeople([FromQuery] List<string> names)
{
var hashed = new HashSet<string>(names, StringComparer.OrdinalIgnoreCase);
}
作为替代方案,您可以查看自定义模型绑定,但只有在多个地方需要它时才值得付出努力。
TA贡献1946条经验 获得超3个赞
您可以使用HashSet<string>设置为始终使用的导数StringComparer.OrdinalIgnoreCase:
// Case Insensitive String HashSet, or CIStringSet for short.
public class CIStringSet : HashSet<string>
{
public CIStringSet() : base(StringComparer.OrdinalIgnoreCase)
{
}
}
使用它非常简单,如下所示:
public object GetPeople([FromQuery] CIStringSet names)
{
return Json(names);
}
经过测试,它有效:
TA贡献1844条经验 获得超8个赞
一个完全没有错误处理的静态解决方案,但有效的是以下
粘合剂:
public Task BindModelAsync(ModelBindingContext bindingContext)
{
var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
bindingContext.ModelState.SetModelValue(bindingContext.ModelName, valueProviderResult);
var values = valueProviderResult.Values.Select(value => value).ToHashSet(StringComparer.OrdinalIgnoreCase);
bindingContext.Result = ModelBindingResult.Success(values);
return Task.CompletedTask;
}
端点:
[HttpGet]
public IActionResult Test([ModelBinder(typeof(HashSetBinder))] IEnumerable<string> values)
{
return Ok(new
{
values
});
}
然后像这样打开网址:
http://localhost:5000/api/mycontroller?values=1&values=1&values=1&values=2
结果将是 {"values":["1","2"]}
这可以通过模型绑定提供程序全局注册,但为此它需要实现更多检查。
- 3 回答
- 0 关注
- 169 浏览
添加回答
举报