【问题标题】:MVC ListBox not passing data to ActionMVC ListBox 未将数据传递给 Action
【发布时间】:2012-04-05 22:16:56
【问题描述】:

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

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

我的行动

   public ActionResult GetCS(String[] cntrParam)

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

【问题讨论】:

  • 为什么你的行动采取String[]?如果您将其更改为 string 怎么办?
  • 什么是 selectedPrdLctn?
  • Bhamlin,我也试过 String,但它仍然只收到一个空值。谢谢

标签: jquery asp.net-mvc json


【解决方案1】:

我怀疑问题出在您没有设置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);
});

【讨论】:

  • 达林,首先感谢您的回复。在过去的几个月里,您的见解和帖子对我非常有帮助。我已经使用了您关于使用 jquery/json 处理 dropDownList 的信息。都是好东西!!周末我会试试你上面的建议,让你们都知道。再次感谢您的贡献
  • 达林,我是根据你在这里写的 stackoverflow.com/questions/5497524/… 写的这个页面(顺便说一句很棒的帖子),但将其更改为处理 ListBoxFor。对于级联 ListBox,我认为不需要 Ajax,因为 $.getJSON 处理调用控制器操作。下拉列表是这样,但列表框不是这样?
  • @Mustang31,当你使用$('#mylist').val();,其中mylist 是一个ListBoxFor,那么你会得到一个字符串值的数组,而不是一个单一的字符串值,如果它是一个DropDownListFor。从 jQuery 1.4 开始,数组的序列化方式发生了变化,不再与 ASP.NET MVC 中的默认模型绑定器兼容。这就是您需要使用traditional 参数的原因。
  • 感谢达林的解释!!对此,我真的非常感激。干杯...会试一试:)
  • 达林,成功了!!您的先生是一个巨大的帮助......再次感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2021-04-14
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多