Aspnetcore: 单个对象支持多个[FromRoute]、[FromHeader]、[FromBody]等

创建于 2018-01-23  ·  3评论  ·  资料来源: dotnet/aspnetcore

我正在尝试使用来自请求绑定的所有相关数据创建一个对象。

想象一个这样的动作

[HttpPost({id})]
public virtual async Task<IActionResult> Post(PostRequest model)

模型可能是这样的

public class PostRequest
{
    [FromRoute]
    public int Id { get; set; }

    [FromHeader]
    public string SomeHeader { get; set; }

    [FromBody]
    public int Foo { get; set; }
    [FromBody]
    public string Bar { get; set; }
    [FromBody]
    public string Baz { get; set; }
}

不幸的是,不允许使用多个[FromBody]

如果它被允许并按预期工作,我可以像这样实现一个通用的 CRUD 控制器

[HttpPost({id})]
public virtual async Task<IActionResult> Post(PostRequest model)
{
    var command = _mapper.Map<TCommand>(model); // AutoMapper
    await _mediator.Send(command); // MediatR
    // omitted for brevity
    return Created();
}

显然,它看起来不会完全那样。
这个想法是从控制器中删除所有与 API/MVC 无关的逻辑。 所以控制器所做的就是

  • 验证模型
  • 从请求中提取想要的数据
  • 将相关数据发送给处理程序
  • 返回适当的 http 响应

现在我可以有一个实现来满足我所有的 CRUD 控制器需求 - 并且非常高兴!

它不需要是[FromBody]它可以是另一个属性。 像[FromBodyPart][BindFromBody]或完全不同的东西。

那可行吗?

area-mvc

最有用的评论

感谢您的功能请求。 我们将在下一个发布计划期间考虑此功能,并相应地更新此问题的状态。

所有3条评论

感谢您的功能请求。 我们将在下一个发布计划期间考虑此功能,并相应地更新此问题的状态。

我认为这将是我在这里仍然没有回答的 SO 问题的解决方案:
https://stackoverflow.com/questions/44261111/how-to-model-bind-path-segment-to-object-property

谢谢您联络我们。
在重新评估这个问题后,我们决定不提供这样的功能,因为这与我们在框架中尝试遵循的原则不一致。

此页面是否有帮助?
0 / 5 - 0 等级