2017-09-14 60 views
0

我想填充基於Body內容和Header內容的視圖模型,我試圖用兩個屬性來裝飾,但只有一個或另一個似乎在運行並且填充價值。FromBody和FromHeader在模型上混合使用不綁定所有值

將FromBody移動到屬性會導致填充標題值,使控制器上的參數聲明中的FromBody使body body被填充。

隨後在控制器中運行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; } 
} 

回答

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

同樣,沒有測試過這一點,但我認爲代碼爲有點太多隻是爲了評論。請回復你的結果。

相關問題