Mam jqgrid, który działa bardzo dobrze.W jaki sposób można uzyskać JQGrid do rozpoznawania błędów wysłanych przez serwer?
Zastanawiam się, czy można złapać błędy wysłane przez serwer? jak to jest zrobione ?
Mam jqgrid, który działa bardzo dobrze.W jaki sposób można uzyskać JQGrid do rozpoznawania błędów wysłanych przez serwer?
Zastanawiam się, czy można złapać błędy wysłane przez serwer? jak to jest zrobione ?
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:
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ć.
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
Żaden serwer nie zwraca danych w formacie XML! Każde rozwiązanie – ZeroCool
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); }); }
Dzięki! Właśnie tego potrzebowałem! –
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.
+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. –
To jest odpowiednia odpowiedź. –
@ r00fus dzięki za odpowiedź. to było naprawdę bardzo pomocne: D – Harshit
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
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)
}
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.
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 WWWgetJsonError(data)
: zwraca ciąg znaków z komunikatem o błędzie zdefiniowanym w metodzie internetowejShowErrorDialog(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.
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. –