【问题标题】:passing an array of int to MVC controller using ajax javascript使用 ajax javascript 将 int 数组传递给 MVC 控制器
【发布时间】:2016-01-06 09:58:38
【问题描述】:

我在这里做错了什么?

我可以成功地将 4 个布尔参数传递给控制器​​。现在我想将一个 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&lt;int&gt; roleIdXXXs 应该没问题,但我也尝试了List&lt;string&gt;int[]string[],以防万一!!!

【问题讨论】:

标签: javascript ajax asp.net-mvc


【解决方案1】:

您需要添加 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) {
    }
});

另请参阅answer to this question,了解有关选项的作用及其生成的表单数据的更多详细信息。

【讨论】:

  • 太棒了,谢谢 - 对于任何想知道的人,上面的作品和控制器可以是:public string GetFutureHolidays(List&lt;int&gt; roleIdXXXs)
  • 我选择了这个作为答案,因为我不需要在控制器中从 json 字符串反序列化。
  • 我一直在寻找这个答案很长时间
【解决方案2】:

在您的 if 语句中,使用 rolesChecked.length 代替 rolesChecked.count

【讨论】:

  • 谢谢 - 你是唯一一个发现计数错误的人......我是 javascript 新手,并且 rolesChecked.count 未定义!!!!所以实际上并没有调用ajax查询!!!!使用 rolesChecked.length 意味着调用 ajax 查询并命中控制器操作。但是我仍然需要设置traditional: true,否则数组不会传递给控制器​​操作,只是 null。谢谢
  • 我用您的代码进行了测试,只将计数更改为长度,一切正常。不知道为什么你必须添加传统的。
  • 如果没有traditional,它总是为空 - 对你来说没问题似乎很奇怪......如果有机会我会重新测试。
  • 您使用的是哪个 MVC 版本?我不知道这是否与它有任何关系。我使用 5 进行测试。我也用List&lt;int&gt; roleIdXXXs 尝试过,它也有效。
【解决方案3】:

你不能从 Ajax 提交这样的列表,你正在使用的过程中最快的解决方法是使用序列化-脱盐过程,你可以将其发送为

roleIdXXXs: JSON.stringify(rolesChecked)

关于行动:

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

【讨论】:

    【解决方案4】:

    你应该在你的 AJAX 调用 lice 上使用 JSON.stringify() 这个:

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

    【讨论】:

      猜你喜欢
      • 2013-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-18
      • 1970-01-01
      • 1970-01-01
      • 2020-03-30
      相关资源
      最近更新 更多