当我使用FireBug时,我看到selectedPrdLctn的选定值正确设置,但当我通过JSON将其传递给我的动作时,它是一个空
$.getJSON('@Url.Action("GetCS")', { cntrParam: selectedPrdLctn }, function (getCS) {
我的行动
public ActionResult GetCS(String[] cntrParam)
如果我使用dropDownList,代码可以正常工作。知道为什么我没有通过选择吗?
答案 0 :(得分:2)
我怀疑问题来自于您没有设置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
函数并将其作为表示传统参数的第二个参数传递给它。尝试使用true
和false
调用它,您将看到FireBug中的差异,如果不设置此参数,您将理解为什么它不起作用。
您还可以为所有AJAX请求全局设置此参数:
$.ajaxSetup({
traditional: true
});
然后以下内容将起作用:
$.getJSON(this.href, { values: selectedValues }, function (result) {
alert(result.message);
});