web-dev-qa-db-ja.com

jQuery getJsonを使用してリスト/配列をパラメーターとして送信する

リスト/配列を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) { }

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

24

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);
}
39
Darin Dimitrov

Darinが示唆するように.ajax()ではなく.getJSON()を呼び出すか、jrduncansが示唆するようにグローバル_jQuery.ajaxSettings.traditional_をtrueに設定することに加えて、呼び出しの結果を渡すこともできます- paramsオブジェクトのjQuery .param() function

_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');
});    
_
22
hippietrail

残念ながら、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 ( 'traditional'を検索)

6
jrduncans

ビューで 複数の名前付きフィールド を生成します(idはフィールドごとに一意である必要があるため、idではありません)。 Nameではないname

@foreach (var item in Model.SomeDictionary)
{
    @Html.TextBoxFor(modelItem => item.Value.SomeString, new { Name = "someString[]" })
}

次に、jQueryを使用して入力フィールド値を取得します so

var myArrayValues = $('input[name="someString[]"]').map(function () { return $(this).val(); }).get();

これをjQuery/AJAXで次のように直接使用できます。

$.ajax({
    type: "POST",
    url: "/MyController/MyAction",
    dataType: 'json',
    data: {
        someStrings: $('input[name="someString[]"]').map(function () { return $(this).val(); }).get(),
        someDates: $('input[name="someDate[]"]').map(function () { return $(this).val(); }).get(),

次に、MVCのコントローラーアクションで:

[HttpPost]
public JsonResult MyAction(string[] someStrings, DateTime[] someDates...
0
SharpC