【问题标题】:Ajax not passing array to Controller Action?Ajax 没有将数组传递给控制器​​动作?
【发布时间】:2016-09-20 20:51:13
【问题描述】:

我搜索了相关问题,但仍然无法在我的情况下使用它。我在 ASP.NET MVC 中工作。

我有一份包含 3 个过滤器的报告。过滤器 1 和 2 只能选择 1 个值。我的第三个过滤器是多选过滤器。我加载了一个包含从多选过滤器中选择的所有值的数组,然后我想将所有 3 个过滤器传递给我的控制器操作。过滤器 1 和 2 正常工作,但我的多选过滤器未通过,并在我的 Actions 参数中显示为 Null。

下面是我的 JavaScript 和 Ajax 调用

$('#applyFilter').click(function () {

            var options = new Array();
            //Fill array with values from Multi Select Filter
            $('#treeFilter > option:selected').each(
                function (i) {
                    options[i] = $(this).text();
                })


            var filter1 =  $('#LOCFilterDropdown').val();
            var filter2 = $('#ESNFilterDropdown').val();

            $.ajax({
                type: "GET",
                url: "/Home/FilterReport",

                data: {
                    filterOne: filter1,
                    filterTwo: filter2,
                    multiselectFilter: options
                },
                success: function (result) {
                    $('#reportTable').html(result);
                }
            });
        });

接收动作

[HttpGet]
public ActionResult FilterReport(string filterOne,string filterTwo, int? page, List<string> multiselectFilter)
{
     //filterOne contains correct value
     //filterTwo contsins correct value
     //multiSelectFilter contains null

     //returns partial view

}

谁能告诉我为什么我的

List<string> multiselectFilter
//Iv also tried string[] multiselectFilter, but this didnt change anything

现在正在接收来自 ajax 调用的数组吗?

【问题讨论】:

  • 你的html是什么样子的
  • @pparas 我相信 html 很好。我使用 Console.Log() 测试了数组以查看数组的内容。数组里面有正确的值。
  • @pparas 这就是我创建过滤器列表的方式,必须删除 razor 语法中的 @ 才能发布此评论。
  • 嗯...在某处需要JSON.stringify()GET 方法太多了?当数据到达控制器但未正确映射时,请求中是否存在数据?只是大声思考......

标签: javascript c# jquery asp.net ajax


【解决方案1】:

您正在尝试使用 GET 方法发送一个复杂的对象。失败的原因是 GET 方法不能有正文,并且所有值都被编码到 URL 中。

类似问题

Complex type is getting null in a ApiController parameter

我只想在客户端加入 Multiselectfilter 并在服务器端拆分它们

 multiselectFilter: options.join(',')
[HttpGet]
    public ActionResult FilterReport(string filterOne, string filterTwo, int? page, string multiselectFilter)
    {
        string[] array = multiselectFilter.Split(',');

        //returns partial view

    }

【讨论】:

  • 完美,谢谢。我还尝试根据您的回答将“GET”更改为“POST”,这也有效。
【解决方案2】:

我创建了一个小提琴here。我认为您可能对序列化有疑问。虽然我不是百分百确定。这是序列化 options = JSON.stringify(options); 的代码,就像前面的答案所说的那样。

【讨论】:

  • 谢谢你的例子。我不能在 GET 请求中使用复杂对象是对的。
【解决方案3】:

您也可以尝试在您的 ajax 调用 add 中添加这些:

dataType: "json",
traditional: true

如果选项数组可以变大,我会使用 POST 以避免达到 url 最大长度限制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 2011-02-18
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多