2009-10-28 7 views

Odpowiedz

7

I Ostatnio szeroko wykorzystałem jqgrid do projektu prototypu, nad którym pracuję dla CB Richard Ellis (mojego pracodawcy). Istnieje wiele sposobów zapełniania jqgrid, jak odnotowano w documentation: (patrz węzeł "pobieranie danych").

Obecnie dokonać zgłoszenia serwisowego, która zwraca ciąg json że gdy oceniano, daje mi obiekt, który zawiera następujące elementy:

  • ColumnNames: string []
  • ColumnModels: Object [] (każdy obiekt ma właściwości „nazwę” wskaźnik „” i „”) sortable
  • Dane: obiekt [] (każdy obiekt ma właściwości, które odpowiadają nazwom w modelu kolumna)
  • TotalRows int

W moim oddzwanianiu powodzenia, ręcznie tworzę jqgrid w następujący sposób: ("dane" to obiekt, który otrzymuję podczas oceniania zwróconego łańcucha 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]); 

Widać, że ręcznie zapełniam dane. Wystąpił więcej niż jeden rodzaj błędu serwera. Wystąpił błąd logiczny, który można zwrócić jako właściwość w łańcuchu json i sprawdzić przed próbą utworzenia wartości jqgrid (lub w zależności od wiersza).

if (data.HasError) ... 

Albo na zasadzie per-rzędu

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

Jeśli błąd jest nieobsługiwany wyjątek na serwerze, to prawdopodobnie będziesz chciał się zwrotnego błędu na wezwanie asynchronicznym. W takim przypadku twój callback powodzenia, który (prawdopodobnie) tworzy twój jqgrid, nie będzie w ogóle wywoływany.

To oczywiście dotyczy ręcznego wypełniania jqgrid, co jest tylko jedną z wielu dostępnych opcji. Jeśli masz jqgrid podłączony bezpośrednio do zgłoszenia serwisowego lub funkcję pobierania danych, to jest to coś zupełnie innego.

Na stronie dokumentacji spójrz w Podstawowe siatki> Zdarzenia. Tam pojawi się zdarzenie "loadError", które może się przydać.

+0

hej sam ... jeśli jeszcze go nie widziałeś .. http://skysanders.net/code/jQGridWS/default.aspx możesz być w stanie ponownie użyć niektórych z nich i może dodać wyjątek możliwości obsługi. –

1

Z tego co widzę, zwraca dane jako ciąg json. Musisz więc dodać moduł obsługi błędów, który formatuje błąd jako ciąg json i wypisuje go jako jeden. Można to zrobić w php z funkcją .

Obsługa błędów będzie wtedy, jak sądzę, wepchnąć dane do jsonReturn.error, więc wystarczy sprawdzić to przy dodawaniu danych do tabeli.

Jeśli rzucasz wyjątki, zamiast pozwolić im przejść do błędów (prawdopodobnie lepsza praktyka), to chciałbyś sformatować wyjątek jako ciąg jsonów.

Ponieważ zwraca dane w formacie XML, co chcesz do analizowania xml:

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

tak:

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

Bezwstydnie pożyczone od: http://marcgrabanski.com/article/jquery-makes-parsing-xml-easy

+0

Żaden serwer nie zwraca danych w formacie XML! Każde rozwiązanie – ZeroCool

3

Użyj wywołań zwrotnych. Jeśli otrzymasz rzeczywisty błąd http (na przykład 400 lub 500), zostanie wywołany loadError (xhr, status, error).

Jednak niektóre błędy (np. Sprawdzanie poprawności) nie powinny powodować błędu 400 lub 500. Ale nadal możesz złapać te w loadComplete (xhr). Przetwórz swój json i sprawdź, w jaki sposób używasz do identyfikacji błędów. Na przykład, ja robię to w moim loadComplete():

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

+0

Dzięki! Właśnie tego potrzebowałem! –

19

Jeśli spojrzeć na jqgrid demo site i spojrzeć na „Co nowego w wersji 3.2” Nie powinno być odcinek o kontrolowanie błędów serwera.

Konkretnie, używa LoadError parametr callback:

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

Jak stwierdza MCV powyżej, niektóre błędy są błędami danych, więc trzeba obsłużyć te konkretnie.

+3

+1 Tego właśnie szukałem, gdy znalazłem to pytanie po wyszukiwaniu w Google. Chciałem uchwycić błędy wewnętrzne 500, które występują w adresie URL używanym do pozyskiwania danych. –

+1

To jest odpowiednia odpowiedź. –

+0

@ r00fus dzięki za odpowiedź. to było naprawdę bardzo pomocne: D – Harshit

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

I w siatce

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

Na koniec, to używa tego samego podejścia myślę.

Dzięki wszystkim

2

Można użyć zdarzenia loadError w definicji jqGrid (patrz documentation). Np:

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

Kolejną rzeczą do zapamiętania/lub, że znalazłem to, że jeśli używasz Asp.net trzeba skręcić

w sekcji - to pozwoli Ci introspekcji ten wraca jako wiadomość dobrze.

1

Jeśli używasz jqGrid z opcjami

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

ładowania danych za pośrednictwem AJAX i usług internetowych lub MVC kontrolerów, to odpowiedź jest dla Ciebie.

Uwaga, że jeśli wystąpi błąd wykonania w sposobie internetowej zajmującej się wywołania AJAX, nie może zostać przechwycony przez LoadError, ponieważ LoadError łapie tylko HTTP związanych błędów. Powinieneś raczej złapać błąd w metodzie internetowej poprzez poprzez try ... catch, a następnie przekazać go w formacie JSON w bloku catch, używając return JsonString.To może być obsługiwane w przypadku loadComplete:

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

Funkcje powyżej mają następujące znaczenie, wdrożyć je w razie potrzeby:

  • isErrorJson(data): zwraca true, jeśli obiekt danych zawiera błąd, jak określono w Twoja metoda WWW
  • getJsonError(data): zwraca ciąg znaków z komunikatem o błędzie zdefiniowanym w metodzie internetowej
  • ShowErrorDialog(msg): wyświetla komunikat o błędzie na ekranie, np. przez okno dialogowe jQueryUI.

W metodzie usług internetowych można użyć JavaScriptSerializer stworzyć taki obiekt błędu, dla metod 2 JavaScript powyżej można użyć funkcji jQuery $.parseJSON(data.d) aby otrzymać wiadomość z obiektu JSON.

Powiązane problemy