26

リスト/配列をMVCコントローラーメソッドに送信しようとしている場所は次のとおりです。

var id = [];
var inStock = [];

$table.find('tbody>tr').each(function() {
    id.push($(this).find('.id').text());
    inStock.push($(this).find('.stocked').attr('checked'));
});

var params = {};
params.ids = id;
params.stocked = inStock; 

$.getJSON('MyApp/UpdateStockList', params, function() {
    alert('finished');
});    

私のコントローラーで:

public JsonResult UpdateStockList(int[] ids, bool[] stocked) { }

両方のパラメータがnullです。

パラメータを単一のアイテムに変更した場合は注意してください

params.ids = 1;
params.stocked = true; 

public JsonResult UpdateStockList(int ids, bool stocked) { }

その後は問題なく動作するので、ルーティングの問題ではないと思います。

4

4 に答える 4

41

traditionalフラグを設定してみてください:

$.ajax({
    url: '/home/UpdateStockList',
    data: { ids: [1, 2, 3], stocked: [true, false] },
    traditional: true,
    success: function(result) {
        alert(result.status);
    }
});

以下で正常に動作します:

public ActionResult UpdateStockList(int[] ids, bool[] stocked)
{
    return Json(new { status = "OK" }, JsonRequestBehavior.AllowGet);
}
于 2010-09-09T13:42:33.150 に答える
23

.ajax()Darin が提案する代わりに呼び出す.getJSON()か、グローバルjQuery.ajaxSettings.traditionaltruejrduncans が提案するように設定する以外に、オブジェクトで jQuery.param()関数を呼び出した結果を渡すこともできます。params

var id = [];
var inStock = [];

$table.find('tbody>tr').each(function() {
    id.push($(this).find('.id').text());
    inStock.push($(this).find('.stocked').attr('checked'));
});

var params = {};
params.ids = id;
params.stocked = inStock; 

$.getJSON('MyApp/UpdateStockList', $.param(params, true), function() {
    alert('finished');
});    
于 2011-12-21T10:33:19.653 に答える
6

残念ながら、jquery は jQuery.ajax でこの動作を切り替えるための「従来の」フラグを提供しているように見えますが、jQuery.getJSON ではそうではありません。これを回避する 1 つの方法は、フラグをグローバルに設定することです。

jQuery.ajaxSettings.traditional = true;

jQuery.param のドキュメントを参照してください: http://api.jquery.com/jQuery.param/ この変更に関するリリース ノートも参照してください: http://jquery14.com/day-01/jquery-14 (「伝統的')

于 2010-10-20T17:47:34.003 に答える