Показать текст внешнего ключа в jqGrid

У меня есть jqGrid, который я привязываю к источнику данных JSON (веб-служба WCF). Метод WCF возвращает список идентификаторов. Ниже приведен пример возвращаемого JSON. Как вы можете видеть, это отношение пользователя к ветке к роли, то есть пользователь может иметь разные роли в разных ветвях.

    [{"entityHashCode":null,"BranchId":25,"SysRoleId":1,"SysUserId":1},
{"entityHashCode":null,"BranchId":25,"SysRoleId":2,"SysUserId":1},
{"entityHashCode":null,"BranchId":26,"SysRoleId":1,"SysUserId":1]

Отображение этих данных в jqGrid в порядке, но, очевидно, я хочу показать пользователю имена ветвей и ролей, а не их идентификаторы. К сожалению, изменение WCF так, что он возвращает данные, поскольку JOINS не является опцией, потому что метод WCF не может меняться.

У меня также есть доступ к 2 методам веб-сервиса GetBranches и GetRoles, оба из которых возвращают массивы с полными подробностями - у меня есть javascript-массивы, в которых я храню эту информацию.

Есть ли способ, с помощью которого jqGrid может связываться с моим исходным массивом, но как-то подсказывать ему получить имя ветки и роли из разных источников данных (массивы GetBranches и GetRoles)?

Ответ 1

Я с разговорами, которые у меня были с LeftyX, похоже, не является родным способом сделать это в jqGrid, поэтому я создал метод для "JOIN" между объектами в массиве. Функция следующая:

function joinJSONFK (entities, fkProperties, fkLookupArrays) {

    function findValInAry(ary, idfield, value) {
        for (var i = 0; i < ary.length; i++) {
            if (value == ary[i][idfield]) {
                return ary[i];
            }
        }
        return null;
    };

    function applyFKProperties(entity, fkProperties, fkLookupArrays) {
        for (var i = 0; i < fkProperties.length; i++) {
            entity[fkProperties[i] + "Source"] = findValInAry(fkLookupArrays[i], fkProperties[i], entity[fkProperties[i]]);
        }
        return entity;
    }

    var entityary = [];
    if (!entities instanceof Array) {
        entities = applyFKProperties(entities);
        return entities[0];
    }
    else {
        for (var i = 0; i < entities.length; i++) {
            entities[i] = applyFKProperties(entities[i], fkProperties, fkLookupArrays);
        }
        return entities;
    }
}

Вы использовали бы его следующим образом:

userRoleData = joinJSONFK(result, ["SysRoleId", "BranchId"], [GlobalRoles, GlobalBranches]); 

Где "результат" представляет собой массив объектов JSON со следующим форматом:

[{"entityHashCode":null,"BranchId":25,"SysRoleId":1,"SysUserId":1},
{"entityHashCode":null,"BranchId":25,"SysRoleId":2,"SysUserId":1},
{"entityHashCode":null,"BranchId":26,"SysRoleId":1,"SysUserId":1]

И [ "SysRoleId", "BranchId" ] - это массив внешних ключей, которые должны быть "JOINED", а [GlobalRoles, GlobalBranches] - это массив, содержащий данные "поиска" для внешних ключей.

GlobalRoles будет выглядеть примерно так:

[{"Name":"Admin","SysRoleId":1,"Description":"Some description"},
{"Name":"Role 2","SysRoleId":2,"Description":"Some description"},
{"Name":"A new role","SysRoleId":3,"Description":"Some description"},
{"Name":"Another Role","SysRoleId":4,"Description":"Some description"}]

И GlobalBranches выглядят примерно так:

[{"BranchName":"Branch 25","BranchId":25,"Description":"describe the branch"},
{"BranchName":"Branch 26","BranchId":26,"Description":"describe the branch"},
{"BranchName":"Branch 27","BranchId":27,"Description":"describe the branch"}]

После вызова функции "userRoleData" будет выглядеть примерно так:

[{"entityHashCode":null,"BranchId":25,"SysRoleId":1,"SysUserId":1, "SysRoleIdSource":{"Name":"Admin","SysRoleId":1,"Description":"Some description"}, "BranchIdSource":{"BranchName":"Branch 25","BranchId":25,"Description":"describe the branch"}},
{"entityHashCode":null,"BranchId":25,"SysRoleId":2,"SysUserId":1}, "SysRoleIdSource":{"Name":"Role 2","SysRoleId":2,"Description":"Some description"}, "BranchIdSource":{"BranchName":"Branch 25","BranchId":25,"Description":"describe the branch"}},
{"entityHashCode":null,"BranchId":26,"SysRoleId":1,"SysUserId":1, "SysRoleIdSource":{"Name":"Admin","SysRoleId":1,"Description":"Some description"}, "BranchIdSource":{"BranchName":"Branch 26","BranchId":26,"Description":"describe the branch"}}]

Этот способ имеет хорошо структурированную коллекцию объектов.

Ответ 2

Почему бы вам просто не называть GetBranches и GetRoles в свой WCF метод и строить все соответствия (отношения), генерируя новый массив (List of), который содержит BranchId, BranchName, SysRoleId, SysRoleName, SysUserId?
Вы можете вернуть свой новый список jqGrid только одним вызовом. Это было бы быстрее и проще реализовать.