Невозможно успешно получить данные JSON в .NET MVC Controller - PullRequest
0 голосов
/ 01 октября 2010

Я собираюсь создать 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);
    }
});

Затем я получаю jsontext от моего контроллера .NET MVC:

public JsonResult Save(string personResults)
{
    return Json(personResults);
}

Как выЯ вижу, что ответ на AJAX должен быть тем же самым json, который я отправил на него - но я получаю неопределенные значения обратно с сервера, даже если мой json, кажется, создает Ok, и я проверил его - он действителен.

Если я установил Сохранить для получения типа "строка", я получу это предупреждение "(новая строка (" "))";если я установил действие сохранения для получения типа "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 ]

1 голос
/ 02 октября 2010

Как я понимаю ваш вопрос, вы хотите знать как отправить данные (входные параметры) на действие вашего контроллера MVC , который вернет JsonResult обратно.

Ваша первая ошибка заключается в том, что входные данные действия Save должны быть не в формате JSON . MVC больше предназначен для работы с формами, поэтому, если вы отправляете какие-либо данные в действие Save, эти данные должны быть в кодировке URL . Например, чтобы иметь «Bla Bla» в качестве ввода personResults параметра действия Save, ваш вызов jQuery должен следовать

$.ajax({
    url: "Home/Save",
    type: "POST",
    data: "personResults=Bla+Bla",
    success: function (data) {
        alert(data); },
    error: function (req, status, error) {
        alert("error! " + status + error );
    }
});

Лучше не делать никакого ручного кодирования строки "Bla Bla" и использовать data: {personResults: "Bla Bla"} вместо data: "personResults=Bla+Bla".

Если вы хотите отправить более сложные данные на контроллер MVC, вы можете сделать это, но вам нужно преобразовать данные в JSON и обратно вручную. Например, если вы включаете новое действие Save1:

public JsonResult Save1 (string encodedAnswers) {
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    MyData data = serializer.Deserialize<MyData> (encodedAnswers);
    return Json (data);
}

, где MyData определяется как

public class MyData
{
    public List<MyPosition> answers { get; set; }
}
public class MyPosition
{
    public int xpos { get; set; }
    public int ypos { get; set; }
}

(Точно так же вы можете использовать DataContractJsonSerializer вместо JavaScriptSerializer .) Соответствующий код JavaScript может быть следующим

var personResults = {"answers":[{"xpos":293, "ypos":415 },{"xpos":293, "ypos":416}]};
// or var personResults = {answers: [{xpos: 293, ypos: 415},{xpos: 293, ypos: 416}]};

$.ajax({
    url: "Home/Save1",
    type: "POST",
    data: {encodedAnswers: JSON.stringify(personResults)},
    success: function (data) {
        alert("answers[0].xpos="+data.answers[0].xpos); },
    error: function (req, status, error) {
        alert("error! " + status +    error );
    }
});
1 голос
/ 01 октября 2010

Я действительно не понимаю полезности вашего действия контроллера, но если вы просто хотите, чтобы он возвращал ту же строку JSON, что и полученную в качестве ввода, вы можете использовать метод Content:

public ActionResult Save(string personResults)
{
    return Content(personResults, "application/json");
}
0 голосов
/ 01 октября 2010

Ваш вызов $ .Ajax превращает данные в строку, а вы возвращаете просто строку.Возможно, он не сможет понять, как это обрабатывать, и в этом нет необходимости.

Тем не менее, рекомендуем вам попробовать это в вашем контроллере:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...