Использование свойства jsonmap в jqGrid colModel с нетипизированным JSON - PullRequest
1 голос
/ 16 июня 2011

Моя служба WCF с поддержкой AJAX возвращает JSON с использованием этого контракта,

[DataContract]
public class JQGridContract
{
    [DataContract]
    public class Row
    {
        [DataMember]
        public int id { get; set; }

        [DataMember]
        public List<string> cell { get; set; }

        public Row()
        {
            cell = new List<string>();
        }
    }

    [DataMember]
    public int page { get; set; }

    [DataMember]
    public int total { get; set; }

    [DataMember]
    public int records { get; set; }

    [DataMember]
    public List<Row> rows { get; set; }

    public JQGridContract()
    {
        rows = new List<Row>();
    }
}  

Таким образом, каждая строка данных в результатах нетипизирована - строка по сути является просто списком без каких-либо имен столбцов.

Думаю, это делает невозможным использование атрибута jsonmap в colModel?В основном я извлекаю DataTable из базы данных, а затем помещаю этот DataTable в эту форму JQGridContract.Информация о столбцах из DataTable не содержится в json, передаваемом клиенту.

Я бы хотел иметь возможность сопоставить столбец моего базового DataTable со столбцом моего jqGrid, но без необходимости строго набиратьмой контракт данных.Это возможно?Я думал, что это может быть использование анонимных типов, где список анонимных объектов (каждый анонимный объект является строкой), которые имеют свойства, соответствующие каждому столбцу в базовом DataTable, но я не смог заставить эту работу.

Спасибо.

EDIT

Вот пример желания, которого я хочу достичь (используя код на стороне сервера, а не javascript).

Ниже приведена модель столбца для jqGrid.это сделано в c #:

            return new JQGridColumnCollection()
            {
                new JQGridColumn()
                {
                    DataField = "ID",     // maps to the DataTable
                    DataType = typeof(int),
                    HeaderText = "ID",
                    PrimaryKey = true,
                },
                new JQGridColumn()
                {
                    DataField = "Name",  
                    DataType = typeof(string),
                    HeaderText = "Name"
                },
                new JQGridColumn()
                {
                    DataField = "Birthdate",  
                    DataType = typeof(DateTime),
                    HeaderText = "Birth Date" 
                }                
            };

Свойство «DataField» каждого столбца отображает этот столбец в столбец в подчиняющейся таблице DataTable.Порядок столбцов в DataTable может быть другим:

DataTable table = GetDataTable(" SELECT [Birthdate], [ID], [Name] From PersonTable "); 

Но независимо от того, как я запрашиваю свою базу данных, в сетке все равно будет отображаться, где первый столбец - ID, второй столбец - Имя, итретий столбец - дата рождения.Мне не нужно менять свой SQL-запрос, чтобы изменить порядок столбцов в моей сетке.

Я, по сути, хочу эквивалент свойства DataField в моей клиентской colModel для jqGrid.Для этого потребуется, чтобы мои столбцы JSON были названы или чтобы я мог по крайней мере сопоставить столбец jqGrid с числовым индексом столбца в источнике данных JSON.

1 Ответ

1 голос
/ 16 июня 2011

Используемый вами класс JQGridContract получит данные в формате, который может быть прочитан стандартом jsonReader (подробности см. здесь ).Каждая строка данных в результатах не является «нетипизированной».Он имеет тип «строка».Нет необходимости использовать jsonmap. Положение строки в строке определяет, к какому столбцу сетки принадлежит строка.Таким образом, для отображения данных должна использоваться позиция в списке cell.

Если вы используете класс JQGridContract, вам не нужно строго преобразовывать данные типа.Вы можете легко преобразовать любой тип данных в строку и данные вашей таблицы базы данных в экземпляр JQGridContract.Если у вас возникнут проблемы, вы должны добавить свой вопрос к определению colModel jqGrid, который вы используете.

ОБНОВЛЕНО : Неважно, в каком порядке вы используете поля вВЫБРАТЬ.Важно только, в каком порядке вы помещаете данные из переменной table в экземпляр JQGridContract.У вас есть метод, например, GetUserBirthday, который возвращает JQGridContract.Метод должен поместить в список cell сначала ID, преобразованный в строку, затем Name, а затем Birthdate, преобразованный в формат даты ISO (ггг-мм-дд).Если вы хотите использовать JQGridContract, который вы определили, вы должны сделать это.

Между прочим, DataTable не самый лучший способ получить данные за SELECT.Более эффективно использовать SqlCommand и SqlDataReader .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...