كيف يمكنني الحصول على JQGrid الاعتراف الخادم إرسال الأخطاء ؟
سؤال
لدي jqgrid أن الأشغال بشكل جيد جدا.
أنا أتساءل هل من الممكن للقبض على الملقم إرسال الأخطاء ؟ كيف يتم ذلك ؟
المحلول
أنا مؤخرا على نطاق واسع jqgrid على نموذج مشروع أنا أعمل على سي بي ريتشارد إيليس (صاحب العمل).هناك العديد من الطرق لنشر jqgrid ، كما لوحظ في الوثائق:(انظر "استرداد البيانات" عقدة).
حاليا أقوم بإجراء مكالمة بإرجاع سلسلة سلمان أنه عند تقييم يعطيني كائن الذي يحتوي على ما يلي:
- ColumnNames:string[]
- ColumnModels:كائن[] (كل كائن له خصائص "اسم" ، "مؤشر" و "للفرز")
- البيانات:كائن[] (كل كائن له خصائص تطابق الأسماء في العمود نموذج)
- TotalRows:الباحث
في نجاح الاستدعاء ، أنا يدويا إنشاء jqgrid مثل هذا:("البيانات" هو كائن أحصل عند تقييم عاد سلسلة 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" الحدث التي قد تأتي في متناول اليدين.
نصائح أخرى
إذا نظرتم الى jqgrid عرض الموقع وإلقاء نظرة على "ما هو الجديد في الإصدار 3.2 "يجب أن يكون هناك قسم حول التحكم في أخطاء الخادم.
وعلى وجه التحديد، فإنه يستخدم loadError المعلمة رد:
loadError : function(xhr,st,err) {
jQuery("#rsperror").html("Type: "+st+"; Response: "+ xhr.status + " "+xhr.statusText);
}
وكما تنص MCV أعلاه، بعض الأخطاء أخطاء البيانات، لذلك ستحتاج للتعامل مع هذه على وجه التحديد.
استخدم في رد. إذا كنت تحصل على خطأ HTTP الفعلي (400 أو 500، على سبيل المثال)، يتم تشغيل loadError (XHR، والوضع، خطأ).
ولكن يجب أن بعض الأخطاء (مثل التحقق من صحة) لا رمي خطأ 400 أو 500. ولكن لا يزال بإمكانك قبض على هؤلاء في loadComplete (XHR). تحليل سلمان بك، والتحقق من كل ما الطريقة التي تستخدمها لتحديد الأخطاء. على سبيل المثال، أنا أفعل هذا في بلدي loadComplete ():
وif (jsonResponse.errors) {
$.each(jsonResponse.errors, function(i, val){
addErrorMessage($("#"+val.field), val.message);
});
}
ويمكنك استخدام الحدث 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)
}
من ما أرى ، تقوم بإرجاع البيانات سلسلة json.لذلك ما عليك القيام به هو إضافة معالج الأخطاء التي صيغ الخطأ باعتباره سلسلة json وتطبع واحدة.هذا يمكن القيام به في php مع
set_error_handler
وظيفة.
معالج الأخطاء ثم أعتقد دفع البيانات في jsonReturn.خطأ, لذلك سوف تحتاج فقط إلى التحقق من أن عند إضافة البيانات إلى الجدول.
إذا كنت رمي الاستثناءات بدلا من السماح لها الحصول على كل وسيلة الأخطاء (أفضل الممارسات), ثم كنت تريد أن شكل استثناء باعتبارها سلسلة 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
وشيء آخر أن نتذكر / أو التي وجدت هي أنه إذا كنت تستخدم Asp.net تحتاج إلى تشغيل
في القسم - وهذا سوف يسمح لك إلى التأمل في رسالة يعاود فضلا
إذا كنت تستخدم jqGrid مع الخيارات
ajaxGridOptions: { contentType: 'application/json; charset=utf-8' },
datatype: "json",
url: wsPath
لتحميل البيانات عبر AJAX و خدمات الويب أو MVC التحكم ، ثم هذا الجواب هو لك.
ملاحظة أنه إذا كان يحدث خطأ وقت تشغيل في شبكة الإنترنت طريقة التعامل مع اياكس الاتصال, لا يمكن أن يكون catched عبر 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
لخلق هذا الكائن خطأ ، 2 جافا سكريبت الأساليب المذكورة أعلاه يمكنك استخدام وظيفة مسج $.parseJSON(data.d)
للحصول على الرسالة من كائن 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');
}
}
});
}
وفي الشبكة
datatype : function(postdata) { gridCroak(postdata, 'cgi-bin/dummy.pl?query=stock',
"#list", null, false) },
وفي نهاية أنها لا تستخدم نفس النهج على ما أعتقد.
وشكر جميع