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

When I need to use POST method with multiple parameters instead of separate model?

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

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

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

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

[HttpPost]
public InfoViewModel GetInfo(RequestViewModel model)
{
   // to do smth
}

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

public class RequestViewModel
{
    public IEnumerable<Guid> Ids { get; set; }
    public DocumentType DocumentType { get; set; }
}

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

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

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

回到你的问题,

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

更多信息: