FromBody和FromHeader混合模型不绑定所有值

时间:2017-09-14 13:32:01

标签: c# asp.net-core model-binding

我想基于Body内容和Header内容填充视图模型,我尝试使用这两个属性进行装饰,但只有一个或另一个似乎正在运行并填充值。

将FromBody移动到属性会导致填充标题值,控制器上的param声明中的FromBody会导致填充正文ID。

随后在控制器中运行TryUpdateModelAsync确实填充了两者,但这看起来很难看并且在顶部。

任何人都有任何想法如何让这个工作?

public IActionResult GetAddress([FromBody]AddressDataViewModel model)
{
    if (!this.ModelState.IsValid)
    {
        return this.BadRequest(this.ModelState);
    }

    return this.Ok(this.helper.GetAddress(model.Id));
}

public class AddressDataViewModel : BaseHttpRequestMeta
{
    [Required]
    public string Id { get; set; }
}


public class BaseHttpRequestMeta 
{
    [BindRequired]
    [FromHeader(Name = "sessionid")]
    public string SessionId { get; set; }
}

1 个答案:

答案 0 :(得分:0)

您可以尝试制作自己的绑定源。没有测试过这个,但是像混合绑定源这样:

public class FromHeaderOrBodyAttribute : Attribute, IBindingSourceMetadata
{
    public BindingSource BindingSource => new HeaderOrBodyBindingSource();
}

public class HeaderOrBindingSource : BindingSource
{
    public HeaderOrBindingSource() : base("HeaderOrBody", "Header or Body binding source", true, true)
    {
    }

    public override bool CanAcceptDataFrom(BindingSource bindingSource)
    {
        return bindingSource == BindingSource.Header
            || bindingSource == BindingSource.Body;
    }
}

然后在您的操作中使用该属性:

public IActionResult GetAddress([FromHeaderOrBody]AddressDataViewModel model)
{
}

再次,没有对此进行测试,但我认为代码对于评论来说有点太多了。请回复您的结果。