.NET CORE WEB API 接受整数列表作为 HTTP GET API 中的输入参数

Yas*_*ser 4 asp.net-core asp.net-core-webapi asp.net-core-3.1

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

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

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

这是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>();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Ana*_*and 9

这可以帮助

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

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

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

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


mj1*_*313 5

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

模型:

public class CityQuery
{
    public List<int> StateList{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)

自定义模型绑定器:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在 Action 方法上应用 ModelBinding 属性:

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

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