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

#jquery #json #jqgrid

#jquery #json #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 так, чтобы он возвращал данные в виде СОЕДИНЕНИЙ, невозможно, поскольку метод WCF может не измениться.

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

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

Ответ №1:

Я согласен с разговорами, которые у меня были с LeftyX, похоже, что в jqGrid нет встроенного способа сделать это, поэтому я создал метод для выполнения «СОЕДИНЕНИЯ» между объектами в массиве. Функция заключается в следующем:

 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»] — это массив внешних ключей, к которым необходимо «ПРИСОЕДИНИТЬСЯ», а [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"}]
  

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

 [{"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"}}]
  

Таким образом, получается красиво структурированная коллекция объектов.

Комментарии:

1. Хотя это работает, и я доволен этим как ответом, если кто-нибудь может дать другие предложения, которые не связаны с изменением WCF — потому что он не может измениться — я с радостью удалю это как правильный ответ.

Ответ №2:

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

Комментарии:

1. @LeftyX, спасибо за твой ответ. Обычно я бы делал это именно так, но, как я указывал в своем посте, изменение метода WCF не является вариантом.

2. @pedrodg: Я предполагаю, что ваш jqgrid живет в asp.net страница или asp.net MVC, верно?

3. @LeftyX: Да, он находится в ASP.Net страница

4. @pedrodg: Хорошо, я думаю, вы можете вызвать свой метод WFC из своего действия, и там, в действии, вы можете выполнить преобразование и объединить коллекции, чтобы получить новую (как я предложил в своем ответе), и вернуть ее в свой jqGrid.

5. @LeftyX: Еще раз спасибо за ваш ответ. Хотя это работает и соответствует тому, что я делаю в настоящее время, что я действительно хотел знать, так это то, существует ли собственный способ в jqGrid. Я опубликовал свое решение ниже. Я предлагаю, возможно, расширить jqGrid, чтобы выполнить некоторое отображение так, как это сделал я.