当我需要使用带有多个参数的 POST 方法而不是单独的模型时?

Jos*_*man 5 c# model-binding asp.net-web-api

您能告诉我何时需要在 WebApi/MVC 应用程序中使用多个参数而不是单独的模型吗?

我有一个需要几个参数的操作。

[HttpPost]
public InfoViewModel GetInfo(IEnumerable<Guid> Ids, DocumentType type)
{
    // to do smth
}
Run Code Online (Sandbox Code Playgroud)

我也可以将此操作转换为以下内容:

[HttpPost]
public InfoViewModel GetInfo(RequestViewModel model)
{
   // to do smth
}
Run Code Online (Sandbox Code Playgroud)

我需要一个用于第二种情况的特殊模型。

public class RequestViewModel
{
    public IEnumerable<Guid> Ids { get; set; }
    public DocumentType DocumentType { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我以 JSON 格式将数据发送到服务器。您能告诉我这两种方法的优点和缺点吗?谢谢。

Siv*_*m K 4

ASP.NET Web API 和 MVC 将尝试为操作方法绑定参数,如下所示。

  1. 复杂类型参数(例如自定义类)
    • Web API - 默认情况下从请求正文绑定。但这仅限于一个参数,即 Web API 将使用 MediaTypeFormatter 简单来说是序列化器)将请求正文 JSON 绑定到仅一个复杂类型参数。这是因为Request Body默认存储在非缓冲流中,只能读取一次。剩余的复杂类型参数(如果有)只能通过将它们应用于参数来使用任何绑定属性(例如[FromUri]、[ModelBinder])进行绑定。
    • MVC - 从任何地方绑定,即请求正文、路由/查询字符串数据。这是因为与 Web API 使用的MediaTypeFormatter相比,它默认使用ModelBinder
  2. 简单类型参数(例如原始类型、字符串等)
    • Web API - 默认从路由/查询字符串数据(即从 URI)绑定。但是可以通过将 [FromBody] 属性或某些类型转换器应用于参数来强制从主体绑定。
    • MVC - 从任何地方绑定,即请求正文、路由/查询字符串数据。这是因为它默认使用ModelBinder 。

回到你的问题,

  1. Web API -(假设您的 POST 请求将发送请求正文中的数据,并且 DocumentType 是一个类,并且没有应用任何绑定属性)只有方法 2可以正确绑定模型,而方法 1则不能,因为两者都是复杂类型参数,并且没有绑定属性。绑定属性应用于其中任何一个。
  2. MVC - 两者都工作得很好,但方法 2 的可读性和可扩展性要好得多,以便将来添加任何其他属性。

更多信息: