1

ASP.NET WebForms アプリケーションがあります。その中で、さまざまな情報を取得する Web API サービスのホスティングに成功しています。ここで、オブジェクトを PUT (更新) する必要があります。定義されたモデル/クラスにマップされている場合、そのモデル/クラスのインスタンスとして PUT メソッドによって受信できる JSON 文字列を送信できることは、私の理解です。

これが私のモデルです...

[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 メソッドを介して要求を追跡し、値パラメーターが JSON 文字列からのデータで満たされたインスタンスではなく、すべてのプロパティが NULL に設定されている ServiceFeature の DEFAULT インスタンスであることを発見しました。

これがどのように機能するのか、またはこの自動マッピングは MVC のものであり、WebForms には別のアプローチが必要ですか?

前もって感謝します!

ソリューションの更新

これを機能させるには、コンテンツタイプ「application/json」を追加するための「user2674389」によるコメントと、JSON を STRING ではなく OBJECT として送信するための Nenad による「回答」の両方の提案が必要でした。答えを正しいメンバーに帰することができるように、それぞれを個別に試しましたが、それぞれが正しかった. 「ユーザーの」コメントに賛成票を投じ、ネナドの回答を「承認済み」とマークしました。お二方、ご協力ありがとうございました!

4

1 に答える 1

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 が想定する形式です。

于 2013-08-17T20:47:02.510 に答える