无法成功接收到.NET MVC控制器的JSON数据

时间:2010-10-01 15:05:58

标签: .net asp.net-mvc json

我的目标是建立一个鼠标位置的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}
]}

谢谢!

3 个答案:

答案 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 } );