i'm trying to make the navigation arrows in jqGrid working. MVC 3 RC2, Entity Framework 4, .NET Framework 4, jqGrid 3.8.2
The Problem is, that i'm getting not record from 1 to 10, 11 to 20 and so on. It seems that the .skip method is not working correctly.
jqGrid calls the ActionResult with the right parameters.
Maybe you have an idea?
Regards,
float //
// Post: /Admin/IndexGridData
// Gibt ein JSON Result mit allen Aufträgen für das jqGrid zurück
[HttpPost]
public ActionResult IndexGridData(string sidx, string sord, int page, int rows)
{
// Ermittlung der Zusatzinformationen die das Grid anzeigt (Anzahl Aufträge, momentan angezeigte Aufträge
int start = (page -1) * rows;
int summeauftraege = _db.Auftrag.Where(x => x.AuftragStatus != "storno").Count();
int totalPages = (int)Math.Ceiling((float)summeauftraege / (float)rows);
var auftraege = (from auftrag in _db.Auftrag
.Include("KT_AuftragStatus")
.Include("KT_Bearbeitungsort")
.Include("AuftragPartner")
select new
{
Titel = auftrag.Titel,
Auftrag_GUID = auftrag.Auftrag_GUID,
Bearbeitungsort = auftrag.KT_Bearbeitungsort.Text,
AuftragStatus = auftrag.KT_AuftragStatus.Text,
}).Where(x => x.AuftragStatus != "storniert").OrderBy(x => x.Titel)
.Skip(start)
.Take(rows)
.AsEnumerable().ToList();
// Sortierung des Grids anwenden
if (sidx == "Titel" && sord == "asc")
{
auftraege = auftraege.OrderBy(x => x.Titel).AsEnumerable().ToList();
}
else if (sidx == "Titel" && sord == "desc")
{
auftraege = auftraege.OrderByDescending(x => x.Titel).AsEnumerable().ToList();
}else if (sidx == "Bearbeitungsort" && sord == "asc")
{
auftraege = auftraege.OrderBy(x => x.Bearbeitungsort).AsEnumerable().ToList();
}
else if (sidx == "Bearbeitungsort" && sord == "desc")
{
auftraege = auftraege.OrderByDescending(x => x.Bearbeitungsort).AsEnumerable().ToList();
}
else if (sidx == "AuftragStatus" && sord == "asc")
{
auftraege = auftraege.OrderBy(x => x.AuftragStatus).AsEnumerable().ToList();
}
else if (sidx == "AuftragStatus" && sord == "desc")
{
auftraege = auftraege.OrderByDescending(x => x.AuftragStatus).AsEnumerable().ToList();
}
// Erstellung des JSON Objekts welches die einzelnen Aufträge enthält
var jsonauftraege = new object[auftraege.Count()];
for (int i = 0; i < auftraege.Count; i++)
{
jsonauftraege[i] = new
{
id = auftraege[i].KA_Auftrag_GUID,
cell = new[] {
"Details",
"Bearbeiten",
(auftraege[i].Titel != null) ? auftraege[i].Titel.ToString(): " ",
(auftraege[i].Bearbeitungsort != null) ? auftraege[i].Bearbeitungsort.ToString(): " ",
开发者_如何学编程 (auftraege[i].AuftragStatus != null) ? auftraege[i].AuftragStatus.ToString(): " ",
}
};
}
// Erstellung des JSON Results welches das Grid versteht
var result = new JsonResult();
result.Data = new { page = page, records = summeauftraege, rows = jsonauftraege, total = totalPages };
return Json(result.Data);
}
.OrderBy()
on the outer query is required to come before .Skip()
. As far as I can see, doing it the way you have it should not even work. If it works at all you're probably in object space, not L2E. You must order before you skip or take.
here is the solution:
//
// Post: /Admin/IndexGridData
// Gibt ein JSON Result mit allen Aufträgen für das jqGrid zurück
[HttpPost]
public ActionResult IndexGridData(string sidx, string sord, int page, int rows)
{
// Ermittlung der Zusatzinformationen die das Grid anzeigt (Anzahl Aufträge, momentan angezeigte Aufträge
int start = (page - 1) * rows;
var auftraege = _db.Auftrag
.Where(x => x.AuftragStatus != "storno")
.OrderBy(x => x.Titel)
.Select(auftrag => new AuftragModels.GridAnsicht
{
Auftrag_GUID = auftrag.Auftrag_GUID,
Titel = auftrag.Titel,
Bearbeitungsort = auftrag.KT_Bearbeitungsort.Text,
AuftragStatus = auftrag.KT_AuftragStatus.Text,
}
);
}
// zusammen gesetztes SQL Statement speichern
var sqlstring = ((ObjectQuery)auftraege).ToTraceString();
// Sortierung des Grids anwenden
if (sidx == "Titel" && sord == "asc")
{
auftraege = auftraege.OrderBy(x => x.Titel);
}
else if (sidx == "Titel" && sord == "desc")
{
auftraege = auftraege.OrderByDescending(x => x.Titel);
}
else if (sidx == "Bearbeitungsort" && sord == "asc")
{
auftraege = auftraege.OrderBy(x => x.Bearbeitungsort);
}
else if (sidx == "Bearbeitungsort" && sord == "desc")
{
auftraege = auftraege.OrderByDescending(x => x.Bearbeitungsort);
}
else if (sidx == "AuftragStatus" && sord == "asc")
{
auftraege = auftraege.OrderBy(x => x.AuftragStatus);
}
else if (sidx == "AuftragStatus" && sord == "desc")
{
auftraege = auftraege.OrderByDescending(x => x.AuftragStatus);
}
// zusammen gesetztes SQL Statement speichern
//sqlstring = ((ObjectQuery)auftraege).ToTraceString();
// aufträge zu einer Liste speichern, damit diese durchlaufen werden kann
var auftragListe = auftraege
.AsEnumerable().ToList();
// Anzahl der Seiten berechnen
int summeauftraege = auftragListe.Count();
int totalPages = (int)Math.Ceiling((float)summeauftraege / (float)rows);
// nur die Aufträge anzeigen, die auf eienr Seite sichtbar sind
auftragListe = auftragListe
.Skip(start)
.Take(rows)
.AsEnumerable().ToList();
// Erstellung des JSON Objekts welches die einzelnen Aufträge enthält
var jsonauftraege = new object[auftragListe.Count()];
for (int i = 0; i < auftragListe.Count(); i++)
{
jsonauftraege[i] = new
{
id = auftragListe[i].Auftrag_GUID,
cell = new[] {
"Details",
"Bearbeiten",
(auftragListe[i].Titel != null) ? auftragListe[i].Titel.ToString(): " ",
(auftragListe[i].Bearbeitungsort != null) ? auftragListe[i].Bearbeitungsort.ToString(): " ",
(auftragListe[i].AuftragStatus != null) ? auftragListe[i].AuftragStatus.ToString(): " ",
}
};
}
// Erstellung des JSON Results welches das Grid versteht
var result = new JsonResult();
result.Data = new { page = page, records = summeauftraege, rows = jsonauftraege, total = totalPages };
return Json(result.Data);
}
精彩评论