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



您能告诉我何时需要在我的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. 复杂类型参数(例如自定义类)
    • Web API - 默认情况下从请求主体绑定。但这仅限于一个参数,即Web API将使用 MediatypeFormatter (简单术语serialializer)将请求主体JSON绑定到一个复杂类型参数。这是因为默认情况下,请求主体存储在非缓冲流中,可以读取一次。剩余的复杂类型参数(如果有)只能通过将它们应用于参数。
    • MVC - 从任何地方绑定,即请求主体,路由/查询字符串数据。这是因为它默认使用 ModelBinder mediatypeFormatter 使用Web API使用。
  2. 简单类型的参数(例如原始类型,字符串等)
    • Web API - 从路由/查询字符串数据(默认情况下从URI)绑定。但是它们可以通过将[从body]属性或某种类型的转换器应用于参数而被迫从身体绑定。
    • MVC - 从任何地方绑定,即请求主体,路由/查询字符串数据。这是因为它默认使用 modelbinder

回到您的问题,

  1. Web API - (假设您的邮政请求将在请求正文中发送数据,并且DocumentType是一类,并且没有将绑定属性应用于)strong>方法2 正确绑定模型,但不是方法1 ,因为这两个都是复杂的类型参数,并且没有任何一个绑定属性应用于其中的任何一个。

更多信息:

  • https://learn.microsoft.com/en-us/aspnet/web-api/web-api/overview/formats-and-model-binding/parameter-binding-in-binding-in--in-aspnet-web-api
  • https://learn.microsoft.com/en-us/aspnet/core/mvc/models/model-binding
  • https://blogs.msdn.microsoft.com/jmstall/2012/04/16/how-webapi-does-parameter-binding/

最新更新