Comment faire en sorte que JQGrid reconnaisse les erreurs envoyées par le serveur?

StackOverflow https://stackoverflow.com/questions/1636580

  •  06-07-2019
  •  | 
  •  

Question

J'ai un jqgrid qui fonctionne très bien.

Je me demandais s'il était possible de détecter les erreurs envoyées par le serveur? comment est-ce fait?

Était-ce utile?

La solution

J'ai récemment utilisé jqgrid pour un projet prototype sur lequel je travaille pour CB Richard Ellis (mon employeur). Il existe de nombreuses façons de renseigner une jqgrid, comme indiqué dans la documentation : (voir le " "récupération de données".

Actuellement, je passe un appel de service qui renvoie une chaîne json qui, une fois évaluée, me fournit un objet contenant les éléments suivants:

  • ColumnNames: string []
  • ColumnModels: object [] (chaque objet a les propriétés "name", "index" et "sortable")
  • Données: objet [] (chaque objet a des propriétés correspondant aux noms du modèle de colonne)
  • TotalRows: int

Dans mon rappel de réussite, je crée manuellement le jqgrid comme suit: ("data" est l'objet que je récupère lors de l'évaluation de la chaîne json renvoyée).

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

Vous pouvez donc voir que je remplis manuellement les données. Il y a plus d'un type d'erreur de serveur. Il existe une erreur logique, que vous pouvez renvoyer en tant que propriété dans votre chaîne json et à vérifier avant de tenter de créer une jqgrid (ou sur une base individuelle).

if (data.HasError) ...

Ou ligne par ligne

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 votre erreur est une exception non gérée sur le serveur, vous souhaiterez probablement un rappel d'erreur sur votre appel asynchrone. Dans ce cas, votre rappel de succès créé (vraisemblablement) par votre jqgrid ne sera pas appelé du tout.

Ceci s’applique bien sûr au remplissage manuel d’un jqgrid, qui n’est qu’une des nombreuses options disponibles. Si vous avez le jqgrid connecté directement à un appel de service ou à une fonction permettant de récupérer les données, c’est tout autre chose.

Sur la page de documentation, recherchez sous Grilles de base > Événements. Là, vous verrez le " loadError " événement qui pourrait être utile.

Autres conseils

Si vous consultez le le site de démonstration de jqgrid et consultez la rubrique "Nouveautés". version 3.2 " Il devrait y avoir une section sur le contrôle des erreurs du serveur.

Plus précisément, il utilise un paramètre de rappel loadError:

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

Comme le précise mcv ci-dessus, certaines erreurs sont des erreurs de données. Vous devez donc les gérer de manière spécifique.

Utilisez les rappels. Si vous obtenez une erreur http réelle (400 ou 500, par exemple), loadError (xhr, status, error) est déclenché.

Mais certaines erreurs (comme la validation) ne devraient pas générer d'erreur 400 ou 500. Mais vous pouvez toujours attraper ceux-ci dans loadComplete (xhr). Analysez votre JSON et vérifiez quelle que soit la manière que vous utilisez pour identifier les erreurs. Par exemple, je le fais dans loadComplete ():

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

Vous pouvez utiliser l'événement loadError dans la définition de jqGrid (voir documentation ). Exemple:

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

D'après ce que je vois, il renvoie les données sous forme de chaîne json. Donc, ce que vous devez faire est d’ajouter un gestionnaire d’erreur qui formate l’erreur en chaîne json et l’imprime. Cela peut être fait en php avec le

set_error_handler

fonction.

Le gestionnaire d'erreurs transmettrait alors les données à jsonReturn.error. Il vous suffirait donc de vérifier si vous ajoutez vos données à la table.

Si vous générez des exceptions au lieu de laisser toutes les erreurs d'erreur (probablement une pratique recommandée), vous voudrez alors formater l'exception en chaîne json.

Puisqu'il renvoie les données au format XML, vous souhaitez analyser le XML:

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

comme ceci:

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

Emprunté sans vergogne à: http://marcgrabanski.com/article/jquery -makes-parsing-xml-easy

Une autre chose à retenir / ou que j'ai trouvée est que si vous utilisez Asp.net, vous devez activer

.

dans la section - cela vous permettra également de faire l'introspection du message qui revient.

Si vous utilisez jqGrid avec les options

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

pour charger des données via AJAX et les services Web ou les contrôleurs MVC, cette réponse est pour vous.

Notez que, si une erreur d'exécution se produit dans la méthode Web traitant de l'appel AJAX, elle ne peut pas être interceptée via loadError, car loadError n'attrape que les erreurs liées à HTTP. Vous devriez plutôt détecter l'erreur dans la méthode Web via try ... catch , puis transmettez-la au format JSON dans le bloc catch à l'aide de return JsonString . Ensuite, il peut être géré dans l'événement loadComplete:

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

Les fonctions ci-dessus ont la signification suivante, implémentez-les si nécessaire:

  • isErrorJson (data) : renvoie true, si l'objet de données contient une erreur telle que définie dans votre méthode web
  • getJsonError (data) : retourne la chaîne avec le message d'erreur tel que défini dans votre méthode Web
  • ShowErrorDialog (msg) : affiche le message d'erreur à l'écran, par exemple. via la boîte de dialogue jQueryUI.

Dans la méthode de service Web, vous pouvez utiliser JavaScriptSerializer pour créer un tel objet d'erreur. Pour les 2 méthodes JavaScript ci-dessus, vous pouvez utiliser la fonction jQuery $. parseJSON (data.d) pour extraire le message de l'objet 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');
    }
    }
});
}

Et dans la grille

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

À la fin, il utilise la même approche que je pense.

Merci à tous

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top