Как я могу заставить JQGrid распознавать отправленные сервером ошибки? - PullRequest
22 голосов
/ 28 октября 2009

У меня есть jqgrid, который работает очень хорошо.

Мне было интересно, возможно ли отлавливать отправленные сервером ошибки? как это делается?

Ответы [ 8 ]

19 голосов
/ 05 декабря 2009

Если вы посмотрите на демонстрационный сайт jqgrid и посмотрите «Что нового в версии 3.2», там должен быть раздел об управлении ошибками сервера.

В частности, он использует параметр обратного вызова loadError:

loadError : function(xhr,st,err) { 
    jQuery("#rsperror").html("Type: "+st+"; Response: "+ xhr.status + " "+xhr.statusText);
}

Как указано выше в mcv, некоторые ошибки являются ошибками данных, поэтому вам нужно будет их специально обработать.

7 голосов
/ 10 ноября 2009

Недавно я широко использовал jqgrid для проекта-прототипа, над которым я работаю в CB Richard Ellis (мой работодатель). Существует множество способов заполнения jqgrid, как отмечено в документации : (см. Узел «получение данных»).

В настоящее время я выполняю сервисный вызов, который возвращает строку json, которая при оценке дает мне объект, который содержит следующее:

  • ColumnNames: string []
  • ColumnModels: object [] (каждый объект имеет свойства «name», «index» и «sortable»)
  • Данные: объект [] (каждый объект имеет свойства, соответствующие именам в модели столбца)
  • TotalRows: int

В моем успешном обратном вызове я вручную создаю jqgrid следующим образом: («data» - это объект, который я получаю при оценке возвращенной строки json).

var colNames = data.ColumnNames;
var colModel = data.ColumnModels;
var previewData = data.PreviewData;
var totalRows = data.TotalRows;
var sTargetDiv = userContext[0]; // the target div where I'll create my jqgrid

$("#" + sTargetDiv).html("<table cellpadding='0' cellspacing='0'></table>");
var table = $("#" + sTargetDiv + " > table");
table.jqGrid({
    datatype: 'local',
    colNames: colNames,
    colModel: colModel,
    caption: 'Data Preview',
    height: '100%',
    width: 850,
    shrinkToFit: false
});

for (var row = 0; row < previewData.length; ++row)
    table.addRowData(row, previewData[row]);

Итак, вы можете видеть, что я вручную заполняю данные. Существует более 1 вида ошибок сервера. Существует логическая ошибка, которую вы можете вернуть как свойство в вашей строке json, и проверьте перед попыткой создать jqgrid (или для каждой строки).

if (data.HasError) ...

или для каждого ряда

for (var row = 0; row < previewData.length; ++row)
{
    if (previewData[row].HasError)
        // Handle error, display error in row, etc
        ...
    else
        table.addRowData(row, previewData[row]);
}

Если ваша ошибка является необработанным исключением на сервере, то вам, вероятно, понадобится обратный вызов ошибки при асинхронном вызове. В этом случае ваш обратный вызов успеха, который (предположительно) создает вашу jqgrid, вообще не будет вызываться.

Это, конечно, относится к заполнению вручную jqgrid, что является лишь одним из многих доступных вариантов. Если у вас есть jqgrid, подключенный непосредственно к вызову службы или функции для извлечения данных, тогда это совсем другое дело.

На странице документации просмотрите раздел Основные сетки> События. Там вы увидите событие «loadError», которое может пригодиться.

3 голосов
/ 02 декабря 2009

Используйте обратные вызовы. Если вы получили реальную ошибку http (например, 400 или 500), сработала loadError (xhr, status, error).

Но некоторые ошибки (например, проверка) не должны выдавать ошибку 400 или 500. Но вы все равно можете поймать их в loadComplete (xhr). Проанализируйте ваш json и проверьте, каким образом вы используете для выявления ошибок. Например, я делаю это в моем loadComplete ():

if (jsonResponse.errors) { $.each(jsonResponse.errors, function(i, val){ addErrorMessage($("#"+val.field), val.message); }); }

2 голосов
/ 07 февраля 2011

Вы можете использовать событие loadError в определении jqGrid (см. документацию ). E.g.:

//Catch errors
loadError = function(xhr, textStatus, errorThrown)  {
    var error_msg = xhr.responseText        
    var msg = "Some errors occurred during processing:"
    msg += '\n\n' + error_msg
    alert(msg)
    }
