Как отправить массив JavaScript на контроллер из Ajax - PullRequest
0 голосов
/ 28 января 2019

Невозможно получить значения объектов в контроллере из сообщения ajax.

У меня есть таблица данных jQuery с первым столбцом, в котором установлены флажки, и мне нужно вернуть выбранные идентификаторы строк в контроллер.Я могу получить все, что мне нужно, но в контроллере он всегда равен нулю.

 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)
    {}

При нажатии кнопки массив 'values' заполняется идентификатором, если поле было выбрано (работает нормально), то этопревратился в объект 'data', чтобы соответствовать сигнатуре метода и модели и stringify'd.При достижении точки останова в методе контроллера значения никогда не появляются.Чего мне не хватает?

    **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 голосов
/ 29 января 2019

Вы должны вставить идентификаторы как обычные объекты javascript:

 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; }
}
0 голосов
/ 01 февраля 2019

Итак, мое Обновление № 3 работает, и теперь у меня другая проблема, поэтому я опубликую новый вопрос для этого.

0 голосов
/ 28 января 2019

Если это ваш 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> - это массив ваших значений, который вы привязываете к id в своем объекте JSON.Контроллер остается прежним.

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