当我需要使用具有多个参数的 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 将尝试为操作方法绑定参数,如下所示。
- 复杂类型参数(例如自定义 class):
- Web API - 默认从请求主体绑定。但这仅限于一个参数,即 Web API 将使用 MediaTypeFormatter 将请求主体 JSON 绑定到仅一个复杂类型参数(简单来说是序列化程序) .这是因为 Request Body 默认存储在非缓冲流中,只能读取一次。剩余的复杂类型参数(如果有)只能使用任何绑定属性(例如 [FromUri]、[ModelBinder])通过将它们应用到参数来绑定。
- MVC - 从任何地方绑定,即请求主体,Route/Query 字符串数据。这是因为与 Web API.
使用的 MediaTypeFormatter 相比,它默认使用 ModelBinder
- 简单类型参数(例如基本类型、字符串等):
- Web API - 从 Route/Query 字符串数据绑定,即默认从 URI。但是可以通过将 [FromBody] 属性或某些类型转换器应用于参数来强制它们从 body 绑定。
- MVC - 从任何地方绑定,即请求主体,Route/Query 字符串数据。这是因为它默认使用ModelBinder。
回到你的问题,
- Web API - (假设您的 POST 请求将在请求正文中发送数据并且 DocumentType 是 class 且未对其应用绑定属性) 只有 方法 2 正确绑定模型,但 方法 1 无法正确绑定模型两者都是复杂类型参数,并且没有绑定属性应用于其中任何一个。
- MVC - 两者都可以正常工作,但 方法 2 在可读性和可扩展性方面要好得多,以便在将来添加任何其他属性。
更多信息:
你能告诉我什么时候我需要在 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 将尝试为操作方法绑定参数,如下所示。
- 复杂类型参数(例如自定义 class):
- Web API - 默认从请求主体绑定。但这仅限于一个参数,即 Web API 将使用 MediaTypeFormatter 将请求主体 JSON 绑定到仅一个复杂类型参数(简单来说是序列化程序) .这是因为 Request Body 默认存储在非缓冲流中,只能读取一次。剩余的复杂类型参数(如果有)只能使用任何绑定属性(例如 [FromUri]、[ModelBinder])通过将它们应用到参数来绑定。
- MVC - 从任何地方绑定,即请求主体,Route/Query 字符串数据。这是因为与 Web API. 使用的 MediaTypeFormatter 相比,它默认使用 ModelBinder
- 简单类型参数(例如基本类型、字符串等):
- Web API - 从 Route/Query 字符串数据绑定,即默认从 URI。但是可以通过将 [FromBody] 属性或某些类型转换器应用于参数来强制它们从 body 绑定。
- MVC - 从任何地方绑定,即请求主体,Route/Query 字符串数据。这是因为它默认使用ModelBinder。
回到你的问题,
- Web API - (假设您的 POST 请求将在请求正文中发送数据并且 DocumentType 是 class 且未对其应用绑定属性) 只有 方法 2 正确绑定模型,但 方法 1 无法正确绑定模型两者都是复杂类型参数,并且没有绑定属性应用于其中任何一个。
- MVC - 两者都可以正常工作,但 方法 2 在可读性和可扩展性方面要好得多,以便在将来添加任何其他属性。
更多信息: