asp.net mvc контроллер возвращает json список <T>неизвестная ошибка - PullRequest
0 голосов
/ 27 мая 2019

Я просто пытаюсь отправить обратно коллекцию 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 call

initialise: function () {

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

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

        //console.log(formDataArray);

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

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

                console.log(xhr);
                console.log(status);
                console.log(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>

Дисплей консоли браузера:

browser console display

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

controller action displaying json

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

1 Ответ

0 голосов
/ 24 июня 2019

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

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

parseFloat (). ToFixed ()

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

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