Pregunta

Tengo un jqgrid que funciona muy bien.

Me preguntaba si es posible detectar errores enviados por el servidor. ¿Cómo se hace?

¿Fue útil?

Solución

Recientemente hice un amplio uso de jqgrid para un proyecto prototipo en el que estoy trabajando para CB Richard Ellis (mi empleador). Hay muchas formas de llenar un jqgrid, como se indica en la documentación : (consulte el " ; recuperación de datos " nodo).

Actualmente realizo una llamada de servicio que devuelve una cadena json que, cuando se evalúa, me da un objeto que contiene lo siguiente:

  • ColumnNames: string []
  • ColumnModels: object [] (cada objeto tiene las propiedades '' nombre '', '' índice '' y '' ordenable '')
  • Datos: objeto [] (cada objeto tiene propiedades que coinciden con los nombres en el modelo de columna)
  • TotalRows: int

En mi devolución de llamada exitosa, creo manualmente la jqgrid de esta manera: (" data " es el objeto que obtengo al evaluar la cadena json devuelta).

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]);

Para que pueda ver, relleno manualmente los datos. Hay más de 1 tipo de error del servidor. Existe el error lógico, que podría devolver como una propiedad en su cadena json, y verificar antes de intentar crear un jqgrid (o por fila).

if (data.HasError) ...

O por fila

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]);
}

Si su error es una excepción no controlada en el servidor, entonces probablemente desee una devolución de llamada de error en su llamada asincrónica. En este caso, su devolución de llamada exitosa que (presumiblemente) está creando su jqgrid no se llamará en absoluto.

Esto, por supuesto, se aplica a rellenar manualmente un jqgrid, que es solo una de las muchas opciones disponibles. Si tiene el jqgrid conectado directamente a una llamada de servicio o una función para recuperar los datos, entonces eso es algo completamente diferente.

En la página de documentación, busque en Cuadrículas básicas > Eventos. Ahí verás el " loadError " evento que puede ser útil.

Otros consejos

Si mira el sitio de demostración jqgrid y mira " Novedades en versión 3.2 " Debería haber una sección sobre el control de errores del servidor.

Específicamente, utiliza un parámetro de devolución de llamada loadError:

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

Como indica mcv anteriormente, algunos errores son errores de datos, por lo que deberá manejarlos específicamente.

Usa las devoluciones de llamada. Si obtiene un error http real (un 400 o 500, por ejemplo), se activa loadError (xhr, estado, error).

Pero algunos errores (como la validación) no deberían arrojar un error de 400 o 500. Pero aún puede atraparlos en loadComplete (xhr). Analice su json y compruebe la forma en que está utilizando para identificar errores. Por ejemplo, estoy haciendo esto en mi loadComplete ():

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

Puede usar el evento loadError en la definición de jqGrid (consulte documentación ). Por ejemplo:

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

Por lo que veo, devuelve los datos como una cadena json. Entonces, lo que debe hacer es agregar un controlador de errores que formatee el error como una cadena json y lo imprima como uno. Esto se puede hacer en php con el

set_error_handler

función.

Supongo que el controlador de errores empujaría los datos a jsonReturn.error, por lo que solo debería verificarlo cuando agregue sus datos a la tabla.

Si está lanzando excepciones en lugar de dejar que llegue a errores (probablemente una mejor práctica), entonces querrá formatear la excepción como una cadena json.

Dado que devuelve los datos en un formato xml, querrá analizar el xml:

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

así:

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

Prestado descaradamente de: http://marcgrabanski.com/article/jquery -makes-parsing-xml-easy

Otra cosa para recordar / o que encontré es que si está usando Asp.net necesita activar

en la sección: esto también le permitirá introspectar el mensaje que regresa.

Si está utilizando jqGrid con las opciones

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

para cargar datos a través de AJAX y servicios web o controladores MVC, entonces esta respuesta es para usted.

Tenga en cuenta que si se produce un error de tiempo de ejecución en el método web que trata con la llamada AJAX, no se puede detectar a través de loadError, porque loadError solo detecta errores relacionados con HTTP. Debería detectar el error en el método web a través de try ... catch , luego pasarlo en formato JSON en el bloque catch utilizando return JsonString . Entonces se puede manejar en el evento loadComplete:

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

Las funciones anteriores tienen el siguiente significado, impleméntelas según sea necesario:

  • isErrorJson (data) : devuelve verdadero, si el objeto de datos contiene un error como se define en su método web
  • getJsonError (data) : devuelve la cadena con el mensaje de error como se define en su método web
  • ShowErrorDialog (msg) : muestra el mensaje de error en la pantalla, p. a través del diálogo jQueryUI.

En el método de servicio web puede usar JavaScriptSerializer para crear dicho objeto de error, para los 2 métodos de JavaScript anteriores puede usar la función jQuery $ .parseJSON (data.d) para sacar el mensaje del objeto JSON.

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');
    }
    }
});
}

Y en la cuadrícula

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

Al final, utiliza el mismo enfoque, creo.

Gracias a todos

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top