Я просто пытаюсь отправить обратно коллекцию 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>
Отображение консоли браузера:
Действие контроллера, отображающее json:
Это вывод, который я получаю от контроллера, и это именно то, что я ожидаю, однако я не получаю требуемый успешный ответ в вызове AJAX. Я продолжаю получать неопределенность, и нет другого способа определить, в чем проблема, поскольку все сбои xhr, статус и ошибка не предоставляют никакой информации об объекте.
вы отлаживаете OverTimeHours, чтобы проверить результат ??
Я думаю, что понял это сейчас, кажется, это данные, которые передаются изначально. Поскольку я указал десятичный тип, он должен быть в десятичном формате, иначе он будет неопределенным по какой-то странной причине.
Например, если я просто ввожу целое число, оно дает мне требуемый ответ, но по какой-то причине возвращаемая строка json после анализа дает неопределенную ошибку, если тип неверен. Очень странное поведение, с которым я раньше не сталкивался, поскольку я не понимаю, почему проанализированная строка не будет выводиться в тот момент, когда я могу четко получить правильный результат, который я хочу, и функция ответа ajax не будет знать данные тип
Я понял проблему, похоже, это было связано с тем, как JavaScript обрабатывает десятичные значения (IE изначально не работает) в сочетании со способом ввода данных из форм ввода.
Явное преобразование пользовательского ввода в Javascript с использованием
parseFloat().toFixed()
Затем передача данных контроллеру через вызов AJAX, кажется, решает проблему, но я собираюсь найти способ вычисления данных другим способом.
если responseJSON не определен, то откуда вы получаете требуемый JSON?