35

以下の ajax で以下の Post メソッドを呼び出すと、パラメーターが常に null になるのはなぜですか?

public IEnumerable<string> Post([FromBody]string value)
{
    return new string[] { "value1", "value2", value };
}

ajax を介した Web API メソッドの呼び出しは次のとおりです。

  function SearchText() {
        $("#txtSearch").autocomplete({
            source: function (request, response) {
                $.ajax({
                    type: "POST",
                    contentType: "application/json; charset=utf-8",
                    url: "api/search/",
                    data: "test",
                    dataType: "text",
                    success: function (data) {
                        response(data.d);
                    },
                    error: function (result) {
                        alert("Error");
                    }
                });
            }
        });
    }
4

4 に答える 4

60
$.ajax({
    url: '/api/search',
    type: 'POST',
    contentType: 'application/x-www-form-urlencoded; charset=utf-8',
    data: '=' + encodeURIComponent(request.term),
    success: function (data) {
        response(data.d);
    },
    error: function (result) {
        alert('Error');
    }
});

基本的に、属性で装飾されたスカラータイプのパラメーターは1つだけにすることができ[FromBody]、リクエストで使用する必要がapplication/x-www-form-urlencodedあり、POSTペイロードは次のようになります。

=somevalue

標準プロトコルとは異なり、パラメータ名が欠落していることに注意してください。値のみを送信しています。

WebApiでのモデルバインディングがどのように機能するかについて詳しくは、をご覧くださいthis article

しかしもちろん、このハッキングはうんざりすることです。ビューモデルを使用する必要があります。

public class MyViewModel
{
    public string Value { get; set; }
}

次に、[FromBody]属性を削除します。

public IEnumerable<string> Post(MyViewModel model)
{
    return new string[] { "value1", "value2", model.Value };
}

次に、JSONリクエストを使用します。

$.ajax({
    url: '/api/search',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify({ value: request.term }),
    success: function (data) {
        response(data.d);
    },
    error: function (result) {
        alert('Error');
    }
});
于 2013-01-31T11:25:12.563 に答える
14

[FromBody]JSONコンテンツタイプの属性に単純タイプを使用することはできません。Visual Studioのデフォルトには本文からの文字列がありますが、これはapplication/x-www-form-urlencodedコンテンツタイプ用です。

文字列値をプロパティとして基本モデルクラスに配置すると、デシリアライザーが機能します。

public class SimpleModel()
{
    public string Value {get;set;}
}

public IEnumerable<string> Post([FromBody]SimpleModel model)
{
    return new string[] { "value1", "value2", model.Value };
}

送信先のJSONを変更します。

{"Value":"test"}
于 2013-01-31T11:17:35.493 に答える