【发布时间】:2022-01-13 14:52:28
【问题描述】:
使用 Net 6 Minimal API 我有以下路线:
builder.MapGet("posts", async ([FromQuery] IEnumerable<Int32> postsIds) => {
});
参数postsIds 包含要加载的帖子的ids,例如“1, 3, 5”。
运行应用程序时出现以下错误:
抛出异常:Microsoft.AspNetCore.Http.Extensions.dll 中的“System.InvalidOperationException”:“没有为 postsIds 找到公共静态 bool IEnumerable.TryParse(string, out IEnumerable) 方法。
所以我创建了以下内容:
public class CommaSeparatedValues<T> {
public IEnumerable<T> Values { get; set; } = new List<T>();
public static Boolean TryParse(String? value, IFormatProvider? provider, out CommaSeparatedValues<T>? commaSeparatedValues) {
IEnumerable<T>? values = value?.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).Cast<T>();
if (values is null) {
commaSeparatedValues = null;
return false;
}
commaSeparatedValues = new CommaSeparatedValues<T> { Values = values };
return true;
}
并将端点更改为:
builder.MapGet("posts", async ([FromQuery] CommaSeparatedValues<Int32> postsIds) => {
});
这有意义吗?我可以改进/简化这种方法吗?还是这样?
【问题讨论】:
-
不知道你喜不喜欢这种方法,但是如果你重复查询参数,它们会以数组的形式进入控制器:
?id=1&id=3&id=5 -
无法重现。
.Cast<T>()也不起作用,因为您不能将string转换为int。 -
@Crowcoder 我知道。但是我的端点方法中的参数类型是什么? int 数组?
-
为什么不在一个参数中发送所有逗号分隔值并使用自定义模型绑定器来填充列表?
标签: c# asp.net-core .net-6.0