在web api的get请求中支持别名参数

时间:2015-05-18 13:10:02

标签: asp.net-web-api2 model-binding

背景

我有一个web api项目,它使用复杂类型进行GET请求,这里是一个控制器方法的例子,以及它相关的复杂类型

[RoutePrefix("api")]
public class MyController : ApiController
{
    [Route("Something")]    
    public IHttpActionResult GetSomething([FromUri]RequestObject request)
    {
        // do something to get "data"
        return Ok(data);
    }
}

// elsewhere
public class RequestObject
{
    [Required]
    public string SomeValue{get;set;}
}

这适用于http://domain.com/api/Something?SomeValue=foo等网址。

我想为这些参数使用别名',我会做一些复杂的事情(一旦我有这个工作),但实际上我已经定义了一个属性AliasAttribute

[AttributeUsage(AttributeTargets.Property,AllowMultiple=true)]
public class AliasAttribute : Attribute
{
    public string ParameterName { get; private set; }

    public AliasAttribute(string parameterName)
    {
        this.ParameterName = parameterName;
    }
}

我想像我这样装饰我的请求模型:

// elsewhere
public class RequestObject
{
    [Required,Alias("val")]
    public string SomeValue{get;set;}
}

允许我的网址缩短为http://domain.com/api/Something?val=foo。这是一个人为的简化示例,但希望能够展示背景。

问题

与Mvc模型绑定相比,web api中的ModelBinding变得非常复杂。我在IModelBinderIValueProviderHttpParameterBinding等人之间扭曲了。

我想要一个示例,我应该在哪里挂钩到模型绑定,以允许我从查询字符串中将值写入我的模型 - 请注意,当路由使用FromUri时,我只使用此别名行为属性(参见上面的MyController.GetSomething)。

2 个答案:

答案 0 :(得分:1)

看起来您可以构建自己的模型绑定器来使用您的属性。

以下是如何使用自定义模型绑定器的示例: Web API form-urlencoded binding to different property names

这似乎过度杀人但会奏效。

更新:

我认为这是一个更好的解决方案: Asp.Net MVC 2 - Bind a model's property to a different named value

答案 1 :(得分:-1)

问题标题:Support aliased arguments in get requests for web api。我认为你在这里重新发明一个轮子AliasAttribute,并没有给出一个非常好的理由为什么你不想用社区的方式来做这个。

我已经使用Newtonsoft.Json序列化程序做了类似的事情。但如果你想要一些东西,我必须谷歌。

public class RequestObject
{
   [Required]
   [JsonProperty("vla")]
   public string SomeValue{get;set;}
}

使用它的示例SO:.Net NewtonSoft Json Deserialize map to a different property name

喜欢投票,所以你激励我为你google。这是一种更加不可知的方式。

[DataContract]
public class RequestObject
{
   [DataMember(Name="val", IsRequired=true)]
   public string SomeValue{get;set;}
}