Liaison de modèle de chaîne de requête ASP.NET WebApi

J’ai le modèle suivant

public class Dog { public ssortingng NickName { get; set; } public int Color { get; set; } } 

et j’ai la méthode de contrôleur api suivante qui est exposée via une API

 public class DogController : ApiController { // GET /v1/dogs public IEnumerable Get([FromUri] Dog dog) { ...} 

Maintenant, j’aimerais émettre la demande GET comme suit:

 GET http://localhost:90000/v1/dogs?nick_name=Fido&color=1 

Question: Comment lier le paramètre de chaîne de requête nick_name à la propriété NickName dans la classe dog? Je sais que je peux appeler l’API sans le trait de soulignement (pseudo) ou changer NickName en Nick_Name et obtenir la valeur, mais j’ai besoin que les noms restnt comme cela pour la convention.

Modifier Cette question n’est pas une copie car il s’agit d’ASP.NET WebApi et non d’ASP.NET MVC 2

Implémentation de IModelBinder ,

 public class DogModelBinder : IModelBinder { public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) { if (bindingContext.ModelType != typeof(Dog)) { return false; } var model = (Dog)bindingContext.Model ?? new Dog(); var hasPrefix = bindingContext.ValueProvider.ContainsPrefix(bindingContext.ModelName); var searchPrefix = (hasPrefix) ? bindingContext.ModelName + "." : ""; model.NickName = GetValue(bindingContext, searchPrefix, "nick_name"); int colorId = 0; if (int.TryParse(GetValue(bindingContext, searchPrefix, "colour"), out colorId)) { model.Color = colorId; // <1> } bindingContext.Model = model; return true; } private ssortingng GetValue(ModelBindingContext context, ssortingng prefix, ssortingng key) { var result = context.ValueProvider.GetValue(prefix + key); // <4> return result == null ? null : result.AttemptedValue; } } 

Et créer ModelBinderProvider ,

 public class DogModelBinderProvider : ModelBinderProvider { private CollectionModelBinderProvider originalProvider = null; public DogModelBinderProvider(CollectionModelBinderProvider originalProvider) { this.originalProvider = originalProvider; } public override IModelBinder GetBinder(HttpConfiguration configuration, Type modelType) { // get the default implementation of provider for handling collections IModelBinder originalBinder = originalProvider.GetBinder(configuration, modelType); if (originalBinder != null) { return new DogModelBinder(); } return null; } } 

et en utilisant dans le contrôleur quelque chose comme,

 public IEnumerable Get([ModelBinder(typeof(DogModelBinder))] Dog dog) { //controller logic }