如何从Ajax将JavaScript数组发送到控制器

时间:2019-01-28 20:27:01

标签: asp.net-core asp.net-mvc-5 asp.net-ajax

无法从ajax帖子中获取控制器中的对象值。

我有一个jQuery数据表,其中第一列是复选框,我需要将所选的行ID返回给控制器。我可以得到所需的一切,但在控制器中始终为空。

 Model:
    public class Values
    {
        public Guid ID { get; set; }
    }


View JS & Ajax on button click:
    function SubAll() {
        var values = [];

    $('#timesheet').find('input[type="checkbox"]:checked').each(function (index, rowId) {
            //this is the current checkbox
            var temp = $(this).closest('tr').attr('id');

            if (String(temp) === String("undefined")) {
                //skip; it is the select all box
            }
            else {
                //push to array
                values.push(temp);
            }
        });

        console.log(values);
        var data = { ID: values };
        console.log(data);

        $.ajax({
            url: "@Url.Action("ApproveAllTimesheets", "Admin")",
            type: 'POST',
            data: JSON.stringify(data),
            dataType: 'json',
            success: function (result) {
                alert(result);
            },
            error: function (xhr, textStatus) {
                if (xhr.status == 401) { alert("Session Expired!"); window.location = "/Account"; }
                else {
                    alert('Content load failed!', "info");
                }
            }
        });
    };


Controller:
    [HttpPost]
    [ValidateAntiForgeryToken]
    public void ApproveAllTimesheets(List<Values> value)
    {}

如果选择了一个框(正常工作),则在按钮上单击“值”数组将填充ID,然后将其转换为对象“数据”以匹配方法签名和模型并进行字符串化。当在控制器方法上命中断点时,值将永远不会存在。我想念什么?

    **UPDATE:**
    function SubAll() {
        var values = [];

        $('#timesheet').find('input[type="checkbox"]:checked').each(function (index, rowId) {
            //this is the current checkbox
            var temp = $(this).closest('tr').attr('id');

            if (String(temp) === String("undefined")) {
                //skip; it is the select all box
            }
            else {
                //push to array
                values.push({ Id: temp });
            }
        });

        console.log(values);

        $.ajax({
            url: "/Admin/ApproveAllTimesheets",
            type: "POST",
            data: values,
            dataType: "html",
            contentType: "application/x-www-form-urlencoded; charset=UTF-8",
            success: function (result) {
                alert(result);
            },
            error: function (xhr, textStatus) {
                if (xhr.status == 401) { alert("Session Expired!"); window.location = "/Account"; }
                else {
                    alert('Content load failed!', "info");
                }
            }
        });
    };

    **Method Signature:**
    public IActionResult ApproveAllTimesheets( List<Value> values)

    **Class**
     public class Value
     {
        public Guid ID { get; set; }
     }

更新#3

    Model:
    public class Value
    {
        public string TimeId { get; set; }
    }

    Ajax:
    function SubAll() {
        //var selectedValues = $('#timesheet').DataTable().column(0).checkboxes.selected().toArray();
        var dataJSON = { TimeId: "test" };

        console.log(dataJSON);

        $.ajax({
            url: "/Admin/ApproveAllTimesheets",
            type: "POST",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            data: JSON.stringify(dataJSON),
            success: function (result) {
                alert(result);
            },
            error: function (xhr, textStatus) {
                if (xhr.status == 401) { alert("Session Expired!"); window.location = "/Account"; }
                else {
                    alert('Content load failed!', "info");
                }
            }
        });
      };

    Controller:
    public ActionResult ApproveAllTimesheets([FromBody]Value information)

3 个答案:

答案 0 :(得分:0)

如果这是您的JSON

{ <-- This here is the start of your object
    "id": 1;
}

这需要绑定到模型

class AnyModel {
    public int Id {get; set;}
}

如果您有JSON列表

{
  [
    ...Some objects
  ]
}

您需要在控制器中接受一个模型

class AnyModel {
   public List<SomeOtherModel> ListObject {get; set;}
}

更新

您想将“值”列表存储在另一个模型中。

class Value {
    public Guid Id {get;set;}
}

class ValueContainer {
   public List<Value> Values {get; set;}
}

现在,您要将JSON绑定到ValueContainer对象。发送JSON时,您需要[FromBody]才能将JSON绑定到模型。

public IActionResult ApproveAllTimesheets([FromBody] ValueContainer values) {}

更新2

道歉,仔细研究一下您的JS代码(旧代码),您应该使用以下结构:

class ValueContainer {
   public List<Guid> Id {get; set;}
}

List<Guid>是您的values数组,您将其绑定到JSON对象中的id。控制器保持不变。

public IActionResult ApproveAllTimesheets([FromBody] ValueContainer values) {}

答案 1 :(得分:0)

您应该像javascript普通对象一样插入ID:

 values.push({
            ID: "d88b44e4-1009-47d6-9f2f-f675dca89fe8",

        });

以下代码供您参考:

function SubAll() {
    var values = [];
    values.push({
        ID: "d88b44e4-1009-47d6-9f2f-f675dca89fe6",

    });
    values.push({
        ID: "d88b44e4-1009-47d6-9f2f-f675dca89fe7",

    });
    values.push({
        ID: "d88b44e4-1009-47d6-9f2f-f675dca89fe8",

    });


    $.ajax({
        type: "POST",
        url: "/Admin/ApproveAllTimesheets",
        contentType: "application/json; charset=utf-8",
        data: JSON.stringify(values),
        success: function (result) {
            alert(result);
        },
        error: function (xhr, textStatus) {
            if (xhr.status == 401) { alert("Session Expired!"); window.location = "/Account"; }
            else {
                alert('Content load failed!', "info");
            }
        }
    });

};

控制器:

public void ApproveAllTimesheets([FromBody]List<Values> value)
{

}

型号:

public class Values
{
    public Guid ID { get; set; }
}

答案 2 :(得分:0)

所以我的Update#3正在运行,现在我遇到了另一个问题,因此我将为此发布一个新问题。