asp.net mvc 控制器返回 json List<T> 未知错误
Posted
技术标签:
【中文标题】asp.net mvc 控制器返回 json List<T> 未知错误【英文标题】:asp.net mvc controller return json List<T> unknown error 【发布时间】:2019-10-12 13:14:56 【问题描述】:我只是试图将 List 集合作为 JSON 字符串从控制器发送回 ajax 函数,以便接收它以便我可以操作视图。
我以前用集合做过这个,但我看不出问题是什么,我根据底部的图像链接获得了所需的 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.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>
浏览器控制台显示:
显示 json 的控制器动作:
controller debugging with form data recieved from ajax
【问题讨论】:
如果 responseJSON 未定义,那么您从哪里获得所需的 JSON? 这是我从控制器获得的输出,这正是我所期望的,但是我没有在 AJAX 调用中获得所需的成功响应。我一直未定义,没有其他方法可以说明问题是什么,因为所有失败 xhr、状态和错误都没有提供有关对象的任何信息 你有没有调试过OverTimeHours来检查结果?? 我想我现在已经弄清楚了,它似乎是最初通过的数据。因为我已经指定了十进制类型,所以它必须是十进制格式,否则由于某些奇怪的原因它将是未定义的。 例如,如果我只输入一个整数,它会给我所需的响应,但由于某种原因,如果类型不正确,一旦解析返回的 json 字符串会给出未定义的错误。非常奇怪的行为,我以前没有遇到过,因为当我可以清楚地得到我想要的正确输出并且 ajax 响应函数不知道数据时,我不明白为什么解析的字符串不会在那时输出输入 【参考方案1】:我已经找到了问题所在,这似乎与 javascript 处理十进制值的方式(IE 它本身不是)以及从输入表单输入数据的方式有关。
使用 Javascript 显式转换用户输入
parseFloat().toFixed()
然后通过 AJAX 调用将数据传递给控制器似乎可以解决问题,但我将寻找一种方法以另一种方式计算数据。
【讨论】:
以上是关于asp.net mvc 控制器返回 json List<T> 未知错误的主要内容,如果未能解决你的问题,请参考以下文章
如何从 ASP.NET MVC 控制器方法返回由 JSON.NET 序列化的 camelCase JSON?
如何在 ASP.NET MVC/Web 控制器中返回 JSON?