【问题标题】:.NET CORE WEB API accept list of integers as an input param in HTTP GET API.NET CORE WEB API 接受整数列表作为 HTTP GET API 中的输入参数
【发布时间】:2020-10-29 18:40:26
【问题描述】:

我正在使用 .net core 3+ web api。

下面是我的操作如下所示,它使用 HTTP GET,我想传递几个字段,其中一个字段是整数列表。

[HttpGet]
[Route("cities")]
public ActionResult<IEnumerable<City>> GetCities([FromQuery] CityQuery query)
{...}

这里是CityQuery 类-

public class CityQuery
{
    [FromQuery(Name = "stateids")]
    [Required(ErrorMessage = "stateid is missing")]
    public string StateIdsStr { get; set; }

    public IEnumerable<int> StateList    
    {
        get
        {
            if (!string.IsNullOrEmpty(StateIdsStr))
            {
                var output = StateIdsStr.Split(',').Select(id =>
                {
                    int.TryParse(id, out var stateId);
                    return stateId;
                }).ToList();
                return output;
            }
            return new List<int>();
        }
    }
}

有没有一种通用的方法可以用来接受整数列表作为输入而不接受字符串然后解析它?

或者有更好的方法吗?我尝试谷歌搜索,但找不到太多。提前致谢。

【问题讨论】:

  • 在查询参数中传递值数组没有约定。每种语言和框架都使用自己的约定。你试过[FromUri] int[] stateList 吗?你想如何传递这些参数?
  • ASP.NET Core 的约定是允许多个参数实例,例如ids=1&amp;ids=2&amp;ids=3 并将它们绑定到单个ids 数组

标签: asp.net-core asp.net-core-webapi asp.net-core-3.1


【解决方案1】:

我认为您只需要在 int 数组参数之前使用 [FromUri]

public ActionResult<IEnumerable<City>> GetCities([FromUri] int[] stateList)

请求会是这样的:

/cities?stateList=1&stateList=2&stateList=3 

【讨论】:

  • 我要传递 stateids=1,2,3
  • @YasserShaikh 这是一个名为stateids 的字符串参数,其值为1,2,3。在查询参数中传递值数组没有约定
  • 你可以看看这个帖子:stackoverflow.com/questions/9584573/…
【解决方案2】:

这会有所帮助

    [HttpGet]
    [Route("cities")]
    public ActionResult<IEnumerable<City>> GetCities([FromQuery] int[] stateids)
    {
        ...
    }

但查询字符串将更改为 https://localhost/api/controller/cities?stateids=1&stateids=2&stateids=3

如果您需要逗号分隔的整数查询字符串,您可以使用自定义模型绑定器

https://docs.microsoft.com/en-us/aspnet/core/mvc/advanced/custom-model-binding?view=aspnetcore-3.1

【讨论】:

    【解决方案3】:

    您可以使用自定义模型绑定,下面是一个工作演示:

    型号:

    public class CityQuery
    {
        public List<int> StateList{ get; set; }
    }
    

    CustomModelBinder:

    public class CustomModelBinder: IModelBinder
    {
        public Task BindModelAsync(ModelBindingContext bindingContext)
        {
            if (bindingContext == null)
            {
                throw new ArgumentNullException(nameof(bindingContext));
            }
    
            var values = bindingContext.ValueProvider.GetValue("stateids");
    
            if (values.Length == 0)
            {
                return Task.CompletedTask;
            }
    
            var splitData = values.FirstValue.Split(',');
            var result = new CityQuery()
            {
                StateList = new List<int>()
            };
    
            foreach(var id in splitData)
            {
                result.StateList.Add(int.Parse(id));
            }
            bindingContext.Result = ModelBindingResult.Success(result);
            return Task.CompletedTask;
        }
    }
    

    在 Action 方法上应用 ModelBinding 属性:

    [HttpGet]
    [Route("cities")]
    public ActionResult GetCities([ModelBinder(BinderType = typeof(CustomModelBinder))] CityQuery query)
    {
        return View();
    }
    

    当url为/cities?stateids=1,2,3时,stateids将填充到StateList

    【讨论】:

    • 嗨@Yasser Shaikh,这个答案可以帮助您解决问题吗?
    猜你喜欢
    • 1970-01-01
    • 2020-11-06
    • 2023-03-05
    • 1970-01-01
    • 2015-05-28
    • 2018-05-23
    • 1970-01-01
    • 2019-03-12
    相关资源
    最近更新 更多