将 [FromRoute] 和 [FromBody] 绑定到一个模型中

Bind [FromRoute] and [FromBody] into one model

我有这个端点

[HttpPost]
[Route("company/{companyid}/bankaccount")]
public async Task<Unit> AddCompanyBankAccount([FromBody]AddCompanyBankAccountCommand request)
{
    return await _mediator.Send(request);
}

和型号

public class AddCompanyBankAccountCommand : IRequest<Unit>
{
    public Guid CompanyId { get; set; }
    public string BankName { get; set; } = String.Empty;
    public string AccountNo { get; set; } = String.Empty;
    public Guid CurrencyId { get; set; }
}  

我希望我的端点类似于 POST contoso.com/company/{companyid}/bankaccount,并且我想将 {companyid} 作为 Guid 从路由绑定到模型。如果没有自定义模型绑定,这可能吗?我正在使用 NET 6.0

我也看到了这个website,但它对我不起作用

我尝试了你提供的代码和webside,因为CompanyId的类型是Guid,所以当我post xxxx/company/8719AEDB-D34A-DAA3-E0C0-BA307F48F349/bankaccount时,如网站的方法所示, 可以正常绑定。

但是,在您的问题中,当您 post xxxxx/company/123/bankaccount 时,您希望将 123 从路由绑定到模型,因为 123 的类型是 intCompanyId的类型是Guid,它们的类型不同,不能把Guid转成int,所以不能绑定。

您必须从控制器方法参数中删除所有 FromXXX 属性,而是在 class 本身中使用这两个参数。它看起来像这样:

[HttpPost]
[Route("company/{companyId:guid}/bankaccount")]
public async Task<Unit> AddCompanyBankAccount(AddCompanyBankAccountCommand request) { ... }

public class AddCompanyBankAccountCommand : IRequest<Unit>
{
    [FromRoute]
    public Guid CompanyId { get; set; }

    [FromBody]
    public BankAccount Account { get; set; }
}

public class BankAccount
{
    public string BankName { get; set; } = String.Empty;
    public string AccountNo { get; set; } = String.Empty;
    public Guid CurrencyId { get; set; }
}

请注意,您更改了在 内部使用的模型 (因为您现在有一个嵌套的 class),而 public 界面(大摇大摆)保持不变。

如果您的 属性 是 guid,还要确保在您的路线中设置 guid 的类型约束。