2013-07-16 2 views
3

Суть моего вопроса такова: если я выдаю запрос на $ .ajax на мой сервер для проверки на стороне сервера - как я должен ожидать ответа на проверку? Я вижу себя как имеющие два варианта:Рекомендации по получению сообщений об исключениях сервера по запросу ajax

// Server handled error: 
$.ajax({ 
    url: 'controller/action', 
    data: {}, 
    success: function(response){ 
     console.log("Error:", response.error); 
    } 
} 

// Server unhandled error: 
$.ajax({ 
    url: 'controller/action', 
    data: {}, 
    success: function(){ 
    }, 
    error: function(error){ 
     console.log("Error:", error); 
    } 
} 

Прежний пример предполагает, что контроллер моего сервера имеет TRY/поймать который потребляет любые серверные исключения. Затем он принимает любые исключения и возвращает их как часть объекта успеха json. Последнее позволяет исключить серверное исключение и попасть в обработчик ошибок ajax.

Лично я думал, что предпочитаю последний. Тем не менее, я просто столкнулся с проблемой удаленного взаимодействия - если настройки безопасности нашего сервера не смягчены, сообщение об ошибке скрывается как «Ошибка выполнения», и чтение информации об ошибке из обработчика событий onerror ajax становится невозможным.

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

Как это нормально обрабатывается?

[HttpPost, AjaxOnly] 
public ActionResult ChangePassword(ChangePasswordDialogModel model) 
{ 
    string error = string.Empty; 

    if (model.NewPassword == model.NewPasswordConfirm) 
    { 
     using (var service = new SecurityServicesSoapClient()) 
     { 
      error = service.ChangePassword(SessionManager.Default.User.UserName, model.OldPassword, 
              model.NewPassword); 
     } 
    } 
    else 
    { 
     error = "New Password and Confirm do not match. Please re-enter"; 
    } 

    if (!string.IsNullOrEmpty(error)) 
     throw new Exception(error); 

    return Json(new 
     { 
      success = true 
     }); 
} 

Это значение по сравнению с установочным успешным значением false и установкой свойства ошибки на сообщение об ошибке.

+0

Лично я рассматриваю клиентский и серверный код как отдельные приложения. Первый - это просто доступ к API на последнем. Поэтому я хочу убедиться, что серверное приложение (например, любое приложение) _never_ имеет необработанные исключения. Если есть условие ошибки, которое требуется для связи с клиентом, он должен сделать это в структуре, знакомой этому клиенту. В HTTP это будут коды ошибок и тела ответа. – David

ответ

2

Я делаю что-то очень похожее в своей системе. Успех всегда возвращает данные, такие как:

$data['success'] = array(/* your data to be served back to the page */); //PHP 

а ошибки всегда делается так:

$data['errors'] = array(/* your error data */); //PHP 

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

// JS 
$.ajax({success:function(data) { 
    if (data.success !== undefined) {} 
    else if (data.errors !== undefined) {} 
}}); 

Вы можете получить сумасшедшие и добавить их в качестве глобальных обработчиков AJAX, а также путем добавления этого кода в $(document).ajaxComplete(); обратного вызова.

У вас может быть и должен быть отдельный обработчик для обратного вызова ошибки ajax, поскольку это может включать ситуации, когда ваш контроллер не имеет контроля (404 ошибки, недоступен сервер и т. Д.).

0

Я думаю, вы можете попробовать это, чтобы исправить ошибку при звонках ajax.

$.ajax({ 
    url: 'controller/action', 
    data: {}, 
    success: function(){ 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     alert(jqXHR.status); 
    } 
} 

В зависимости от jqXHR.status значения, вы можете показать настроенное сообщение об ошибке.