2017-09-14 2 views
0

Je veux remplir un modèle de vue basé sur le contenu du corps et le contenu de l'en-tête, j'ai essayé de décorer avec les deux attributs mais seulement l'un ou l'autre semble être en cours d'exécution la valeur.FromBody et FromHeader mélangent les deux sur le modèle ne lient pas toutes les valeurs

Le déplacement de FromBody à la propriété entraîne le remplissage de la valeur d'en-tête, le fait que FromBody dans la déclaration param sur le contrôleur provoque le remplissage de l'ID du corps.

Par la suite, l'exécution de TryUpdateModelAsync dans le contrôleur remplit les deux, mais cela semble moche et par-dessus.

Quelqu'un a des idées pour que cela fonctionne?

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

Répondre

0

Vous pouvez essayer de créer votre propre source de reliure. Je n'ai pas testé, mais quelque chose comme une source de liaison hybride:

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

utiliser l'attribut sur votre action:

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

Encore une fois, n'a pas testé, mais je pensais que le code était un peu trop juste pour un commentaire. S'il vous plaît répondez avec vos résultats.