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

Adm*_*vić 7 c# asp.net-web-api

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

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

请求正文如下所示:

如first_name =约翰&姓氏=香蕉

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

[HttpPost]
public HttpResponseMessage Save(Actor actor)
{
    ....
}
Run Code Online (Sandbox Code Playgroud)

Actor类的位置为:

public class Actor
{
public string FirstName {get;set;}
public string LastName {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

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

first_name => FirstName
last_name => LastName

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

Los*_*ter 3

我 98% 确定(我查看了源代码)WebAPI 不支持它。

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

  1. Actor向充当别名的类添加其他属性。

  2. 创建您自己的模型活页夹。

这是一个简单的模型活页夹:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您准备好迎接挑战,可以尝试创建通用模型绑定器。