Передача массива объектов в Controller Action с использованием jQuery ajax-запроса с использованием .NET Core 2.2 не работает - PullRequest
0 голосов
/ 31 октября 2019

Массив объектов после строкового преобразования не передается в действие контроллера, а параметр действия (модель) равен null.

Я пробовал много решений этой проблемы в StackOverflow, но ни один изэти решения решили мою проблему. Я предоставил ссылки, которые я попробовал:

Передача массива в mvc Action через AJAX

Передача массива в javascript-объекте в контроллер mvc

Вот мой код

JavaScript Code

$("#FormSubmit").click(function () {
    var datalist = [];

    $("#MarksTable tbody tr").each(function () {

        var obj = {};
        obj.StudentID = 1;
        obj.ExamTimeTableID = 1;
        obj.ClassActivity = $(this).find("td:eq(5) input").val();
        obj.IsPresent = $(this).find("td:eq(7) input").val();
        obj.Assignment = $(this).find("td:eq(6) input").val();
        obj.MidTerm = $(this).find("td:eq(3) input").val();
        obj.Final = $(this).find("td:eq(4) input").val();

        datalist.push(obj);
    });

    $.ajax({
        url: "@Url.Action("InsertData", "Examination")",
        type: "POST",
        cache: false,
        contentType: "application/json;charset=utf-8",
        dataType: "json",
        data: JSON.stringify(datalist),
        success: function (result) {
            alert(result);
        },
        error: function (errormessage) {
            alert(errormessage.responseText);
        }
    });
});

Action of Controller:

[HttpPost]
public JsonResult InsertData([FromBody] List<StudentMarksList> obj)
{

    DynamicParameters param = new DynamicParameters();
    .
    .
    .
    return Json(param.Get<string>("msg"));
}

Модель:

public class StudentMarksList
{
    public int StudentID { get; set; }
    public int ExamTimeTableID { get; set; }
    public int ClassActivity { get; set; }
    public int IsPresent { get; set; }
    public int Assignment { get; set; }
    public int MidTerm { get; set; }
    public int Final { get; set; }
}

ЗапросПолезная нагрузка:

[,…]
0: {StudentID: 1, ExamTimeTableID: 1, ClassActivity: 3, IsPresent: 0, Assignment: 2, MidTerm: 5, Final: 4}
Assignment: 2
ClassActivity: 3
ExamTimeTableID: 1
Final: 4
IsPresent: 0
MidTerm: 5
StudentID: 1

Запрос Источник полезной нагрузки:

[{"StudentID":1,"ExamTimeTableID":1,"ClassActivity":3,"IsPresent":0,"Assignment":2,"MidTerm":5,"Final":4}]

* * * * * * * * * * * * * * * obj должен содержать переданные объекты, но это null.

Любая помощь?

Ответы [ 3 ]

0 голосов
/ 31 октября 2019

Вы также можете попробовать это.

cshtml-страницу, вам нужно добавить один тег form, например,

<div style="display:none;">
<form id="FormPost"></form>
</div>

Jquery Code

$("#FormSubmit").click(function () {

    $("#FormPost").html('');
    $("#MarksTable tbody tr").each(function (index,elem) {

       addHidden("StudentID["+index+"]","1");
       addHidden("ExamTimeTableID["+index+"]","1");
       addHidden("ClassActivity["+index+"]",$(this).find("td:eq(5) input").val());
       addHidden("IsPresent["+index+"]",$(this).find("td:eq(7) input").val());
       addHidden("Assignment["+index+"]",$(this).find("td:eq(6) input").val());
       addHidden("MidTerm["+index+"]",$(this).find("td:eq(3) input").val());
       addHidden("Final["+index+"]",$(this).find("td:eq(4) input").val());
    });

    $.ajax({
        url: "@Url.Action("InsertData", "Examination")",
        type: "POST",
        cache: false,
        contentType: "application/json;charset=utf-8",
        dataType: "json",
        data: $("#FormPost").serialize(),
        success: function (result) {
            alert(result);
        },
        error: function (errormessage) {
            alert(errormessage.responseText);
        }
    });
});

function addHidden(key, value) {   
    var input = document.createElement('input');
    input.type = 'hidden';
    input.name = key;
    input.value = value;
    $("#FormPost").appendChild(input);
}

Действие контроллера:

[HttpPost]
public JsonResult InsertData(List<StudentMarksList> obj)
{

    DynamicParameters param = new DynamicParameters();
    .
    .
    .
    return Json(param.Get<string>("msg"));
}

0 голосов
/ 31 октября 2019

Это может быть динамическое значение одного из свойств объекта ниже, это не число, оно содержит несколько букв алфавита.

var obj = {};
        obj.StudentID = 1;
        obj.ExamTimeTableID = 1;
        obj.ClassActivity = $(this).find("td:eq(5) input").val();//this value could be not a number, ex: 'abc' text
        obj.IsPresent = $(this).find("td:eq(7) input").val();
        obj.Assignment = $(this).find("td:eq(6) input").val();
        obj.MidTerm = $(this).find("td:eq(3) input").val();
        obj.Final = $(this).find("td:eq(4) input").val();

Это будет причиной того, что Asp.Net не сможет десериализовать ваш элемент параметра действия в объект StudentMarksList.

Если приведенное выше не является основной причиной, вы можете ответить на этот вопрос для вывода ошибок сериализации для дальнейшего расследования.

0 голосов
/ 31 октября 2019

[Редактировать] Измените js, как показано ниже:

    function toInt(str){
        var i = parseInt(str);
        return i ? i : 0;
    }

    $("#MarksTable tbody tr").each(function () {

        var obj = {};
        obj.StudentID = 1;
        obj.ExamTimeTableID = 1;
        obj.ClassActivity = toInt( $(this).find("td:eq(5) input").val());
        obj.IsPresent =toInt(  $(this).find("td:eq(7) input").val());
        obj.Assignment = toInt( $(this).find("td:eq(6) input").val());
        obj.MidTerm =toInt(  $(this).find("td:eq(3) input").val());
        obj.Final = toInt( $(this).find("td:eq(4) input").val());

        datalist.push(obj);
    });

Это позволит убедиться, что пустой ввод будет 0 вместо null.


Это потому, что на вашей стороне сервера вы объявляете тип ClassActivity / ClassActivity / Assignment / ... как int, но ваши js отправляют все их какstring. Например, полезная нагрузка, отправляемая на сервер, будет выглядеть примерно так:

[{"StudentID":1,"ExamTimeTableID":1,"ClassActivity":"3","Assignment":"aa","MidTerm":"333333333","Final":"3333"},{"StudentID":1,"ExamTimeTableID":1,"ClassActivity":"","Assignment":"s","MidTerm":"2","Final":"1"},{"StudentID":1,"ExamTimeTableID":1,"ClassActivity":"3","Assignment":"","MidTerm":"2","Final":"1"}]

Пожалуйста, измените тип свойства или преобразуйте результат $(this).find("td:eq(7) input").val() (a string) в int / bool /... введите перед отправкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...