C# 模型上的FromBody和FromHeader混合未绑定所有值

C# 模型上的FromBody和FromHeader混合未绑定所有值,c#,asp.net-core,model-binding,C#,Asp.net Core,Model Binding,我想基于主体内容和标题内容填充viewmodel,我尝试使用这两个属性进行修饰,但似乎只有一个属性正在运行并填充值 将FromBody移动到属性会导致填充标头值,而在控制器的param声明中包含FromBody会导致填充主体Id 随后在控制器中运行TryUpdateModelAsync确实会填充这两个对象,但这看起来很难看,而且过于夸张 有人知道如何让它工作吗 public IActionResult GetAddress([FromBody]AddressDataViewModel model

我想基于主体内容和标题内容填充viewmodel,我尝试使用这两个属性进行修饰,但似乎只有一个属性正在运行并填充值

将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; }
}

您可以尝试创建自己的绑定源。还没有测试过这个,但有点像混合绑定源:

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)
{
}

再说一次,我还没有测试过这个,但是我觉得仅仅为了一个注释,代码有点太多了。请回复您的结果。

是否找到解决方案?