当参数直接定义为方法参数而不是模型时,IHttpActionResult 结果无法绑定请求正文参数

IHttpActionResult result fail to bind request body parameter when parameters are defined directly as methods arguments instead of a model

当我将一组 Guid 作为参数直接放在我的网络 api 操作结果中时,它没有找到请求正文中的任何我的 guid 并绑定它们,例如

[HttpPost]
public IHttpActionResult AddStores([FromBody]Guid[] Ids)
{
   ...            
}

ids 以 null 形式出现,尽管我确实将 ids 作为 guid 数组包含在我的请求正文中。

只有当我将 id 放入模型中时,模型绑定器才会真正在请求正文中找到我的 id。

例如

public class AddStoresRequest
{
    public Guid[] Ids { get; set; }
}


[HttpPost]
public IHttpActionResult AddStoreUser(AddStoresRequest request)
{
     ...            
}

在这种情况下,它确实找到了正确的 ID。为什么会出现这种异常?当我直接在我的方法参数中使用 ID 作为参数时,为什么模型联编程序会失败?

我在构建请求时不使用模型...我只是在请求正文中放入一个名为 IDs 的数组。

默认情况下,当 Guid[] ID 添加到请求时,您的 json 序列化程序将其映射到如下所示:

{
   "Ids":["58b84557-1899-4354-b5ac-1d97c2b95e1b", "db7106d7-ba8a-44cc-b34d-90bec9b2ca3f"]
}

这就是为什么你必须使用第二个动作实现。

如果您想使用第一个实现,您必须在正文中发送这样的内容:

["58b84557-1899-4354-b5ac-1d97c2b95e1b", "db7106d7-ba8a-44cc-b34d-90bec9b2ca3f"]

您必须使用自定义序列化或 JArray 来实现此目的。