我有一个ASP.NET WebForms应用程序。在其中我成功托管Web API服务,获取各种信息。现在我需要PUT(更新)一个对象。据我所知,我可以发送一个JSON字符串,如果映射到已定义的模型/类,则可以通过PUT方法接收该模型/类的实例。
所以这是我的模特......
[DataContract]
[Table("ServiceFeatures")]
public class ServiceFeature
{
[Key]
[DataMember]
public Int64 Id { get; set; }
[DataMember]
public Int64 ServiceId { get; set; }
[DataMember]
[DataType(DataType.Text)]
public String Name { get; set; }
[DataMember]
[DataType(DataType.MultilineText)]
public String Description { get; set; }
[DataMember]
[DataType(DataType.MultilineText)]
public String Comments { get; set; }
[DataMember]
[DataType(DataType.DateTime)]
public DateTime DateAdded { get; set; }
[DataMember]
[DataType(DataType.DateTime)]
public DateTime DateUpdated { get; set; }
[DataMember]
public Boolean? IsEnabled { get; set; }
#region Navigation Property
[ForeignKey("ServiceId")]
public Service Service { get; set; }
#endregion
}
这是被调用的WebAPI方法......
[HttpPut]
public void UpdateServiceFeature([FromBody]ServiceFeature value)
{
ServiceRepository.Instance.UpdateServiceFeature(value);
}
这是在AJAX请求的RequestBody中发送的JSON字符串(来自IE Dev Tools)......
"{\"Id\":8,\"ServiceId\":3,\"Name\":\"Wrap \",\"Description\":\"Claritas est etiam processus dynamicus, qui sequitur mutationem consuetudium lectorum. Mirum est notare quam littera gothica, quam nunc \",\"Comments\":\"sdfdsdssd\",\"DateAdded\":\"2013-07-29T23:39:19.46\",\"DateUpdated\":\"08/17/2013\",\"IsEnabled\":true}"
当提交PUT请求时,我通过WebAPI方法跟踪请求,并发现value参数是ServiceFeature的DEFAULT实例,其中每个属性都设置为NULL,而不是填充了来自JSON字符串。
我是否遗漏了这个应该如何工作的东西,或者这是自动映射MVC的事情,WebForms需要不同的方法?
提前致谢!
解决方案更新
两个建议,“user2674389”的评论添加内容类型“application / json”,以及Nenad的“回答”将JSON作为OBJECT而不是STRING发送是为了使这项工作成为可能。我单独尝试了每个人,所以我可以将答案归功于正确的成员,但每个人都是正确的。我赞成了“用户”的评论,并将Nenad的回答标记为“已接受”。非常感谢你的帮助!
答案 0 :(得分:1)
您向WebAPI发送了错误的数据格式。
假设您使用jQuery发送PUT请求,这是有效请求(请参阅data
属性):
$.ajax({
url: '/Api/ServiceFeature',
type: 'PUT',
data: {
"Id": 8,
"ServiceId": 1,
"Name": "Wrap",
"Description": "Claritas est etiam processus dynamicus, qui sequitur mutationem consuetudium lectorum. Mirum est notare quam littera gothica, quam nunc",
"Comments": null,
"DateAdded": "2013-08-17T22:40:53.2387243+02:00",
"DateUpdated": "2013-08-17T00:00:00+02:00",
"IsEnabled": true
},
success: function() {
alert('Done');
},
error: function(textStatus) {
alert(textStatus);
}
});
但是,这会以这种格式序列化为请求正文:
Id=8&ServiceId=3&Name=Wrap&Description=Claritas+est+etiam+processus+dynamicus%2C+qui+sequitur+mutationem+consuetudium+lectorum.+Mirum+est+notare+quam+littera+gothica%2C+quam+nunc&Comments=sdfdsdssd&DateAdded=2013-07-29T23%3A39%3A19.46&DateUpdated=08%2F17%2F2013&IsEnabled=true
内容类型通常默认设置正确且为Content-Type:application/x-www-form-urlencoded; charset=UTF-8
这是WebAPI期望的格式,以便正确反序列化您的对象。