在 POST 请求上使用 FromRoute 属性绑定后,属性为 null

问题描述 投票:0回答:4

我有一个用

[HttpPost]
属性装饰的端点。
此端点 url 应具有来自路由本身的输入对象属性之一,但所有其他属性应来自请求正文。

这是用其路由定义装饰的端点:

[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
的其他解决方案将不胜感激。

c# asp.net-core model-binding
4个回答
1
投票

我也有同样的问题,我无法更改

[FromRoute]
属性,但它仅适用于 [FromQuery]。这就是为什么我在请求属性上手动添加
[FromQuery]
属性:在此处输入图像描述


0
投票

放弃

RequestObject
类 - 你正在为绑定数据做一些非常奇怪的事情。

相反,在您的

CreateOrder
方法中绑定两个不同的参数。

[HttpPost]    
[Route("{userId}/orders/add")]
public async Task<ActionResult<UserOrderCreationRequest>> CreateOrder(
    string userId, // [FromRoute] is optional here
    [FromBody] Order order)
{

}

0
投票

这取决于内容类型。您必须使用 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; }
}

-1
投票

尝试用这个来欺骗 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; }
}
© www.soinside.com 2019 - 2024. All rights reserved.