تنفيذ jgGrid الخاص بـ jQuery بتنسيق ASP.Net وJSON
سؤال
هل تمكن أي شخص من تنفيذ البرنامج المساعد لشبكة JQuery، jqGrid؟أحاول تنفيذ ترحيل JSON، وأشعر أنني أقترب، ولكنني أيضًا غارق في التفاصيل غير المهمة.إذا كان بإمكان أي شخص نشر بعض نماذج التعليمات البرمجية، سأكون ممتنًا جدًا لذلك.
المحلول
وجدت رسالتك بينما كنت أحاول القيام بذلك لمشروعي.لقد نجحت.بالنسبة لأي شخص يحتاج إليها في المستقبل، لن يعمل jqGrid خارج الصندوق مع JSON وASP.NET.تحتاج إلى إجراء بعض التعديلات الصغيرة على الشبكة.base.js.حول السطر 829، استبدل قسم حالة json بما يلي:
case "json":
gdata = JSON.stringify(gdata); //ASP.NET expects JSON as a string
$.ajax({ url: ts.p.url,
type: ts.p.mtype,
dataType: "json",
contentType: "application/json; charset=utf-8", //required by ASP.NET
data: gdata,
complete: function(JSON, st) { if (st == "success") { addJSONData(cleanUp(JSON.responseText), ts.grid.bDiv); if (loadComplete) { loadComplete(); } } },
error: function(xhr, st, err) { if (loadError) { loadError(xhr, st, err); } endReq(); },
beforeSend: function(xhr) { if (loadBeforeSend) { loadBeforeSend(xhr); } } });
if (ts.p.loadonce || ts.p.treeGrid) { ts.p.datatype = "local"; }
break;
ثم قم بإضافة الوظيفة التالية:
function cleanUp(responseText) {
var myObject = JSON.parse(responseText); //more secure than eval
return myObject.d; //ASP.NET special
}
ستحتاج أيضًا إلى تضمين محلل JSON وstringifier.إلى جانب العمل مع ASP.NET، يتم أيضًا استخدام هذا الكود المنقح أكثر أمنا لأن بيان التقييم قد اختفى.
يحرر: كان يجب أن أشير أيضًا إلى أنه قد يتعين عليك إجراء تعديلات مماثلة على الشبكة.celledit.js، وgrid.formedit.js، وgrid.inlineedit.js، وgrid.subgrid.js.
نصائح أخرى
ولقد فقط jTemplates للقيام الترحيل من جانب العميل مع مسج و ASP.NET. لقد فعلت ذلك لبلوق وظيفة على ذلك والتي يمكنك العثور هنا: HTTP: // شبكة الاتصالات العالمية .aaron-powell.com / blog.aspx؟ ID = 1209
ويبدو في كيفية إنشاء موقع البيانات قالب، إرجاع البيانات من ASP.NET ومن ثم تنفيذ حل الترحيل.
ويمكنك استخدام ASP.Net MVC JsonResult لتجميع الشبكة.
والشخص الدرجة
public class Person
{
public int ID { get; set; }
public string Name { get; set; }
public DateTime Birthday { get; set; }
public static IEnumerable<Person> GetABunchOfPeople()
{
// Get a bunch of People.
}
}
في جهاز تحكم أن يكون لديك:
public JsonResult GetABunchOfPeopleAsJson()
{
var rows = (Person.GetABunchOfPeople()
.Select(c => new
{
id = c.ID,
cell = new[]
{
c.ID.ToString(),
c.Name,
c.Birthday.ToShortDateString()
}
})).ToArray();
return new JsonResult
{
Data = new
{
page = 1,
records = rows.Length,
rows,
total = 1
}
};
}
وسوف التكوين jqGrid للرابط على النحو التالي:
url: '<%= ResolveUrl("~/Person/GetAllPeople") %>',
وأنا مجرد تخبط في محاولة لسحب كل شيء معا. اهتمامي الأول هو ببساطة توليد استجابة JSON الصحيحة. يبدو الطبقة عاد بي إلى إجراء تسلسل كخاصية اسمه "د" - هذا شيء مسج، أو اتفاقية ASP.Net طريقة شبكة الإنترنت؟ أخشى أن jqGrid سوف تبحث عن البيانات لتكون على مستوى عال، في حين asp.net ووضعها في خاصية تسمى 'د':
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static object GetData() {
TestClass tc = new TestClass() { One = "Hello", Two = "World" };
return tc;
}
$("#divResults").click(function() {
$.ajax({
type: "POST",
url: "GridData_bak.aspx/GetData",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(test) {
// Replace the div's content with the page method's return.
$("#divResults").text(test.d.One);
},
error: function(msg) {
$("#divResults").text(msg);
}
});
});
والبرنامج المساعد FlexGrid ذي متناثر جدا على doumentation ولكن في جزء صغير على الصفحة التجريبية هناك توت على إنشاء كائن تسلسل سلمان، وهذا هو مضلل قليلا لأن الشبكة تتطلب صيغة محددة، ولقد استدار رمز PHP للخيار أكس مع الشحوم قرد صغير يمكنك أن تفعل الشيء نفسه بالنسبة للتنسيق سلمان
وهيريس بلدي ميناء أكس
the setup for the grid
$("#tableToFlex").flexigrid({
url: 'WebService.asmx/getData'}
... *other configs* ...);
ويرجى النظر في التعليمة البرمجية التالية في فئة webservice.asmx
<WebMethod()> _
<ScriptMethod(ResponseFormat:=ResponseFormat.Xml)> _
Public Function getData(ByVal page As Integer, _
ByVal qtype As String, _
ByVal Query As String, _
ByVal rp As Integer, _
ByVal sortname As String, _
ByVal sortorder As String) As System.Xml.XmlDocument
'note these parameters are inputted to determine paging and constrains for the resultant rows
'Sample list to send to the grid
Dim list = New List(Of ApplicationStateInformation)
'Sample row object that holds name , surname , address, idnumber ...
list.Add(New RowObjects( "test1", "test1", "test1", "12345"))
list.Add(New RowObjects( "test2", "test2", "test2", "12345"))
list.Add(New RowObjects( "test3", "test3", "test3", "12345"))
list.Add(New RowObjects( "test4", "test4", "test4", "12345"))
'retun a xml doc, as we are using the xml format on the flexgrid
Dim returnDoc = New System.Xml.XmlDocument()
returnDoc.Load(New IO.StringReader(ToXmlResult(list)))
Return returnDoc
End Function
Private Function ToXmlResult(ByVal list As List(Of RowObjects)) As String
'this is the xml document format the grid understands
Dim result As String = "<?xml version=""1.0"" encoding=""utf-8""?>" & vbCrLf
result += "<rows>" & vbCrLf
result += String.Format("<page>{0}</page>" & vbCrLf, "1")
result += String.Format("<total>{0}</total>" & vbCrLf, "10")
For Each item In list
result += ConvertRowData(item)
Next
result += "</rows>" & vbCrLf
Return result
End Function
Private Function ConvertRowData(ByVal row As RowObjects) As String
Dim result As String = String.Format("<row id='{0}'>" & vbCrLf, row.IdNumber.ToString)
'THESE SHOULD BE HTML ENCODED (the format arg) but I left it out
result += String.Format("<cell><![CDATA[{0}]]></cell>" & vbCrLf, row.Name)
result += String.Format("<cell><![CDATA[{0}]]></cell>" & vbCrLf, row.Surname)
result += String.Format("<cell><![CDATA[{0}]]></cell>" & vbCrLf, row.IdNumber)
result += "</row>" & vbCrLf
Return result
End Function
أعتقد أنه يمكنك جعل jqgrid يعمل مع json & asp.net دون تعديلgrid.base.js وملفات jqgrid الأخرى، ويجب عليك استخدام خاصية نوع البيانات لتحديد استدعاء ajax المخصص الخاص بك وتحديد قارئ json، وسوف يستخدم jqgrid بعد ذلك مكالمة وقارئ Ajax مخصص في كل مرة يتم فيها إعادة تحميل الشبكة.
تشبه العملية ملف XML، حيث تقوم فقط بتعريف xmlreader بدلاً من jsonreader.
يتم تعريف جميع خصائص jsonreader في ملف التوثيق عبر الإنترنت
للحصول على أمثلة لنوع البيانات المخصص، راجع "الوظيفة كنوع بيانات" في ملف صفحة تجريبية حية ضمن "الجديد في 3.3"
وبلدي تنفيذ:
والبيانات: "{ 'الصفحة': '" + gdata.page + "'، 'الصفوف': '" + gdata.rows + "'، 'sidx': '" + gdata.sidx + "'، ' SORD ':' "+ gdata.sord +" '،' الثانية ':' "+ gdata.nd +" '،' _ بحث ':' "+ gdata._search +" '،' searchField ':' "+ الخبر. p.searchdata.searchField + " '،' searchString ':'" + ts.p.searchdata.searchString + " '،' searchOper ':'" + ts.p.searchdata.searchOper + " '}"،
والنجاح: وظيفة (JSON، الحادي والعشرين) { إذا (الحادي == "النجاح") {addJSONData (JSON.d، ts.grid.bDiv)؛ إذا (loadComplete) {loadComplete ()؛ }}
وInsted باستخدام الكامل الحدث اياكس الحدث استخدام النجاح. بهذه الطريقة هو منع seralize سلمان مزدوجة.
وشيء واحد فقط أنني لم أحقق مع تحرير الخلية: نفترض أنني أريد تعديل خلايا متعددة مع نوع البيانات نفسها (كثافة). ليس لدي سوى طريقة واحدة على الشبكة! وأنا غير قادر على oveload مع نوع بيانات نفسه مع اسم ديفرينت! هل هناك من حل هذا النوع من probleme؟