MVC ListBox没有将数据传递给Action

时间:2012-04-05 22:16:57

标签: jquery asp.net-mvc json

当我使用FireBug时,我看到selectedPrdLctn的选定值正确设置,但当我通过JSON将其传递给我的动作时,它是一个空

        $.getJSON('@Url.Action("GetCS")', { cntrParam: selectedPrdLctn }, function (getCS) {

我的行动

   public ActionResult GetCS(String[] cntrParam)

如果我使用dropDownList,代码可以正常工作。知道为什么我没有通过选择吗?

1 个答案:

答案 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函数并将其作为表示传统参数的第二个参数传递给它。尝试使用truefalse调用它,您将看到FireBug中的差异,如果不设置此参数,您将理解为什么它不起作用。

您还可以为所有AJAX请求全局设置此参数:

$.ajaxSetup({
    traditional: true
});

然后以下内容将起作用:

$.getJSON(this.href, { values: selectedValues }, function (result) {
    alert(result.message);
});