リスト/配列を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) { }
その後、問題なく動作するので、ルーティングの問題ではないと思います。
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);
}
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');
});
_
残念ながら、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'を検索)
ビューで 複数の名前付きフィールド を生成します(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...