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及以下证明:
一个与此调用的问题可能是事实,你返回View
到ajax
通话。据我所知,这是不可能的。如果您必须发布到此ActionResult
您必须发表帖子。另外,请确保您的路由是正确的。按原样运行此代码将无法到达所需的端点,因为您的ActionResult
被命名为“ExamineeResults”,并且您的网址为“/ Home/Results”。希望这有助于。
错误我的结局。我试图让这个代码对其他人有用,并编辑了一些东西。就路由而言,我仍然在创建mvc应用程序时使用默认路由集。 url:“{controller}/{action}/{id}”, – user3654442
大多数情况下,如果您使用ajax,我使用JsonResult作为返回类型,并且根本不调用视图,只返回Json(myObj)。 – nurdyguy
这是一个很好的方法。我只是使用了OP最初发布的相同代码(使用更通用的ActionResult),但是“JsonResult”可以正常工作。这完全取决于OP想要在行动中实际执行的内容。 –
我的ajax是在一个JavaScript文件,所以我必须使用“主页/结果”,但这并没有解决我的问题。我仍然收到内部500服务器错误。堆栈跟踪显示“无效的JSON图元:FormData”。如果这有助于找出我的问题。 – user3654442