urlencoded binding to different property names

I am expecting a POST request with content type set to:

Content-Type: application/x-www-form-urlencoded

Request body looks like this:

first_name=john&last_name=banana

My action on controller has this signature:

[HttpPost]
public HttpResponseMessage Save(Actor actor)
{
    ....
}

Where Actor class is given as:

public class Actor
{
public string FirstName {get;set;}
public string LastName {get;set;}
}

Is there a way to force Web API to bind:

first_name => FirstName
last_name => LastName

I know how to do it with requests with content type set to application/json, but not with urlencoded.


I'm 98% certain (I looked the source code) that WebAPI doesn't support it.

If you really need to support different property names, you can either:

  • Add additional properties to the Actor class which serves as alias.

  • Create your own model binder.

  • Here is a simple model binder:

    public sealed class ActorDtoModelBinder : IModelBinder
    {
        public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
        {
            var actor = new Actor();
    
            var firstNameValueResult = bindingContext.ValueProvider.GetValue(CreateFullPropertyName(bindingContext, "First_Name"));
            if(firstNameValueResult != null) {
                actor.FirstName = firstNameValueResult.AttemptedValue;
            }
    
            var lastNameValueResult = bindingContext.ValueProvider.GetValue(CreateFullPropertyName(bindingContext, "Last_Name"));
            if(lastNameValueResult != null) {
                actor.LastName = lastNameValueResult.AttemptedValue;
            }
    
            bindingContext.Model = actor;
    
            bindingContext.ValidationNode.ValidateAllProperties = true;
    
            return true;
        }
    
        private string CreateFullPropertyName(ModelBindingContext bindingContext, string propertyName)
        {
            if(string.IsNullOrEmpty(bindingContext.ModelName))
            {
                return propertyName;
            }
            return bindingContext.ModelName + "." + propertyName;
        }
    }
    

    If you are up for the challenge, you can try to create a generic model binder.


    It's an old post but maybe this could helps other people. Here is a solution with an AliasAttribute and the associated ModelBinder

    It could be used like this :

    [ModelBinder(typeof(AliasBinder))]
    public class MyModel
    {
        [Alias("state")]
        public string Status { get; set; }
    }
    

    Don't hesitate to comment my code :)

    Every Idea / comment is welcome.

    链接地址: http://www.djcxy.com/p/18286.html

    上一篇: PowerShell从函数返回一个单元素数组

    下一篇: urlencoded绑定到不同的属性名称