Результаты JSON возвращаются в другом порядке, чем ожидалось - PullRequest
0 голосов
/ 02 февраля 2011

Я следую примеру Фила Хаака по использованию jQuery Grid с ASP.NET MVC . У меня это работает, и это работает хорошо ... за исключением одной незначительной проблемы. Когда я сортирую столбцы по чему-то отличному от идентификатора, данные 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);
}

Когда я сортирую по PersonID в таблице jsGrid, я получаю эти данные обратно (я просто использовал имя текущего идентификатора в качестве имени - например, 1, Один; 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, в каждой второй строке меняется порядок (идентификатор и имя). Поэтому, когда я показываю это в таблице, PersonName находится в столбце 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] ... и т.д.

Это всегда происходит и всегда соответствует. Я немного схожу с ума, пытаясь понять, что происходит, потому что кажется, что это должно быть что-то простое.

Ответы [ 3 ]

1 голос
/ 09 февраля 2011

У меня та же проблема с моими данными типа INT.Если элементы в моей очереди (A, B, C) относятся к типу NVARCHAR, у меня нет этой проблемы.Так что проблема, очевидно, в функции SqlFunction.StringConvert.

0 голосов
/ 09 февраля 2011

Я нашел решение здесь: Линк к сущности, порядок по странной проблеме

Проблема в конечном итоге связана с тем, что у Linq to Entities есть проблемы с обработкой строк. Когда я использовал метод 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);
0 голосов
/ 02 февраля 2011

Попробуйте использовать метод, описанный здесь .Если вы используете поля вместо свойств в repository.FindAllPeople(), вы должны посмотреть на закомментированную часть кода, где используются FieldInfo и GetField вместо PropertyInfo и GetProperty.

...