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

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

问题描述:

这是我的ajax在数组中有数据时被调用。Jquery ajax调用在MVC中传递JSON数组(500内部服务器错误)

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(); 

    } 

这里就是模型“SampleFormData”列表

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

} 

由于是,这将产生类500内部服务器错误。任何人都可以提供任何关于在这里做错了什么的输入?

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

有几件事情需要考虑您提供的代码,可能会导致您的问题。

确保您可以发布正确

为了使您的控制器实际上承认了jQuery通话,你需要确保控制器动作装饰与[HttpPost]属性,表示它不应该被用于POST电话:

[HttpPost] 
public ActionResult ExamineeResults(string exampleFormData) 
{ 
    // Your code here 
} 

确保你的目标采取适当的行动

您的AJAX调用目前针对的是Home/Results,但是您的实际控制器操作的名称是ExamineeResults。此外

url: '/Home/ExamineeResults', 

,如果您有这方面您的视图中,可以使用Url.Action()方法来解决:除非你已经制定了一些具体的路由规则,你应该使用现有名称,以确保正确的目标是正确位置:

url: '@Url.Action("ExamineeResults","Home")' 

用适当的参数

MVC将只懂得,你指定它正确的地图数据。目前,你可以发布您的内容,例如:

data: { FormData : exampleFormData }, 

这意味着,在你的控制器动作的参数的名称应与准确(即FormData代替exampleFormData):

public ActionResult ExamineeResults(string FormData) 

了这些关于组建

您应该能够通过更新你的代码来解决这个如下:

$.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(); 
} 

您可以see an example of this here及以下证明:

enter image description here

+0

大多数情况下,如果您使用ajax,我使用JsonResult作为返回类型,并且根本不调用视图,只返回Json(myObj)。 – nurdyguy

+0

这是一个很好的方法。我只是使用了OP最初发布的相同代码(使用更通用的ActionResult),但是“JsonResult”可以正常工作。这完全取决于OP想要在行动中实际执行的内容。 –

+0

我的ajax是在一个JavaScript文件,所以我必须使用“主页/结果”,但这并没有解决我的问题。我仍然收到内部500服务器错误。堆栈跟踪显示“无效的JSON图元:FormData”。如果这有助于找出我的问题。 – user3654442

一个与此调用的问题可能是事实,你返回Viewajax通话。据我所知,这是不可能的。如果您必须发布到此ActionResult您必须发表帖子。另外,请确保您的路由是正确的。按原样运行此代码将无法到达所需的端点,因为您的ActionResult被命名为“ExamineeResults”,并且您的网址为“/ Home/Results”。希望这有助于。

+0

错误我的结局。我试图让这个代码对其他人有用,并编辑了一些东西。就路由而言,我仍然在创建mvc应用程序时使用默认路由集。 url:“{controller}/{action}/{id}”, – user3654442