MediaFormatter 或 ModelBinder for web api PUT 方法
MediaFormatter or ModelBinder for web api PUT method
我在网络 api 中有一个 PUT 方法,它接受如下 JSON 数据和路由数据。
[Route("api/v1/Orders/{orderId}/active")]
public HttpResponseMessage Put(Guid? orderId,List<ActiveRequest> activeRequests)
{
}
public class ActiveRequest
{
public int Id { get; set; }
public bool IsActive { get; set; }
}
现在是否可以将方法签名简化为:
[Route("api/v1/Orders/{orderId}/active")]
public HttpResponseMessage Put(ActiveRequestModel model)
{
}
public class ActiveRequestModel
{
public Guid OrderId { get; set; }
public List<ActiveRequest> ActiveRequests {get; set;}
}
我尝试通过实现 System.Web.Http.ModelBinding.IModelBinder 接口来编写自定义 ModelBinder,但找不到读取来自 Request 对象的 JSON 数据的方法。
我怀疑是否有一种方法可以将我的模型与来自三个不同位置的数据绑定,即来自 路由数据、json 和表单 .
您不能按照描述简化参数。
与 MVC 模型绑定不同,由于 Web API 格式化程序的工作方式,在 Web API 中你只能有一个从有效负载反序列化的参数,以及许多简单类型来自路由参数或 url 查询字符串的参数。原因是来自有效载荷的参数的创建是在有效载荷的单次反序列化中完成的。
因此,对于您的示例,您需要原始版本中的两个参数,即:
public HttpResponseMessage Put(Guid? orderId, List<ActiveRequest> activeRequests)
如果你想使用ActiveRequestModel
你需要包含一个结构完全相同的有效载荷,所以你应该在有效载荷中包含orderId
,因为它不会从中恢复url(即使名称匹配)。
请阅读这篇解释参数绑定在 Web 中如何工作的文章 API:
如果你仔细阅读它,你会发现你可以创建和注册你自己的模型绑定器,使它像 MVC 控制器一样工作,但我认为这不值得(所以我只包括它)在最后一段中),这不是标准的工作方式。
我在网络 api 中有一个 PUT 方法,它接受如下 JSON 数据和路由数据。
[Route("api/v1/Orders/{orderId}/active")]
public HttpResponseMessage Put(Guid? orderId,List<ActiveRequest> activeRequests)
{
}
public class ActiveRequest
{
public int Id { get; set; }
public bool IsActive { get; set; }
}
现在是否可以将方法签名简化为:
[Route("api/v1/Orders/{orderId}/active")]
public HttpResponseMessage Put(ActiveRequestModel model)
{
}
public class ActiveRequestModel
{
public Guid OrderId { get; set; }
public List<ActiveRequest> ActiveRequests {get; set;}
}
我尝试通过实现 System.Web.Http.ModelBinding.IModelBinder 接口来编写自定义 ModelBinder,但找不到读取来自 Request 对象的 JSON 数据的方法。 我怀疑是否有一种方法可以将我的模型与来自三个不同位置的数据绑定,即来自 路由数据、json 和表单 .
您不能按照描述简化参数。
与 MVC 模型绑定不同,由于 Web API 格式化程序的工作方式,在 Web API 中你只能有一个从有效负载反序列化的参数,以及许多简单类型来自路由参数或 url 查询字符串的参数。原因是来自有效载荷的参数的创建是在有效载荷的单次反序列化中完成的。
因此,对于您的示例,您需要原始版本中的两个参数,即:
public HttpResponseMessage Put(Guid? orderId, List<ActiveRequest> activeRequests)
如果你想使用ActiveRequestModel
你需要包含一个结构完全相同的有效载荷,所以你应该在有效载荷中包含orderId
,因为它不会从中恢复url(即使名称匹配)。
请阅读这篇解释参数绑定在 Web 中如何工作的文章 API:
如果你仔细阅读它,你会发现你可以创建和注册你自己的模型绑定器,使它像 MVC 控制器一样工作,但我认为这不值得(所以我只包括它)在最后一段中),这不是标准的工作方式。