Перехват сообщения об ошибке внутри jquery ajax - из действия asp.net mvc - PullRequest
0 голосов
/ 23 ноября 2011

Мне удалось получить настоящее сообщение об ошибке раньше, когда я использовал веб-сервисы jquery ajax + asp.net. Однако тот же код внутри jquery $ ajax error больше не работает.

Внутри моего .js у меня есть

$.ajax({
        contentType: 'application/json, charset=utf-8',
        type: "POST",
        url: "/Controller/DoSomething",
        data: JSON.stringify({ varname: varvalue }),
        cache: false,
        dataType: "json",

        success: function (wo) { 
           alert('yay!');
        },


        error: function (xhr) {

            alert('error');

            if (xhr.responseText) {

                var err = JSON.parse(xhr.responseText);

                if (err) {
                    alert(err.Message);
                }
                else {
                    alert("Unknown server error, please try again!");
                }
            } 

        }

    });

Внутри моего контроллера у меня есть

   public JsonResult DoSomething(string folderno)
   {
       CustomObject obj;

       //get the obj value from repository here
       throw new Exception("my test error message");
       return Json(obj);
   }

Я посмотрел на Firebug, и кажется, что я получаю Ошибка «JSON.parse: неожиданный символ».

То, что я пытаюсь сделать здесь, - это подделать ситуацию, когда получение obj из репозитория вызывает исключение. Очевидно, что return Json(obj) никогда не будет достигнуто.

Мой вопрос: как мне справиться с этой ситуацией и перехватить сообщения об ошибках на стороне JS? Нужно ли что-то делать в моем контроллере?

В моей более ранней установке веб-служб Jquery + asp.net я мог выбросить исключение внутри метода веб-службы (как показано в моем действии сейчас), и оно могло бы попасть в мою ошибку ajax, и сообщение об ошибке будет разобрали.

Теперь, похоже, мне нужно поймать исключение и упаковать в себя .... вопрос в том, как? И нужно ли делать это внутри каждого действия? Это похоже на большую работу.

1 Ответ

1 голос
/ 24 ноября 2011

Одна вещь, которую я делаю, - это создание универсального объекта возврата для вызовов AJAX. Что-то вроде:

public class AJAXReturn
{
    public string Message { get; set; }
    public object Result { get; set; }
}

Затем в ваших возвращаемых функциях оберните их в исключения (или создайте универсальный обработчик исключений), который будет выглядеть примерно так:

public JsonResult DoSomething(string folderno)
{
   CustomObject obj = new { FolderNo = folderno };
   AJAXReturn result;

   try
   {
       result.Message = "OK";
       result.Result = obj;
   }
   catch (Exception ex)
   {
       result.Message = "ERROR";
       result.Result = ex;
   }
   finally
   {
       return Json(result);
   }
}

Редактировать: на стороне javascript просто проверьте свой результат на data.Message == 'OK'. Если это не так, вы можете отобразить либо конкретную информацию об исключении, либо что угодно.

Редактировать 2: Извините, я должен был упомянуть, что это всегда будет возвращаться в обратном вызове success, поэтому убедитесь, что вы анализируете его там.

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