0

ASP.NETMVCでjQueryグリッドを使用するPhilHaackの例に従っています。私はそれを機能させています、そしてそれはうまく機能します...1つの小さな問題を除いて。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、One、2、Twoなど))。

{"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で並べ替えると、1行おきに順序(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]...など

これは常に起こっており、常に一貫しています。何が起こっているのかを理解しようと少し頭がおかしくなります。それは単純なものでなければならないように思われるからです。

4

3 に答える 3

1

INT型のデータでも同じ問題があります。キュー内の要素(A、B、C)がNVARCHARタイプの場合、この問題は発生しません。したがって、問題は明らかにSqlFunction.StringConvert関数にあります。

于 2011-02-09T13:37:51.067 に答える
0

ここで説明されている方法を使用してみてください。のプロパティの代わりにフィールドを使用する場合は、 andの代わりにrepository.FindAllPeople()使用されているコードのコメント部分を確認する必要があります。FieldInfoGetFieldPropertyInfoGetProperty

于 2011-02-02T20:16:34.973 に答える
0

私はここで解決策を見つけました:奇妙な問題によるエンティティの順序へのlinq

この問題は、LinqtoEntitiesが文字列の処理に問題があるという事実に最終的に起因しています。SqlFunctions.StringConvertメソッドを使用していたとき、これは誤って変換を実行していました(ただし、順序が入れ替わった理由を完全には理解していないことを認める必要があります)。

いずれの場合も、上記の投稿によると、問題を修正するための解決策は、Linq to Entitiesが文字列を適切に処理できるように、ローカルで選択を行うことでした。これから、私の最終的なコードは次のとおりです。

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);
于 2011-02-09T16:57:01.370 に答える