J'essaie de créer un liant de modèle très simple pour les types ObjectId dans mes modèles mais je n'arrive pas à le faire fonctionner jusqu'à présent.
Voici le classeur des modèles :
public class ObjectIdModelBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
var result = bindingContext.ValueProvider.GetValue(bindingContext.FieldName);
return Task.FromResult(new ObjectId(result.FirstValue));
}
}
Voici le ModelBinderProvider que j'ai codé :
public class ObjectIdModelBinderProvider : IModelBinderProvider
{
public IModelBinder GetBinder(ModelBinderProviderContext context)
{
if (context == null) throw new ArgumentNullException(nameof(context));
if (context.Metadata.ModelType == typeof(ObjectId))
{
return new BinderTypeModelBinder(typeof(ObjectIdModelBinder));
}
return null;
}
}
Voici la classe à laquelle j'essaie de lier le paramètre body :
public class Player
{
[BsonId]
[ModelBinder(BinderType = typeof(ObjectIdModelBinder))]
public ObjectId Id { get; set; }
public Guid PlatformId { get; set; }
public string Name { get; set; }
public int Score { get; set; }
public int Level { get; set; }
}
Il s'agit de la méthode d'action :
[HttpPost("join")]
public async Task<SomeThing> Join(Player player)
{
return await _someService.DoSomethingOnthePlayer(player);
}
Pour que ce code fonctionne, c'est-à-dire pour que le modèle binder s'exécute, j'ai hérité du contrôleur de Controller et j'ai supprimé l'attribut [FromBody]
du paramètre Player.
Lorsque je l'exécute, je peux entrer dans la méthode BindModelAsync du binder de modèle, mais je ne parviens pas à obtenir la valeur du paramètre Id à partir des données du message. Je peux voir le paramètre bindingContext.FieldName est correct ; il est réglé sur Id mais résultat.FirstValue est nulle.
Je me suis éloigné d'Asp.Net MVC pendant un certain temps, et il semble que beaucoup de choses ont été modifiées et sont devenues plus confuses :-)
EDIT Sur la base des commentaires, je pense que je devrais fournir plus de contexte.
Si je place [FromBody] avant le paramètre d'action du joueur, joueur est définie comme nulle. Si je supprime [FromBody], joueur est réglé sur une valeur par défaut, et non sur les valeurs que j'affiche. Le corps du message est présenté ci-dessous, il s'agit d'un simple JSON :
{
"Id": "507f1f77bcf86cd799439011"
"PlatformId": "9c8aae0f-6aad-45df-a5cf-4ca8f729b70f"
}