可选列表参数在未在 Web API 中的查询字符串中传递时以实例化形式传入

本文关键字:实例化 字符串 参数 列表 Web API 查询 | 更新日期: 2023-09-27 17:55:41

我的 Web API 方法如下所示:

[HttpGet]
public IList<Product> Get(List<int> categoryIds = null)
{
    IList<Product> prods = _productService.GetProducts(categoryIds);
    return prods;
}

为什么当我简单地调用没有查询字符串参数类别 Id 的 api/产品时,它不会显示为空?相反,它的计数为 0

可选列表参数在未在 Web API 中的查询字符串中传递时以实例化形式传入

操作

List<int> categoryIds) 所需的对象使用其默认构造函数实例化,然后模型绑定在 URL 中查找匹配项以填充它。由于模型绑定没有找到任何参数来进一步放入List<int>,它只是新的。

从 MVC 模型绑定:

为了使绑定发生,类必须具有公共默认构造函数,并且要绑定的成员必须是公共可写属性。当模型绑定发生时,类将仅使用公共默认构造函数实例化,然后可以设置属性。

对于这些类型(如"集合"类型),模型绑定会查找与 parameter_name[index] 或仅 [index] 的匹配项。

您可以将列表包含在复杂对象中,并在操作中接受该对象:

public class Request
{
    public List<int> categoryIds { get; set; }
}

然后在控制器操作中:

[Route("api/[controller]")]
public class ValuesController : Controller
{
    // GET api/values
    [HttpGet]
    public IEnumerable<int> Get(Request request)
    {
        return request.categoryIds;
    }
}

那么您的请求将是:

/api/values?categoryIds[0]=0&categoryIds[1]=1