我有一个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
。这是一个人为的简化示例,但希望能够展示背景。
IModelBinder
,IValueProvider
,HttpParameterBinding
等人之间扭曲了。
我想要一个示例,我应该在哪里挂钩到模型绑定,以允许我从查询字符串中将值写入我的模型 - 请注意,当路由使用FromUri
时,我只使用此别名行为属性(参见上面的MyController.GetSomething
)。
答案 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;}
}