Контроллер asp.net mvc возвращает json List<T> неизвестная ошибка

Я просто пытаюсь отправить обратно коллекцию List из контроллера в функцию ajax в виде строки JSON и получить ее, чтобы я мог манипулировать представлением.

Я делал это раньше с коллекциями, но не понимаю, в чем проблема, я получаю требуемый json по ссылке на изображение внизу. Однако я не вижу никакой ошибки, кроме «json response - undefined» в другой ссылке для консоли браузера при отладке.

Я уже пробовал: 1. создание нового объекта данных SalaryCalculator (который нормально отправляет обратно) 2. также создал анонимный тип (который снова нормально отправляет сообщения)

Метод контроллера

    [HttpPost]
    public ActionResult GetSalaryCalculation(List<SalaryCalculator> form)
    {
        foreach (var entry in form)
        {
            entry.Tax = TaxCalculation(entry.Salary);
            entry.MonthlyNet = MonthlyCalculation(entry.Salary, entry.Tax);
            entry.WeeklyNet = WeeklyCalculation(entry.MonthlyNet);
            entry.HourlyRate = HourlyCalculation(entry.WeeklyNet, entry.WeeklyHours);

            if (entry.OverTimeHours > 0)
            {
                entry.OvertimeTotal = OvertimeCalculation(entry.OverTimeHours, entry.HourlyRate);
            }

            entry.OvertimeSalaryTotal = TotalCombinedCalculation(entry.MonthlyNet, entry.OvertimeTotal);
            entry.TaxCode = "tax";

            if (entry.Pension > 0)
            {
                entry.Pension = PensionCalculation(entry.OvertimeSalaryTotal, entry.Pension);
            }

            if (entry.StudentLoan > 0)
            {
                entry.StudentLoan = StudentLoanCalculation(entry.OvertimeSalaryTotal, entry.StudentLoan);
            }
        }

        return Json(form, JsonRequestBehavior.AllowGet);
        //return Content(JsonConvert.SerializeObject(form));
    }

AJAX-вызов

initialise: function () {

    $("#calculateAmount").on("click", function () {

        var formData = [
            {
                Salary: $("#salaryAmount").val(),
                WeeklyHours: $("#hoursWorked").val(),
                StudentLoan: $("#studentValidation").val(),
                Pension: $("#pensionValidation").val(),
                OverTimeHours: $("#overtimeValidation").val()
            }
        ];

        //console.info(formDataArray);

        Ajax.fn.ajaxPost("GetSalaryCalculation",
            function (jsonSuccess) {

                console.info(jsonSuccess);
            },
            function (xhr, status, error) {

                console.info(xhr);
                console.info(status);
                console.info(error);
            },
            { form: formData }
        );
    });
}

Обработка AJAX

            $.ajax({
            type: "POST",
            url: "/Home/" + sFunction,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            cache: false,
            data: data === null ? null : JSON.stringify(data),
            success: function (response, status, jqXhr) {

                if (typeof response.d !== "undefined") {
                    onSuccess(response.d, status, jqXhr, passThroughData);

                } else {
                    onSuccess(response, status, jqXhr, passThroughData);
                }
            },
            error: function (jqXhr, status, errorName) {
                // Handle generic errors if they exist, otherwise forward to error handler

                if (jqXhr.status === 401) {
                    // Unauthorised. Force a refresh
                    window.location.href = window.location.href;
                    return;
                }
                else if (status === "timeout") {
                    // Function call timeout

                }
                onError(jqXhr, status, errorName, passThroughData);
            },
            timeout: iTimeoutMillis,
        });

Представление индекса

