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

时间:2018-07-25 10:18:26

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

如何在ASP.NET Core中将int[]传递给HttpGet方法? (不作为查询参数!)

我发现的每个帖子都涉及查询参数,但是不需要查询参数。

我想要这样的东西:

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

但是id是空数组。我用网址http://localh.../List/2062,2063,2064调用控制器方法。
Swagger(Swashbuckle)调用方法完全相同。

我发现了this post,但是它已经有5年历史了,而不是ASP.NET Core。

1 个答案:

答案 0 :(得分:2)

所有功劳或多或少都归功于Nkosi的答案here

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之后的其他类型。