我们正在使用Asp.Net WebApi创建RestService。但由于某些原因,在尝试使用Name
属性反序列化复杂属性时,DataMember
属性中会忽略[FromURI]
属性。
例如我们可能有: 方法:
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; }
}
在反序列化user
时,我们会按预期获得用户名,但null
用于Active
。另一方面,在序列化数据时,我们会按预期获得isActive
和username
。如果我们在查询字符串中发送带active
的请求,则按预期工作。
这显然是IModelBinder
的问题。由于某种原因,它不使用DataMember
的{{1}}属性。我检查了包含哪些格式化程序,并注册了4个默认格式化程序:
Name
我无法检查请求使用哪一个。我会假设它System.Net.Http.Formatting.JsonMediaTypeFormatter
System.Net.Http.Formatting.XmlMediaTypeFormatter
System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter
System.Net.Http.Formatting.JQueryMvcFormUrlEncodedFormatter
,但我无法确定。此外,我不确定它是否支持FormUrlEncodedMediaTypeFormatter
属性。
我已经检查了一个解决方案,我能找到的最接近的主题是WebAPI DataMember Name not used when de/serializing via application/x-www-form-urlencoded,但它没有使用Name
但[FromUri]
属性并且它没有真正解决。
任何想法,指示或建议都会非常感激。
答案 0 :(得分:-1)
你必须检查你的"得到"请求。您的获取请求必须是这样的;
GET api/foo?username=fooname&active=false
您不必使用DataContract和DataMember属性来实现此目的。这些属性仅用于另一件事,它不是用于的主要原因。
在获取get方法的有效命中后,在您的方法中,您可以检查modelstate,如;
if (ModelState.IsValid) {
/// your code goes here
}