Web API表单 - urlencoded绑定到不同的属性名称

时间:2014-01-08 14:06:35

标签: c# asp.net-web-api

我期待内容类型设置为的POST请求:

  

内容类型:application / x-www-form-urlencoded

请求正文如下:

  

如first_name =约翰&安培;姓氏=香蕉

我对控制器的操作有这个签名:

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

其中Actor类的位置为:

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

有没有办法强制Web API绑定:

  

first_name =>名字
  last_name =>名字

我知道如何使用内容类型设置为application / json但不使用urlencoded的请求来执行此操作。

2 个答案:

答案 0 :(得分:3)

我98%肯定(我看过源代码)WebAPI不支持它。

如果您确实需要支持不同的属性名称,可以:

  1. 向作为别名的Actor类添加其他属性。

  2. 创建自己的模型装订器。

  3. 这是一个简单的模型绑定器:

    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;
        }
    }
    

    如果您正在接受挑战,可以尝试创建通用模型绑定器。

答案 1 :(得分:0)

这是一个老帖子,但也许这可以帮助其他人。 这是solution with an AliasAttribute and the associated ModelBinder

可以像这样使用:

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

不要犹豫,评论我的代码:)

欢迎每一个想法/评论。