如何将 int 数组 (int[]) 传递给 ASP.NET Core 中的 Get 方法

问题描述 投票:0回答:2

如何在 ASP.NET Core 中将

int[]
传递给
HttpGet
方法? (不作为查询参数!)

我发现的每篇文章都讨论查询参数,但查询参数不是必需的。

我想要这样的东西:

[HttpGet("List/{ids}")]
public async Task<ActionResult<ViewItemModel[]>> List(int[] ids)

但是 ids 是空数组。我用 url 调用控制器方法:

http://localh.../List/2062,2063,2064
.
Swagger(Swashbuckle)调用方法一模一样。

我找到了这篇文章,但它已经有 5 年历史了,而且不适用于 ASP.NET Core。

c# asp.net-core asp.net-core-webapi
2个回答
3
投票

所有功劳或多或少都归功于恩科西的回答这里

public class EnumerableBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (!typeof(IEnumerable<int>).IsAssignableFrom(bindingContext.ModelType))
            throw new OpPISException("Model is not assignable from IEnumerable<int>.");

        var val = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (val == null)
            throw new NullReferenceException();

        var ids = val.Values.FirstOrDefault();
        if (ids == null)
            throw new NullReferenceException();

        var tokens = ids.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
        if (tokens.Length > 0)
        {
            try 
            {
                var clientsId = tokens.Select(int.Parse);
                object model = null;
                if (bindingContext.ModelType.IsArray)
                {
                    model = clientsId.ToArray();
                }
                else if (bindingContext.ModelType == typeof(HashSet<int>))
                {
                    model = clientsId.ToHashSet();
                }
                else
                {
                    model = clientsId.ToList();
                }                        
                bindingContext.ModelState.SetModelValue(bindingContext.ModelName, model);
                bindingContext.Result = ModelBindingResult.Success(model);
                return Task.CompletedTask;
            }
            catch {
                //...
            }
        }

        //If we reach this far something went wrong
        bindingContext.ModelState.TryAddModelError(bindingContext.ModelName, "Cannot convert.");
        bindingContext.Result = ModelBindingResult.Failed();
        return Task.CompletedTask;
    }
}

使用案例:

[HttpGet("List/{ids}")]
public async Task<ActionResult<ViewItemModel[]>> List([ModelBinder(typeof(EnumerableBinder))]HashSet<int> ids)
{
    //code
}

稍微反思一下,这可以更改为使用其他类型,然后

int


0
投票

解决了 FromQuery 属性的类似问题:

List([FromQuery] int[] ids)

并调用api如下:

List?ids=1&ids=2
© www.soinside.com 2019 - 2024. All rights reserved.