1 голос
/ 01 сентября 2014

Если вы используете jqGrid с параметрами

            ajaxGridOptions: { contentType: 'application/json; charset=utf-8' },
            datatype: "json",
            url: wsPath

для загрузки данных через AJAX и веб-сервисы или контроллеры MVC, тогда этот ответ для вас.

Обратите внимание , что если во время выполнения веб-метода, имеющего дело с вызовом AJAX, возникает ошибка времени выполнения, ее нельзя отследить с помощью loadError, поскольку loadError только перехватывает ошибки, связанные с HTTP. Вам лучше перехватить ошибку в веб-методе через try ... catch, а затем передать ее в формате JSON в блоке захвата, используя return JsonString. Затем это может быть обработано в событии loadComplete:

loadComplete: function (data) {
                    if (this.p.datatype === 'json') {
                        if (data!==undefined && data!==null && isErrorJson(data)) {
                            ShowErrorDialog(getJsonError(data));
                        }
                // ...
              }

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

  • isErrorJson(data): возвращает true, если объект данных содержит ошибку, как определено в вашем веб-методе
  • getJsonError(data): возвращает строку с сообщением об ошибке, как определено в вашем веб-методе
  • ShowErrorDialog(msg): выводит сообщение об ошибке на экран, например, через диалоговое окно jQueryUI.

В методе веб-службы вы можете использовать JavaScriptSerializer для создания такого объекта ошибки, для 2 вышеописанных методов JavaScript вы можете использовать функцию jQuery $.parseJSON(data.d), чтобы получить сообщение из объекта JSON.

1 голос
/ 04 июня 2013

Еще одна вещь, которую нужно помнить / или которую я обнаружил, это то, что если вы используете Asp.net, вам нужно включить

в разделе - это позволит вам также проанализировать возвращаемое сообщение.

1 голос
/ 28 октября 2009

Из того, что я вижу, он возвращает данные в виде строки json. Итак, вам нужно добавить обработчик ошибок, который форматирует ошибку как строку json и печатает ее как единое целое. Это можно сделать в php с помощью

set_error_handler

функция.

Тогда обработчик ошибок, я думаю, отправит данные в jsonReturn.error, так что вам нужно просто проверить это при добавлении данных в таблицу.

Если вы генерируете исключения, а не позволяете им получать ошибки (возможно, лучше), то вам нужно отформатировать исключение как строку json.

Поскольку данные возвращаются в формате xml, вам нужно проанализировать xml:

<xml>
    <error>
        error message
    </error>
</xml>

как это:

$(request.responseXML).find("error").each(function() {
        var error = $(this);
        //do something with the error
});

Бесстыдно позаимствовано у: http://marcgrabanski.com/article/jquery-makes-parsing-xml-easy

0 голосов
/ 05 декабря 2009
function gridCroak(postdata, _url, grid, viewCallBack, debug) {
$(".loading").css("display", "block");
$.ajax({
    type: 'POST',
    url: _url,
    data: postdata,
    dataType: "xml",
    complete: function(xmldata, stat){
    if(stat == "success") {
        $(".loading").css("display", "none");
        var errorTag = xmldata.responseXML.getElementsByTagName("error_")[0];
        if (errorTag) {
        $("#ErrorDlg").html(errorTag.firstChild.nodeValue);
        $("#ErrorDlg").dialog('open');
        } else {
        var warningTag = xmldata.responseXML.getElementsByTagName("warning_")[0]; 
        if (warningTag) {
            $("#WarningDlg").html(warningTag.firstChild.nodeValue);
            $("#WarningDlg").dialog('open');
        } else {
            if (debug == true) {
            alert(xmldata.responseText);
            }
            jQuery(grid)[0].addXmlData(xmldata.responseXML);
            if(viewCallBack) viewCallBack();
        }
        }
    } else {
        $("#ErrorDlg").html("Servizio Attualmente Non Disponibile !");
        $("#ErrorDlg").dialog('open');
    }
    }
});
}

И в сетке

datatype : function(postdata) { gridCroak(postdata, 'cgi-bin/dummy.pl?query=stock', 
                                                    "#list", null, false) },

В конце он использует тот же подход, я думаю.

Спасибо всем

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