我有一个用
[HttpPost]
属性装饰的端点。[HttpPost]
[Route("{userId}/orders/add")]
public async Task<ActionResult<UserOrderCreationRequest>> CreateOrder(
[FromBody]RequestObject request)
请求对象有一个定义如下的属性:
public class RequestObject
{
[FromRoute(Name = "userId")]
public string UserId { get; set; }
public Order order { get; set; }
}
由于某种原因,UserId 没有被填充并且变为空。
但是,当我将
[FromBody]
更改为 [FromQuery]
时,它运行良好。
[FromBody]
而不进行任何替换,但它仍然不起作用,因为我得到 UserId 等于 null。
[FromQuery]
让它发挥作用吗?CustomBinder
的其他解决方案将不胜感激。
放弃
RequestObject
类 - 你正在为绑定数据做一些非常奇怪的事情。
相反,在您的
CreateOrder
方法中绑定两个不同的参数。
[HttpPost]
[Route("{userId}/orders/add")]
public async Task<ActionResult<UserOrderCreationRequest>> CreateOrder(
string userId, // [FromRoute] is optional here
[FromBody] Order order)
{
}
这取决于内容类型。您必须使用 application/json 内容类型。在这种情况下,您需要单独放置 userId 并添加 [FromBody] 属性
[Route("{userId}/orders/add")]
public async Task<ActionResult<UserOrderCreationRequest>> CreateOrder(string userId,[FromBody] Order order)
但是如果您使用 application/x-www-form-urlencoded 或 multipart/form-data 表单 enctype 或 ajax content-type 那么如果您删除 [FromBody] 属性,这将起作用
[Route("{userId}/orders/add")]
public async Task<ActionResult<UserOrderCreationRequest>> CreateOrder( Order order)
在这种情况下,您不需要 fromquery 或 fromroute
public class RequestObject
{
public string UserId { get; set; }
public Order order { get; set; }
}
尝试用这个来欺骗 ASP.NET 输入格式化程序:
[HttpPost]
[Route("{request.UserId}/orders/add")]
public async Task<ActionResult<UserOrderCreationRequest>> CreateOrder([FromRoute] RequestObject request)
public class RequestObject
{
public string UserId { get; set; }
[FromBody]
public Order order { get; set; }
}