将属性绑定到请求的主体,而不使用ASP.NET Core MVC中的FromBody属性

时间:2016-07-20 15:22:14

标签: asp.net-core-mvc

问题

我需要找到一种方法将类的属性绑定到ASP.NET Core MVC中的http请求的主体,我需要在不使用FromBody属性的情况下执行此操作。

我有以下课程:

public class SaveEntity 
{
    // This property should be bound from the URL.
    public Guid Id { get; set; }
    // This property should be bound from the body.
    public SaveEntityParameters Payload { get; set; }
}

以下是我打算在控制器中使用它的方法。

[Route("api/v1/[controller]")]
public class EntitiesController : Controller 
{
    readonly IBus _bus;
    public EntitiesController(IBus bus) 
    {
        if (bus == null)
            throw new ArgumentNullException(nameof(bus));
        _bus = bus;
    }
    [HttpPut("{id}")]
    public async Task<IActionResult> Put(SaveEntity command) 
    {
        var response = await _bus.SendAsync(command);
        return Ok(response);
    }
}

SaveEntity类位于不依赖于MVC的类库中,因此FromBody属性不可用。如何将Payload类的SaveEntity属性绑定到正文,同时保持绑定到url的Id属性?

不太理想的解决方法

我考虑过分割IdPayload属性。然后我可以这样做:

[HttpPut("{id}")]
public async Task<IActionResult> Put(Guid id, [FromBody]SaveEntityParameters payload)
{
    SaveEntity command = new SaveEntity {Id = id, Payload = payload};
    var response = await _bus.SendAsync(command);
    return Ok(response);
}

但是我必须先手动分配SaveEntity实例的属性才能使用它。如果可能的话,我想避免手动分配,因为这类事情将在几个控制器中发生。

1 个答案:

答案 0 :(得分:0)

这不能解答您的问题,但您也可以执行以下操作:

public class SaveEntityDTO
{
    [FromRoute]
    public Guid Id { get; set; }

    [FromBody]
    public SaveEntityParameters Payload { get; set; }

    public SaveEntity GetEntity() 
    {
      return new SaveEntity { Id = Id, Payload = Payload };
    }
}

行动:public async Task<IActionResult> Put(SaveEntityDTO saveEntityDTO)

我认为理想情况下你需要一个知道绑定SaveEntity

的自定义模型绑定器