【问题标题】:"Putting" a JSON String back to a WEB API method hosted in a WebForms application将 JSON 字符串“放”回 WebForms 应用程序中托管的 WEB API 方法
【发布时间】:2013-08-18 05:00:11
【问题描述】:

我有一个 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 开发工具)...

"{\"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 的回答标记为“接受”。非常感谢你们的帮助!

【问题讨论】:

  • 您确定将application/json 作为您的内容类型发送吗?

标签: c# json webforms asp.net-web-api


【解决方案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 期望正确反序列化对象的格式。

【讨论】:

    猜你喜欢
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 2012-09-03
    相关资源
    最近更新 更多