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

C# 在MVC中传递JSON数组的Jquery ajax调用(500内部服务器错误),c#,jquery,json,ajax,asp.net-mvc,C#,Jquery,Json,Ajax,Asp.net Mvc,这是我的ajax,它在数组有数据时作为函数调用 function sendDataToController() { $.ajax({ type: 'POST', url: '/Home/Results', cache: false, traditional: true, contentType: "application/json", data: { FormData : exampleFor

这是我的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);
        }
    });
}
该数组如下所示:

 var exampleFormData = [];
JSON现在看起来像这样,有更多的数据,但为了显示而缩短了

"[{\"Birthdate\":\"1947-03-21\",\"ROWID\":\"000001\",\"SpecCodes\":\"987654\"}]"
在使用ajax发送到控制器之前,该JSON被多次推入阵列

exampleFormData.push(jsonData);
传递到的控件如下所示:

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

        return View();

    }
实际上,这会产生一个500内部服务器错误。有人能提供任何关于这里错误操作的信息吗


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

>你所提供的代码可能有一些事情需要考虑,这可能会导致你的问题。

确保您可以正确发布

为了让您的控制器实际确认jQuery调用,您需要确保控制器操作用属性修饰,指示它应该用于
POST
调用:

[HttpPost]
public ActionResult ExamineeResults(string exampleFormData)
{
    // Your code here
}
确保您的目标是正确的行动

您的AJAX调用当前的目标是
Home/Results
,但是实际控制器操作的名称是
examiceresults
。除非有一些特定的路由规则,否则应使用现有名称以确保正确定位:

url: '/Home/ExamineeResults',
此外,如果您的视图中有此项,则可以使用该方法来解析正确的位置:

url: '@Url.Action("ExamineeResults","Home")'
使用适当的参数

MVC将只知道如何正确地映射您指定的数据。目前,您发布的内容如下:

data: { FormData : exampleFormData },
这意味着控制器操作中的参数名称应与此完全匹配(即
FormData
而不是
exampleFormData
):

将所有这些放在一起

您应该能够通过如下更新代码来解决此问题:

$.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);
            }
        });
以及以下控制器操作:

[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();
}
您可以在下面进行演示:


此调用的一个问题可能是您将
视图
返回到
ajax
调用。据我所知,这是不可能的。如果您必须发布此
ActionResult
,则必须发布。此外,请确保您的路线是正确的。按原样运行此代码不会到达所需的端点,因为您的
ActionResult
名为“检查者结果”,您的url为“/Home/Results”。希望这有帮助。

我这方面的错误。我试图使这段代码对其他人有用,并从中编辑了一些内容。就路由而言,在创建mvc应用程序时,我仍然使用默认路由集。url:“{controller}/{action}/{id}”,大多数时候,如果您使用的是ajax,我使用JsonResult作为返回类型,根本不调用视图,只返回Json(myObj)。这是一种很好的方法。我只是使用OP最初发布的代码(使用更通用的
ActionResult
),但是
JsonResult
就可以了。这完全取决于OP希望在操作中实际执行什么操作。我的ajax位于javascript文件中,因此我必须使用“Home/Results”,但这并没有解决我的问题。我仍然收到一个内部500服务器错误。堆栈跟踪显示“无效的JSON原语:FormData”。如果这有助于解决我的问题。@user3654442您是否能够调试并进入控制器方法?您是否使用任何特定的路由配置?这很好。尽管如果您希望它指向正确的方法,您应该确保实际的控制器操作名为“Results”。如果使用我提供的代码,还可以尝试删除
contentType
声明。您可以使用,它执行post并相应地映射您的类型。
$.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);
            }
        });
[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();
}