Подтвердить что ты не робот

Как я могу получить JQGrid для распознавания ошибок, отправленных сервером?

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

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

4b9b3361

Ответ 1

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

В настоящее время я делаю служебный вызов, который возвращает строку 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, которое может пригодиться.

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

//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)
    }

Ответ 5

Из того, что я вижу, он возвращает данные как строку 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

Ответ 6

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

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

Ответ 7

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

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

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

Обратите внимание, что при возникновении ошибки времени выполнения в веб-методе, связанном с вызовом AJAX, его нельзя поймать через loadError, поскольку loadError только улавливает связанные с HTTP ошибки. Вы лучше поймаете ошибку в веб-методе через try ... catch, затем передайте ее в формате JSON в блоке catch с помощью 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 для создания такого объекта ошибки, для приведенных выше методов JavaScript вы можете использовать функцию jQuery $.parseJSON(data.d), чтобы получить сообщение из объекта JSON.

Ответ 8

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) },

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

Спасибо всем