Вызов JQuery ajax для действия MVC всегда возвращает ошибку, когда нет

Это приложение MVC3. У меня есть следующий javascript-вызов для моего действия:

 function editDescription(docId,fileName, fileDescription) {
    $.ajax({
         type: "POST",
         url: "/OrderDetail/LoadModelData",
         contentType: "application/json; charset=utf-8",
         data: "{'id': '"+docId +"', 'filename': '"+fileName+"', 'description': '"+fileDescription+"'}",
         dataType: "json",
         success: function (result) {
         alert("ok: "+ result.d);
         },
         error: function (result) {
             alert('Oh no: '+ result.responseText);
         }
     });

Вот мое действие:

    [HttpPost]
    public string LoadModelData(string id, string filename, string description)
    {
        return filename;
    }

Я запускаю код, действие вызывается с параметрами, ничего не равно null, но функция ошибки вызывается каждый раз. Поэтому поле предупреждения с надписью "О нет" появляется каждый раз, но строка, возвращаемая из действия, верна. Если имя файла test.pdf, в поле предупреждения об ошибке указано

    'Oh No: test.pdf'. 

Я посмотрел в Firebug и ошибок не было. Почему не называется функция успеха, несмотря на отсутствие ошибок?

+9
источник поделиться
2 ответа

Вы ожидаете (возвращаете) значение string из вашего метода действий. Зачем вам тогда указывать тип данных как json? Удалите это и посмотрите, что произойдет. И нет свойства d из ответа! поэтому просто используйте результат в предупреждении.

$.ajax({
         type: "POST",
         url: "/OrderDetail/LoadModelData",
         contentType:"application/json; charset=utf-8",         
         data: JSON.stringify({ 
                             id: docId, 
                             filename: fileName, 
                             description: fileDescription 
                            }),
         success: function (result) {
         alert("ok: "+ result);
         },
         error: function (result) {
             alert('Oh no: '+ result.responseText);
         }
     });

Свойство datatype сообщает серверу, какой тип содержимого клиент ожидает в результате.

EDIT: Как упоминал Дарин, используйте метод JSON.stringify для создания запроса JSON. Обновление этого ответа включает правильный путь для будущих посетителей.

+11
источник

Никогда не создавайте JSON со строковыми манипуляциями:

data: "{'id': '"+docId +"', 'filename': '"+fileName+"', 'description': '"+fileDescription+"'}",

Это абсолютно ужасно и неправильно. Вы ничего не кодируете. Достаточно сделать цитату в description, и все сломается. Всегда используйте парсер JSON при работе с JSON

Вот так:

$.ajax({
     type: "POST",
     url: "/OrderDetail/LoadModelData",
     contentType: "application/json; charset=utf-8",
     data: JSON.stringify({ 
         id: docId, 
         filename: fileName, 
         description: fileDescription 
     }),
     success: function (result) {
         alert("ok: "+ result.filename);
     },
     error: function (result) {
         alert('Oh no: '+ result.responseText);
     }
 });

Метод JSON.stringify основан на встроенных современных браузерах. Если вам нужно поддерживать устаревшие браузеры, вы можете включить json2.js script

Другая ошибка - ваша сигнатура действия контроллера. В действиях контроллера ASP.NET MVC необходимо возвращать ActionResults, а не строки:

[HttpPost]
public ActionResult LoadModelData(string id, string filename, string description)
{
    return Json(new { filename = filename });
}
+8
источник

Посмотрите другие вопросы по меткам или Задайте вопрос