c# – 在WebApi服务中使用[FromUri]属性忽略DataMember的Name属性

前端之家收集整理的这篇文章主要介绍了c# – 在WebApi服务中使用[FromUri]属性忽略DataMember的Name属性前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们正在使用Asp.Net WebApi创建RestService.但是由于某些原因,在尝试使用[FromURI]属性反序列化复杂属性时,DataMember属性中的Name属性被忽略.

例如我们可能有:
方法

public IHttpActionResult Get([FromUri]User user)

模型:

[DataContract]
public class User
{
    [DataMember(Name = "username")]
    public string Username{ get; set; }
    [DataMember(Name = "isActive",Isrequired = false)]
    public bool? Active { get; set; }
}

反序列化用户时,我们按预期获取用户名,但对于Active为null.另一方面,当序列化数据时,我们同时获得了isActive和用户名.如果我们发送查询字符串中的活动请求,它按预期工作.

这显然是IModelBinder的问题.由于某些原因,它不使用DataMember的Name属性.我检查了什么格式化器被包括和4个默认的注册

System.Net.Http.Formatting.JsonMediaTypeFormatter
System.Net.Http.Formatting.XmlMediaTypeFormatter
System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter
System.Net.Http.Formatting.JQueryMvcFormUrlEncodedFormatter

我没有办法根据要求检查哪一个.我会假设它的FormUrlEncodedMediaTypeFormatter但我不能确定.另外,我不知道如果它甚至支持Name属性.

我已经检查了一个解决方案和最接近的主题,我可以找到是WebAPI DataMember Name not used when de/serializing via application/x-www-form-urlencoded,但它不使用[FromUri]但应用程序/ x-www-form-urlencoded属性,它没有真正解决.

任何想法,指点或建议将不胜感激.

解决方法

您必须检查您的“获取”请求.你的请求必须是这样的;
GET api/foo?username=fooname&active=false

您不需要DataContract和DataMember属性才能实现此目的.这些属性只是为了另一件事情,它不是使用的主要原因.

获得有效的get方法后,在你的方法,你可以检查modelstate像;

if (ModelState.IsValid) {
/// your code goes here    
}

猜你在找的C#相关文章