我在ajax post call中使用以下赋值传递表单数据:
data: {model: JSON.stringify(formData) },
model
参数用于告诉stringify方法解析表单数据,因为相同类型的模型与视图绑定。
但是当我将一个JSON bool值返回给ajax方法时,我得到一个源自500内部服务器错误的JSON primitive model is invalid
错误。我认为这也导致我的success function
ajax代码被解雇。
问题: 如何在返回bool值时解决无效的JSON参数错误?
ajax方法:
var formData = $("createForm").serialize();
$.ajax({
type: "POST",
url: '@Url.Action("Index", "CreateEscalation")',
data: {model: JSON.stringify(formData) },
cache: false,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (json) {
if (json.Success) {
window.location.href = json.redirectUrl;
}
else{
$('#submitStatus').text("Error occurred while processing your request, please try again or contact system administrators");
$(this).addClass('alert alert-danger fade in');
$('#submitStatus').show();
}
},
error: function (jqXHR, exception) {
}
});
控制器发布方法:
[HttpPost]
public ActionResult Index(Escalation escalation)
{
try
{
bool success = sqlConnection.InsertWebReq(escalation);
if (success)
{
return Json(new
{
redirectUrl = Url.Action("Index", "EscalationHistory"),
Success = true
});
}
else
{
return Json(new
{
Success = false
});
}
}
catch (Exception ex)
{
return Json(new
{
Success = false
});
}
}
答案 0 :(得分:1)
此:
var formData = $("createForm").serialize();
不为MVC创建有效的JSON来使用。 (https://github.com/maxatwork/form2js)
摘录:
为什么不.serializeArray()?
JQuery的.serializeArray()工作方式有点不同。它通过“对象/嵌套对象的数组”示例中的标记来构建此结构:
[
{ "person.friends[0].email" : "agent.smith@example.com" },
{ "person.friends[0].name" : "Smith Agent" },
{ "person.friends[1].email" : "n3o@example.com" },
{ "person.friends[1].name" : "Thomas A. Anderson" }
]
其次,你是双重编码:
var formData = $("createForm").serialize(); // First encode
$.ajax({
type: "POST",
url: '@Url.Action("Index", "CreateEscalation")',
data: {model: JSON.stringify(formData) }, // Encoding Again ?
所以你是JSON很多垃圾,因为它看起来像:
{
'model' : 'asdf=1&qwer=2'
}
或
{
'model' : '{ asdf:1, qwer:2 }'
}
答案 1 :(得分:0)
根据严格的JSON规范,不允许使用展开的布尔值,这要求所有基元在数组或对象中传递"包装器"。许多JSON序列化/反序列化库确实添加了对未包装原语的支持,但除非您明确知道服务器和客户端库都支持此行为,否则不应指望这种行为。
我的建议是将结果包装在{"result": false}
或{"result": true}
答案 2 :(得分:0)
保持简单并删除contentType: "application/json; charset=utf-8",
等额外参数而非双重编码解决了上述Erik的问题。
以下Ajax方法定义在完成时对我有用:
$.ajax({
url: "@(Url.Action("Index", "CreateEscalation"))",
type: 'POST',
traditional: true,
data: $("#createForm").serialize(),
dataType: "json",
success: function (result) {
//todo: use result
if (result.Success) {
window.location.href = result.redirectUrl;
}
else {
$('#submitStatus').text("Error occurred while processing your request, please try again or contact system administrators");
$(this).addClass('alert alert-danger fade in');
$('#submitStatus').show();
}
}
});
答案 3 :(得分:-1)
我将错误归结为data: {model: JSON.stringify(formData) }
它应该是
data: { 'model': JSON.stringify(formData) }