asp.net web api2-支持获取web api请求中的别名参数



背景

我有一个WebAPI项目,它使用复杂类型来处理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这样的url。

我想为这些参数使用alias',我将为此做一些复杂的事情(一旦我完成了这项工作(,但实际上我已经定义了一个属性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;}
}

允许我的url缩短为http://domain.com/api/Something?val=foo。这是一个精心设计和简化的例子,但希望能展示背景。

问题

与Mvc模型绑定相比,WebAPI中的ModelBinding变得非常复杂。我在IModelBinderIValueProviderHttpParameterBinding等人之间左右为难。

我想举一个例子,说明我应该在哪里挂接到模型绑定,以允许我从querystring向模型写入值——请注意,只有当路由使用FromUri属性时,我才会使用这种别名行为(请参阅上面的MyController.GetSomething(。

问题标题: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将映射反序列化为不同的属性名称


这里有一种更不可知论的方法

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

最新更新