ASP.NET MVCでjQueryグリッドを使用するPhil Haackの例に従っています 。私はそれを動かしています、そしてそれはうまく働きます...一つの小さな問題を除いて。列をID以外でソートすると、サーバーから返されるJSONデータは非常に...まあ...間違っています。これが私のコントローラメソッドです。
[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);
}
jsGridテーブルでPersonIDでソートすると、このデータが返されます(現在のIDの名前を名前として使用しただけです(例:1、1、2、2など))。
{"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"]}]}
ただし、PersonNameで並べ替えると、他のすべての行の順序(IDと名前)が逆になります。テーブルに表示すると、PersonNameはID列にあり、IDはperson列にあります。 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"]}]}
誰かが私が間違ってこれを起こした原因について何か洞察がありますか?
更新
だから、私は、何が起こっているのか、私の配列の値が配列内の他のすべての項目で反転していることを学びました。たとえば...データベースに次のように入力すると:
[A、B、C]
その後、すべての偶数番号の結果(または、0から数えている場合は奇数)に対して、私のデータが返されます。
[C、B、A]
つまり、最終的に、私のJSON行データは次のようになります。
[A、B、C] [C、B、A] [A、B、C] [C、B、A] ...など
これは常に起こり、常に一貫しています。何が起こっているのかを理解しようとするのは少しおかしいのです。
私はここで解決策を見つけました: エンティティからlinqへの奇妙な問題
最終的にこの問題は、Linq to Entitiesが文字列の処理に問題があるという事実から生じます。 SqlFunctions.StringConvertメソッドを使用していたとき、これは変換を誤って実行していました(ただし、順序が切り替わった理由を完全に理解していないことは認めざるを得ません)。
どちらの場合も、上記の投稿によると、問題を修正するための解決策は、選択をローカルで実行して、Linqをエンティティに「強制的に」文字列を適切に処理させることでした。これから、私の最終的なコードは:
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);
INTタイプのデータにも同じ問題があります。キューの要素(A、B、C)がNVARCHARタイプの場合、この問題は発生しません。したがって、問題は明らかにSqlFunction.StringConvert関数にあります。