C# 查询字符串模型绑定ASP.NET WebApi

C# 查询字符串模型绑定ASP.NET WebApi,c#,asp.net,asp.net-web-api,model-binding,C#,Asp.net,Asp.net Web Api,Model Binding,我有下面的型号 public class Dog { public string NickName { get; set; } public int Color { get; set; } } 我有下面的api控制器方法,它是通过api公开的 public class DogController : ApiController { // GET /v1/dogs public IEnumerable<string> Get([FromUri] Dog dog

我有下面的型号

public class Dog
{
    public string NickName { get; set; }
    public int Color { get; set; }
}
我有下面的api控制器方法,它是通过api公开的

public class DogController : ApiController
{
  // GET /v1/dogs
  public IEnumerable<string> Get([FromUri] Dog dog)
  { ...}
问题:如何将查询字符串参数nick_name绑定到dog类中的属性昵称?我知道我可以在不使用下划线(即昵称)的情况下调用API,或者将昵称更改为Nick_Name并获取值,但我需要名称保持与约定相同

编辑
这个问题不是重复的,因为它是关于ASP.NET WebApi的,而不是关于ASP.NET MVC 2实现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 string GetValue(ModelBindingContext context, string prefix, string key)
    {
        var result = context.ValueProvider.GetValue(prefix + key); // <4>
        return result == null ? null : result.AttemptedValue;
    }
}
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;
    }
}
在控制器中使用类似

public IEnumerable<string> Get([ModelBinder(typeof(DogModelBinder))] Dog dog)
{
    //controller logic
}
public IEnumerable Get([ModelBinder(typeof(DogModelBinder))]Dog-Dog)
{
//控制器逻辑
}

您的问题是关于将模型属性绑定到别名,对吗?实现System.Web.Mvc.IModelBinder和System.Web.Http.ModelBinding.IModelBinder是有区别的。MVC的BindModel为[object BindModel(ControllerContext ControllerContext,ModelBindingContext bindingContext)],WebApi的BindModel为[bool BindModel(HttpActionContext actionContext,ModelBindingContext)]。我在“可能的副本”中看到的示例仅涉及MVC而非WebAPI。如何将此方法用于数组类型属性?
public IEnumerable<string> Get([ModelBinder(typeof(DogModelBinder))] Dog dog)
{
    //controller logic
}