Jquery ajax调用在MVC中传递JSON数组(500内部服务器错误)

use*_*442 3 c# ajax asp.net-mvc jquery json

这是我的ajax,当数组有数据时,它被作为函数调用.

function sendDataToController() {
    $.ajax({
        type: 'POST',
        url: '/Home/Results',
        cache: false,
        traditional: true,
        contentType: "application/json",
        data: { FormData : exampleFormData },
        success: function (data) {
            alert("sent data to controller")
        },
        error: function (data) {
            alert("Error " + data.responseText);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

该数组如下所示:

 var exampleFormData = [];
Run Code Online (Sandbox Code Playgroud)

并且JSON目前看起来像这样有一些更多的数据,但缩短了显示目的.

"[{\"Birthdate\":\"1947-03-21\",\"ROWID\":\"000001\",\"SpecCodes\":\"987654\"}]"
Run Code Online (Sandbox Code Playgroud)

在使用ajax发送到控制器之前,此JSON被多次推入阵列.

exampleFormData.push(jsonData);
Run Code Online (Sandbox Code Playgroud)

传入此控件的控件如下所示:

    public ActionResult Results(string exampleFormData)
    {
        var formDataList = JsonConvert.DeserializeObject<List<SampleFormData>>(exampleFormData);

        return View();

    }
Run Code Online (Sandbox Code Playgroud)

这里是模拟"SampleFormData"列表的类

public class SampleFormData
{
    public string Birthdate { get; set; }
    public string ROWID { get; set; }
    public string Score { get; set; }
    public string SpecCodes { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

这样会产生500内部服务器错误.任何人都可以在此处提供有关错误操作的任何输入吗?

编辑:解决方案是完全从ajax中删除contentType行,并由Rion在响应中提供.

Rio*_*ams 5

您提供的可能导致问题的代码需要考虑一些事项.

确保您可以正确发布

为了让Controller实际确认jQuery调用,您需要确保Controller Action使用该[HttpPost] 属性进行修饰,表明它应该用于POST调用:

[HttpPost]
public ActionResult ExamineeResults(string exampleFormData)
{
    // Your code here
}
Run Code Online (Sandbox Code Playgroud)

确保您正在瞄准正确的行动

您当前的AJAX调用是针对性的Home/Results,但实际控制器操作的名称是ExamineeResults.除非您具有某些特定的路由规则,否则应使用现有名称以确保正确定位:

url: '/Home/ExamineeResults',
Run Code Online (Sandbox Code Playgroud)

此外,如果您在View中有此功能,则可以使用该Url.Action()方法解析正确的位置:

url: '@Url.Action("ExamineeResults","Home")'
Run Code Online (Sandbox Code Playgroud)

使用适当的参数

MVC将只知道如何在指定数据时正确映射数据.目前您正在发布您的内容:

data: { FormData : exampleFormData },
Run Code Online (Sandbox Code Playgroud)

这意味着您的Controller Action中的参数名称应该与该名称完全匹配(即FormData代替exampleFormData):

public ActionResult ExamineeResults(string FormData)
Run Code Online (Sandbox Code Playgroud)

将所有这些放在一起

您应该可以通过更新代码来解决此问题,如下所示:

$.ajax({
            type: 'POST',
            // Use Url.Action() to resolve the proper URL
            url: '@Url.Action("ExamineeResults","Home")',
            cache: false,
            // Use JSON.parse() to serialize your content to send accross
            data: { formData: JSON.parse(exampleFormData) },
            success: function (data) {
                alert("sent data to controller")
            },
            error: function (data) {
                alert("Error " + data.responseText);
            }
        });
Run Code Online (Sandbox Code Playgroud)

以及以下控制器操作:

[HttpPost]
// You can let MVC perform the binding for your by mapping your content
// to an array of your SampleFormData objects
public ActionResult ExamineeResults(SampleFormData[] formData)
{
      // Do your thing here (as formData is already serialized)
      return View();
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处查看此示例,并在下面进行说明:

在此输入图像描述