2017-05-30 2 views
0

J'ai la méthode de contrôleur suivante qui accepte la commande en tant que modèle de changement transmis par le client.Comment modéliser le segment de chemin de rattachement à la propriété d'objet

[HttpPut] 
    [Route("api/features/{name}")] 
    public async Task<IActionResult> PutFeatureValueAsync(
     string name, 
     [FromBody] SetFeatureCommand command, 
     CancellationToken token) 
    { 
     command.FeatureName = name; 
     await mediator.Send(command, token).ConfigureAwait(false); 
     return Ok(); 
    } 

Le problème est que je dois copier une propriété FeatureName à l'objet de commande manuellement si je veux garder le {name} dans l'URL. L'autre problème est que je ne peux pas effectuer correctement une validation si FeatureName n'est pas défini pendant la liaison de modèle. Quelle serait la meilleure façon d'avoir {nom} le segment du chemin pour modéliser automatiquement la liaison à la propriété FeatureName de la commande.

Répondre

0

Ceci pourrait être réalisé en utilisant une liaison de modèle personnalisée. Je recommande de commencer à lire la documentation Model Binding, puis examiner Custom Model Binding rubrique. Elle explique montre à la fois des approches et des échantillons disponibles presque ce dont vous avez besoin:

  • le liant modèle personnalisé (via propre implémentation de IModelBinder) Cette approche nécessite la modification de votre modèle: vous devez appliquer [ModelBinder] attribut à votre SetFeatureCommand classe
  • le fournisseur de classeur de modèle personnalisé (via sa propre implémentation de IModelBinderProvider). C'est ainsi que les classeurs de structure intégrés sont implémentés. Fournisseur est ensuite enregistré à l'aide des options middleware MVC:

    services.AddMvc(options => 
    { 
        // add custom binder to beginning of collection 
        options.ModelBinderProviders.Insert(0, new OwnBinderProvider()); 
    }); 
    
+0

Le problème avec ces approches est que je dois ré-écrire la chose qui est déjà dans le BodyProvider est pas? Disons que la commande a 5 propriétés. 4 d'entre eux je veux continuer à être lié de [FromBody] ou quoi que ce soit d'autre est marqué. Mais avoir une propriété liée à partir d'une autre source de liaison (chemin) en utilisant le mappage personnalisé. Je pense plus en termes de personnalisé IValueProviderFactory qui fournit des valeurs de routage sous des noms remappés afin que les classeurs de modèle par défaut les ramassent juste –