1

次のように定義されたWebAPIメソッドがあります。

[HttpPost]
public void Post(Input model)
{
    ...
}  

このような入力モデルの場合:

public class Input
{
    public string Id { get; set; }
    public object Extra { get; set; }
}

私がやりたいのは、jQueryを使用した次の例のように、有効なJSONオブジェクトを追加のパラメーターとして渡すことです。

$.post(
    'http://localhost/api/myController',
    { 
        id: 'someId',               
        extra: { 
            tags: ['a', 'b'],
            anotherValue: 'hello',
            oneMore: { 
                foo: 'bar'
            }
        }
    });

Idはmodel.Idプロパティに正しく入ります。ただし、追加のプロパティは{object}として提供され、そこに何が含まれているかわからないため、逆シリアル化することはできません。

動的にするか、 dynamic / ExpandoObject/Dictionaryにキャストしようとしましたが成功しませんでした。生のHttpRequestMessageを受信して​​自分で処理すれば、おそらくそれを機能させることができることを私は知っています。しかし、私はむしろそれを行わず、.NETが実施しているすべての検証に依存したいと思います。

出来ますか?

ありがとう

編集1:いくつかの代替案をテストした後、追加のプロパティには実際の値がなく、新しいobject()として初期化されていることがわかりました。デフォルトのモデルバインダー実装は動的JSONを処理せず(少なくともこのようにはなりません)、処理できないモデルプロパティのデフォルトコンストラクターを呼び出すだけのようです。

4

1 に答える 1

0

プロパティを適切に定義するobjectか、明示的にしたい場合は、Extraプロパティに typeを指定しますJObject

ただし、問題は$.postリクエストにあります。複雑なデータを web.api メソッドに投稿し、モデル バインディングを許可するには、次の 2 つのことを行う必要があります。

  • コンテンツ タイプを「application/json」に設定します
  • JSON.stringifyデータを呼び出してJSONとして送信します

ただし$.post、コンテンツ タイプを指定できないため、以下を使用する必要があります$.ajax

したがって、次の呼び出しはデータをアクションに投稿する必要があります。

$.ajax({
    url: 'http://localhost/api/myController',
    type: 'POST',
    contentType: 'application/json',
    data: JSON.stringify(
    { 
        id: 'someId',               
        extra: { 
            tags: ['a', 'b'],
            anotherValue: 'hello',
            oneMore: { 
                foo: 'bar'
            }
        }
    })
});
于 2013-02-03T21:10:25.813 に答える