我的目标是建立一个鼠标位置的JSON数组并将它们传递给控制器。出于某种原因,我的json从控制器返回,因为未定义任何人都可以发现我的问题吗?
// Attempt at declaring a JSON object
var personResults = { "answers": [] };
// Onclick I fire in values from mouse event
personResults.answers[count] = { "xpos": mouseX, "ypos": mouseY };
// AJAX Call
$.ajax({
url: "Save",
type: "POST",
contentType: "application/json; charset=utf-8",
data: JSON.stringify(personResults),
success: function (data) { alert(data.toSource()); },
error: function (req, status, error) {
alert("error! " + status + error + req);
}
});
然后我从.NET MVC Controller接收jsontext:
public JsonResult Save(string personResults)
{
return Json(personResults);
}
正如你所看到的,回复到AJAX的响应应该与我发送给它的json相同 - 但我收到了来自服务器的未定义值,即使我的json似乎正在构建Ok并且我已经测试过了 - 这是有效的。
如果我将Save设置为接收类型为“string”,则会收到此警告“(new String(”“))”;如果我将保存动作设置为接收“JsonResult”类型,我会收到此警告:
({ContentEncoding:null, ContentType:null, Data:null, JsonRequestBehavior:1})
我错过了一些完全明显的东西吗?我只想检查我的json是否成功发送到控制器,以便我以后可以操作它!
以下是我的JSON格式:
{"answers":[
{"xpos":293,"ypos":415},{"xpos":293,"ypos":415},{"xpos":293,"ypos":416},
{"xpos":293,"ypos":416},{"xpos":293,"ypos":416},{"xpos":293,"ypos":416},
{"xpos":293,"ypos":416},{"xpos":293,"ypos":416},{"xpos":293,"ypos":416},
{"xpos":293,"ypos":416},{"xpos":293,"ypos":416},{"xpos":293,"ypos":416},
{"xpos":293,"ypos":416},{"xpos":293,"ypos":416},{"xpos":293,"ypos":416},
{"xpos":293,"ypos":416},{"xpos":293,"ypos":416},{"xpos":293,"ypos":416},
{"xpos":293,"ypos":416},{"xpos":293,"ypos":416},{"xpos":293,"ypos":416},
{"xpos":293,"ypos":416},{"xpos":293,"ypos":416},{"xpos":293,"ypos":416},
{"xpos":293,"ypos":416},{"xpos":293,"ypos":416},{"xpos":293,"ypos":416},
{"xpos":293,"ypos":416},{"xpos":293,"ypos":416},{"xpos":293,"ypos":416},
{"xpos":293,"ypos":416},{"xpos":293,"ypos":416},{"xpos":293,"ypos":416},
{"xpos":293,"ypos":416},{"xpos":293,"ypos":416},{"xpos":293,"ypos":416},
{"xpos":293,"ypos":416},{"xpos":293,"ypos":416},{"xpos":293,"ypos":416},
{"xpos":293,"ypos":416},{"xpos":293,"ypos":416},{"xpos":293,"ypos":416}
]}
谢谢!
答案 0 :(得分:1)
我真的不明白你的控制器动作的用处,但如果你只是希望它返回与接收输入相同的JSON字符串,你可以使用Content
方法:
public ActionResult Save(string personResults)
{
return Content(personResults, "application/json");
}
答案 1 :(得分:1)
我如何理解您想要了解的问题如何将数据(输入参数)发送到MVC控制器的操作,这将返回JsonResult
。
您的第一个错误是操作Save
的输入数据应不是JSON格式。 MVC设计更多用于处理表单,因此如果您向Save
操作发送任何数据,则数据必须 url-encoded 。例如,要将“Bla Bla”作为动作personResults
的{{1}}参数的输入,您的jQuery调用应该遵循
Save
最好不要对字符串“Bla Bla”进行任何手动编码,并使用$.ajax({
url: "Home/Save",
type: "POST",
data: "personResults=Bla+Bla",
success: function (data) {
alert(data); },
error: function (req, status, error) {
alert("error! " + status + error );
}
});
代替data: {personResults: "Bla Bla"}
。
如果要将更复杂的数据发送到MVC控制器,可以执行此操作,但必须将数据转换为JSON并手动返回。例如,如果您添加了新动作data: "personResults=Bla+Bla"
:
Save1
其中public JsonResult Save1 (string encodedAnswers) {
JavaScriptSerializer serializer = new JavaScriptSerializer();
MyData data = serializer.Deserialize<MyData> (encodedAnswers);
return Json (data);
}
定义为
MyData
(以同样的方式,您可以使用DataContractJsonSerializer代替JavaScriptSerializer。) 相应的JavaScript代码可以跟随
public class MyData
{
public List<MyPosition> answers { get; set; }
}
public class MyPosition
{
public int xpos { get; set; }
public int ypos { get; set; }
}
答案 2 :(得分:0)
您的$ .Ajax调用正在将数据转换为字符串,而您只返回一个字符串。它可能无法弄清楚如何处理这个问题,而且可能没有必要。
但是,建议您在控制器中尝试此操作:
return Json( new { personResults = personResults } );