【问题标题】:Comma Separated Values on a Net 6 Minimal Api parameterNet 6 Minimal Api 参数上的逗号分隔值
【发布时间】: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&amp;id=3&amp;id=5
  • 无法重现。 .Cast&lt;T&gt;() 也不起作用,因为您不能将 string 转换为 int
  • @Crowcoder 我知道。但是我的端点方法中的参数类型是什么? int 数组?
  • 为什么不在一个参数中发送所有逗号分隔值并使用自定义模型绑定器来填充列表?

标签: c# asp.net-core .net-6.0


【解决方案1】:

根据this section,所以我在我这边测试你的代码:

请注意这一行var trimmedValue = value?.TrimStart('(').TrimEnd(')');CommaSeparatedValues&lt;string&gt; postsIds。根据我的测试,我发现使用CommaSeparatedValues&lt;Int32&gt; postsIds 时会出现以下错误消息,因为它无法成功执行.Cast&lt;T&gt;()

app.MapGet("posts", (CommaSeparatedValues<string> postsIds) => {
    return postsIds;
});

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)
    {
        {
            // Format is "(12.3,10.1)"
            var trimmedValue = value?.TrimStart('(').TrimEnd(')');
            IEnumerable<T>? values = trimmedValue?.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).Cast<T>();

            if (values is null)
            {
                commaSeparatedValues = null;
                return false;
            }

            commaSeparatedValues = new CommaSeparatedValues<T> { Values = values };
            return true;
        }
    }
}

顺便问一下,你能接受用这个代替吗?

app.MapGet("posts", async ([FromQuery(Name = "postsIds")] string postsIds) =>
{
    List<string> list = postsIds.Split(",").ToList(); 
    return postsIds;
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多