11

これは私のクライアント側の ajax 呼び出しです:

    var list = ["a", "b", "c", "d"];

    var jsonText = { data: list };

    $.ajax({
        type: "POST",
        url: "/api/scheduledItemPriceStatus/updateStatusToDelete",
        data: jsonText,
        dataType: "json",
        traditional: true,
        success: function() { alert("it worked!"); },
        failure: function() { alert("not working..."); }
    });

これはクロムネットワークヘッダーです:

Request URL:http://localhost:2538/api/scheduledItemPriceStatus/updateStatusToDelete

Request Method:POST

Request Headersview source

Accept:application/json, text/javascript, */*; q=0.01

Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3

Accept-Encoding:gzip,deflate,sdch

Accept-Language:en-US,en;q=0.8

Connection:keep-alive

Content-Length:27

Content-Type:application/x-www-form-urlencoded; charset=UTF-8

Host:localhost:2538

Origin:http://localhost:2538

Referer:http://localhost:2538/Pricing/ScheduledItemPrices

User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11

X-Requested-With:XMLHttpRequest

フォーム データビュー URL エンコード

data:a
data:b
data:c
data:d

これは私のwebapiコントローラーメソッドです:

public HttpResponseMessage UpdateStatusToDelete(string[] data)

結果:

デバッグすると、UpdateStatusToDelete のデータ パラメータが{string[0]}data:a data:b data:c data:d の代わりに返されます

私は何を間違っていますか?どんな助けでも本当に感謝しています。

4

7 に答える 7

34

単純な型を渡すために、投稿するデータは、名前部分が空の文字列である名前と値のペアの形式をとる必要があります。したがって、次のようにAjax呼び出しを行う必要があります。

$.ajax({
  type: "POST",
  url: "/api/values",
  data: { "": list },
  dataType: "json",
  success: function() { alert("it worked!"); },
  failure: function() { alert("not working..."); }
});

さらに、Web APIアクションで、[FromBody]属性を使用して注釈を付けます。何かのようなもの:

public void Post([FromBody]string[] values)

それでうまくいくはずです。

于 2013-01-11T22:55:43.040 に答える
4

listそれをラップする他のオブジェクトではなく、それ自体を渡す必要があります。

たとえば、次を渡します。

var list = ["a", "b", "c", "d"];

$.ajax({
        type: "POST",
        url: "/api/scheduledItemPriceStatus/updateStatusToDelete",
        // Pass the list itself
        data: list, 
        dataType: "json",
        traditional: true,
        success: function() { alert("it worked!"); },
        failure: function() { alert("not working..."); }
    });

サーバー上のメソッド署名は正しいです。

于 2014-12-08T07:21:04.643 に答える
2

使用するvar jsonText = { data: JSON.stringify(list)}

于 2013-01-08T05:52:44.840 に答える
0

dataType を設定しても役に立ちません。

これが私のやり方です:

var SizeSequence = {};
SizeSequence.Id = parseInt(document.querySelector("dd#Sequence_Id").textContent);
SizeSequence.IncludedSizes = [];
var sizes = document.querySelectorAll("table#IncludedElements td#Size_Name");
// skipping the first row (template)
for (var i = 1, l = sizes.length ; i != sizes.length ; SizeSequence.IncludedSizes.push(sizes[i++].textContent));

$.ajax("/api/SizeSequence/" + SizeSequence.Id, { 
     method: "POST",
     contentType: "application/json; charset=UTF-8",
     data: JSON.stringify(SizeSequence.IncludedSizes), 
...

サーバー部分

// /api/SizeSequence/5
public async Task<IHttpActionResult> PostSaveSizeSequence(int? Id, List<String> IncludedSizes)
    {
        if (Id == null || IncludedSizes == null || IncludedSizes.Exists( s => String.IsNullOrWhiteSpace(s)))
            return BadRequest();
        try
        {

            await this.Repo.SaveSizeSequenceAsync(Id.Value, IncludedSizes );
            return Ok();
        }
        catch ( Exception exc)
        {
            return Conflict();
        }
    }

参考文献

jQuery.ajax()

于 2015-05-29T18:07:32.800 に答える