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

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

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

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

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

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

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

 public class RequestViewModel { public IEnumerable Ids { get; set; } public DocumentType DocumentType { get; set; } } 

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

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

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

回到你的问题,

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

更多信息: