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?

无法让 ASP.NET MVC 6 控制器返回 JSON

ASP.NET MVC 返回 Json 结果?

asp.net mvc 控制器返回 json List<T> 未知错误

JSON 和 ASP.NET MVC