Je suis l'exemple de Phil Haack sur l'utilisation de jQuery Grid avec ASP.NET MVC . Je le fais fonctionner et cela fonctionne bien ... sauf pour un problème mineur. Lorsque je trie les colonnes par autre chose que l'ID, les données JSON renvoyées par le serveur sont très ... eh bien ... fausses. Voici ma méthode de contrôleur.
[HttpPost]
public ActionResult PeopleData(string sidx, string sord, int page, int rows)
{
int pageIndex = Convert.ToInt32(page) - 1;
int pageSize = rows;
int totalRecords = repository.FindAllPeople().Count();
int totalPages = (int)Math.Ceiling((float)totalRecords / (float)pageSize);
var people = repository.FindAllPeople()
.OrderBy(sidx + " " + sord)
.Skip(pageIndex * pageSize)
.Take(pageSize);
var jsonData = new
{
total = totalPages,
page = page,
records = totalRecords,
rows = (
from person in people
select new
{
i = person.PersonID,
cell = new List<string> { SqlFunctions.StringConvert((double) person.PersonID), person.PersonName }
}
).ToArray()
};
return Json(jsonData);
}
Lorsque je trie par PersonID dans la table jsGrid, je récupère ces données (je viens d'utiliser le nom de l'ID actuel comme nom - par exemple 1, One; 2, Two, etc.)
{"total":1,"page":1,"records":6,"rows":[{"i":1,"cell":[" 1","One"]},{"i":2,"cell":[" 2","Two"]},{"i":3,"cell":[" 3","Three"]},{"i":4,"cell":[" 4","Four"]},{"i":5,"cell":[" 5","Five"]},{"i":6,"cell":[" 6","Six"]}]}
Cependant, lorsque je trie par PersonName, toutes les autres lignes ont l'ordre (l'ID par rapport au nom) inversé. Donc, quand je le montre dans le tableau, le PersonName est dans la colonne ID et l'ID est dans la colonne person. Voici le résultat JSON.
{"total":1,"page":1,"records":6,"rows":[{"i":5,"cell":[" 5","Five"]},{"i":4,"cell":["Four"," 4"]},{"i":1,"cell":[" 1","One"]},{"i":6,"cell":["Six"," 6"]},{"i":3,"cell":[" 3","Three"]},{"i":2,"cell":["Two"," 2"]}]}
Quelqu'un a-t-il une idée de ce que j'ai fait de mal qui fait que cela se produit?
Mise à jour
J'ai donc appris que ce qui se passe, c'est que les valeurs de mon tableau retournent pour tous les autres éléments du tableau. Par exemple ... si je remplis ma base de données avec:
[A, B, C]
puis pour chaque résultat pair (ou impair, si vous comptez à partir de 0), mes données reviennent:
[C, B, A]
Donc, en fin de compte, mes données de ligne JSON ressemblent à:
[A, B, C] [C, B, A] [A, B, C] [C, B, A] ... etc
Cela se produit toujours et toujours cohérent. Je deviens un peu fou en essayant de comprendre ce qui se passe parce qu'il semble que ce devrait être quelque chose de simple.
J'ai trouvé la solution ici: linq aux entités orderby étrange problème
Le problème vient finalement du fait que Linq to Entities a du mal à gérer les chaînes. Lorsque j'utilisais la méthode SqlFunctions.StringConvert, cela effectuait incorrectement la conversion (bien que, je dois admettre que je ne comprends pas complètement pourquoi l'ordre a ensuite été inversé).
Dans les deux cas, selon le post ci-dessus, la solution pour résoudre le problème était de faire la sélection localement afin que je puisse «forcer» Linq aux entités à travailler correctement avec les chaînes. De cela, mon code final est:
var people = repository.FindAllPeople()
.OrderBy(sidx + " " + sord)
.Skip(pageIndex * pageSize)
.Take(pageSize);
// Due to a problem with Linq to Entities working with strings,
// all string work has to be done locally.
var local = people.AsEnumerable();
var rowData = local.Select(person => new
{
id = person.PersonID,
cell = new List<string> {
person.PersonID.ToString(),
person.PersonName
}
}
).ToArray();
var jsonData = new
{
total = totalPages,
page = page,
records = totalRecords,
rows = rowData
};
return Json(jsonData);
J'ai le même problème avec mes données qui sont de type INT. Si les éléments de ma file d'attente (A, B, C) sont de type NVARCHAR, je n'ai pas ce problème. Donc, le problème est évidemment dans la fonction SqlFunction.StringConvert.