<form id = "calculateForm">
                <div class = "form-group row">
                    <div class = "col-sm-10">
                        <input type = "text" class = "form-control" id = "salaryAmount" placeholder = "Salary amount £" aria-label = "Salary Amount" aria-describedby = "salary Amount" required>
                    </div>
                </div>
                <div class = "form-group row">
                    <div class = "col-sm-10">
                        <input type = "text" class = "form-control" id = "hoursWorked" placeholder = "Weekly hours worked" aria-label = "Hours Worked" aria-describedby = "Hours Worked" required>
                    </div>
                </div>
                <div class = "form-group row collapse" id = "studentLoan">
                    <div class = "col-sm-10">
                        <input type = "text" class = "form-control" placeholder = "Student loan £" aria-label = "Student Loan" id = "studentValidation" aria-describedby = "Student Loan">
                    </div>
                </div>
                <div class = "form-group row collapse" id = "pensionPayment">
                    <div class = "col-sm-10">
                        <input type = "text" class = "form-control" placeholder = "Pension Payment £" aria-label = "Pension Payment" id = "pensionValidation" aria-describedby = "Pension Payment">
                    </div>
                </div>
                <div class = "form-group row collapse" id = "overtimeAdjustment">
                    <div class = "col-sm-10">
                        <input type = "text" class = "form-control" placeholder = "Overtime hours" aria-label = "Overtime Amount" id = "overtimeValidation" aria-describedby = "Overtime Amount">
                    </div>
                </div>
                <div class = "form-group row">
                    <div class = "col-sm-10">
                        <div class = "form-check">
                            <input class = "form-check-input" type = "checkbox" data-toggle = "collapse" href = "#studentLoan" id = "studentCheck">
                            <label class = "form-check-label" for = "studentLoan">
                                Student loan repayment
                            </label>
                        </div>
                    </div>
                </div>
                <div class = "form-group row">
                    <div class = "col-sm-10">
                        <div class = "form-check">
                            <input class = "form-check-input" type = "checkbox" data-toggle = "collapse" href = "#pensionPayment" id = "pensionCheck">
                            <label class = "form-check-label" for = "pensionPayment">
                                Pension payment
                            </label>
                        </div>
                    </div>
                </div>
                <div class = "form-group row">
                    <div class = "col-sm-10">
                        <div class = "form-check">
                            <input class = "form-check-input" type = "checkbox" data-toggle = "collapse" href = "#overtimeAdjustment" id = "overtimeCheck">
                            <label class = "form-check-label" for = "overtimeAdjustment">
                                Overtime hours
                            </label>
                        </div>
                    </div>
                </div>
                <div class = "form-group row">
                    <div class = "col-sm-10">
                        <button type = "submit" class = "btn btn-outline-primary" id = "calculateAmount">Calculate</button>
                    </div>
                </div>
            </form>

Отображение консоли браузера:

Контроллер asp.net mvc возвращает json List&lt;T&gt; неизвестная ошибка

Действие контроллера, отображающее json:

Контроллер asp.net mvc возвращает json List&lt;T&gt; неизвестная ошибка

отладка контроллера с данными формы, полученными от ajax

если responseJSON не определен, то откуда вы получаете требуемый JSON?

Fakhar Ahmad Rasul 27.05.2019 01:06

Это вывод, который я получаю от контроллера, и это именно то, что я ожидаю, однако я не получаю требуемый успешный ответ в вызове AJAX. Я продолжаю получать неопределенность, и нет другого способа определить, в чем проблема, поскольку все сбои xhr, статус и ошибка не предоставляют никакой информации об объекте.

Matt Cheetham 27.05.2019 01:18

вы отлаживаете OverTimeHours, чтобы проверить результат ??

Shahzad Khan 27.05.2019 11:27

Я думаю, что понял это сейчас, кажется, это данные, которые передаются изначально. Поскольку я указал десятичный тип, он должен быть в десятичном формате, иначе он будет неопределенным по какой-то странной причине.

Matt Cheetham 27.05.2019 13:05

Например, если я просто ввожу целое число, оно дает мне требуемый ответ, но по какой-то причине возвращаемая строка json после анализа дает неопределенную ошибку, если тип неверен. Очень странное поведение, с которым я раньше не сталкивался, поскольку я не понимаю, почему проанализированная строка не будет выводиться в тот момент, когда я могу четко получить правильный результат, который я хочу, и функция ответа ajax не будет знать данные тип

Matt Cheetham 27.05.2019 13:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
314
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я понял проблему, похоже, это было связано с тем, как JavaScript обрабатывает десятичные значения (IE изначально не работает) в сочетании со способом ввода данных из форм ввода.

Явное преобразование пользовательского ввода в Javascript с использованием

parseFloat().toFixed()

Затем передача данных контроллеру через вызов AJAX, кажется, решает проблему, но я собираюсь найти способ вычисления данных другим способом.

Другие вопросы по теме