問題は、traditional
パラメータを設定しておらず、デフォルトのモデル バインダーが理解できる形式で jQuery がコレクションを送信しないことが原因であると思われます。jQuery 1.4 以降を使用している場合は、このパラメーターを設定する必要があります。
例えば:
モデル:
public class MyViewModel
{
public string[] SelectedValues { get; set; }
public IEnumerable<SelectListItem> Items { get; set; }
}
コントローラ:
public class HomeController : Controller
{
public ActionResult Index()
{
var model = new MyViewModel
{
Items = new[]
{
new SelectListItem { Value = "1", Text = "item 1" },
new SelectListItem { Value = "2", Text = "item 2" },
new SelectListItem { Value = "3", Text = "item 3" },
new SelectListItem { Value = "4", Text = "item 4" },
}
};
return View(model);
}
public ActionResult GetCS(string[] values)
{
return Json(new
{
message = string.Format("{0} item(s) selected", values.Length)
}, JsonRequestBehavior.AllowGet);
}
}
意見:
@model MyViewModel
@Html.ListBoxFor(
x => x.SelectedValues,
Model.Items,
new {
id = "mylist",
}
)
@Html.ActionLink("Send AJAX", "getcs", null, new { id = "mylink" })
脚本:
$(function () {
$('#mylink').click(function () {
var selectedValues = $('#mylist').val();
$.getJSON(this.href, $.param({ values: selectedValues }, true), function (result) {
alert(result.message);
});
return false;
});
});
この関数をどのように使用し$.param
、従来のパラメーターを表す 2 番目の引数として true を渡すかに注意してください。true
andで呼び出してみるとfalse
、FireBug の違いがわかり、このパラメーターを設定しないと機能しない理由がわかります。
このパラメータをすべての AJAX リクエストに対してグローバルに設定することもできます。
$.ajaxSetup({
traditional: true
});
そして、以下が機能します:
$.getJSON(this.href, { values: selectedValues }, function (result) {
alert(result.message);
});