使用ajax javascript将int数组传递给MVC控制器

6

我在这里做错了什么?

我可以成功地将4个bool类型的参数传递给控制器。现在,我想将一个int类型的数组传递给我的控制器,但它不起作用-我已经在示例中留下了工作代码(已注释),这样您就可以看到我没有改变太多内容-我认为我错过了一些简单的东西(毕竟现在是17:44!!!)。 我可以使用alert(rolesChecked);语句看到填充了数组:

var rolesChecked = [];
$('[type="checkbox"].role-checkbox').each(function () {
    if (this.checked)
    {
        rolesChecked.push($(this).val());
    }
});

alert(rolesChecked);

//var administrator = $('#cbAdministrator').is(":checked");
//var manager = $('#cbManager').is(":checked");
//var technician = $('#cbTechnician').is(":checked");
//var transcriber = $('#cbTranscriber').is(":checked");

if (rolesChecked.count > 0){//administrator || manager || technician || transcriber) {
    $.ajax({
        url: '@Url.Action("GetFutureHolidays", "Employee")',
        type: 'GET',
        dataType: 'json',
        // we set cache: false because GET requests are often cached by browsers
        // IE is particularly aggressive in that respect
        cache: false,
        data: {
            roleIdXXXs: rolesChecked
            //includeAdministrator: administrator,
            //includeManager: manager,
            //includeTechnician: technician,
            //includeTranscriber: transcriber
        },
        success: function (data) {

            //do something...
        }
    });
}

控制器操作:

public string GetFutureHolidays(List<int> roleIdXXXs)//bool includeAdministrator, bool includeManager, bool includeTechnician, bool includeTranscriber)
{
    //do something
}

使用旧代码时,控制器操作会被调用...但使用数组时,它永远不会被调用...我错过了什么...

此外,我认为 List<int> roleIdXXXs 应该没问题,但我也尝试了 List<string>int[]string[] 以防万一!!!


可能是重复问题:https://dev59.com/NGUo5IYBdhLWcg3wxBwe?rq=1 - Maria Ines Parnisari
4个回答

18

您需要将 traditional: true 的ajax选项添加到数组以将其提交到集合。

$.ajax({
    url: '@Url.Action("GetFutureHolidays", "Employee")',
    type: 'GET',
    dataType: 'json',
    cache: false,
    data: { roleIdXXXs: rolesChecked },
    traditional: true, // add this
    success: function (data) {
    }
});

同时也参考此问题的答案,以获取有关选项功能和生成的表单数据的更多详细信息。


非常棒,谢谢 - 对于任何想知道的人,以上代码可行,控制器可以是:public string GetFutureHolidays(List<int> roleIdXXXs) - Percy
我选择这个作为答案,因为我不需要在控制器中从JSON字符串反序列化。 - Percy
我已经寻找这个答案很长时间了。 - Phate01

1
在你的if语句中,使用rolesChecked.length而不是rolesChecked.count。

谢谢 - 你是唯一一个发现计数错误的人...我对JavaScript很新,rolesChecked.count是未定义的!!!所以ajax查询实际上没有被调用!!!使用rolesChecked.length意味着ajax查询被调用并且控制器动作被触发。然而,我仍然需要设置traditional: true,否则数组不会传递到控制器动作,只是null。谢谢 - Percy
我用你的代码进行了测试,只将"count"更改为"length",一切正常。不确定为什么您必须添加"traditional"。 - JB06
没有使用传统,它总是为空 - 看起来对你来说很奇怪...如果我有机会的话,我会重新测试。 - Percy
你正在使用哪个MVC版本?我不知道这是否与此有关。我用5进行测试。我还尝试了List<int> roleIdXXXs,它也可以工作。 - JB06

1
你无法通过Ajax提交这样的列表,你正在使用的最快修复流程是使用序列化-反序列化过程,可以将其发送为:

roleIdXXXs: JSON.stringify(rolesChecked)

在Action中:

public ActionResult GetFutureHolidays(string rolesChecked)
{
    var test = new JavaScriptSerializer().Deserialize<List<int>>(rolesChecked);
}

0

你应该在 AJAX 调用中使用 JSON.stringify(),像这样:

data: {
            roleIdXXXs: JSON.stringify(rolesChecked)
            //includeAdministrator: administrator,
            //includeManager: manager,
            //includeTechnician: technician,
            //includeTranscriber: transcriber
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接