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

时间:2015-10-08 16:45:13

标签: javascript ajax asp.net-mvc

我在这里做错了什么?

我可以成功将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[]以防万一!{/ p>

4 个答案:

答案 0 :(得分:12)

您需要添加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以获取有关选项的作用及其生成的表单数据的更多详细信息。

答案 1 :(得分:1)

在if语句中,使用rolesChecked.length

而不是rolesChecked.count

答案 2 :(得分:1)

您无法从Ajax提交这样的列表,您正在使用的过程中最快的修复是使用序列化 - 脱盐过程,您可以将其作为

发送
  

roleIdXXXs: JSON.stringify(rolesChecked)

on Action:

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

答案 3 :(得分:0)

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

    FForm.prototype._validade = function() {
    var fld = this.fields[this.current],
        input = fld.querySelector( 'input' ) || fld.querySelector( 'textarea' ) || fld.querySelector( 'select' ),
        error,
        data = {'form_class': this.form_class, 'field': fld.querySelector('input').name, 'data': fld.querySelector('input').value},
        $this = this;
        $.ajax({
          type: "POST",
          url: '/core/validate_field',
          data: data,
          dataType:'json',
        }).done(function(data){
            if (data['status'] === 'error') {
                error = data['message'];
                $this._showError( error );
                return false;
            }
            return true;
        }

        )

}