【问题标题】:Show foreign key text in jqGrid在 jqGrid 中显示外键文本
【发布时间】:2011-05-30 13:53:59
【问题描述】:

我有一个绑定到 JSON 数据源(WCF Web 服务)的 jqGrid。 WCF 方法返回一个 id 列表。以下是返回的 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 中显示这些数据很好,但显然我想向用户显示分支和角色名称而不是他们的 ID。 很遗憾,不能更改 WCF 以将数据作为 JOINS 返回,因为 WCF 方法可能不会改变。

我还可以访问 2 个 Web 服务方法 GetBranches 和 GetRoles,这两个方法都返回包含完整详细信息的数组 - 我必须将这些信息存储到 javascript 数组中。

有没有一种方法可以告诉 jqGrid 绑定到我的原始数组,但以某种方式告诉它从不同的数据源(GetBranches 和 GetRoles 数组)获取分支和角色名称?

【问题讨论】:

    标签: jquery json jqgrid


    【解决方案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"}}]
    

    这种方式有一个结构良好的对象集合。

    【讨论】:

    • 虽然这可行并且我对它作为答案感到满意,但如果有人可以提供不涉及更改 WCF 的其他建议 - 因为它无法更改 - 我很乐意将其作为正确答案删除.
    【解决方案2】:

    为什么不直接在 WCF 方法中调用 GetBranchesGetRoles 并构建所有匹配项(关系),生成一个包含 @987654323 的新数组(列表)对象@?
    您只需一次调用即可将新列表返回到 jqGrid。实施起来会更快、更容易。

    【讨论】:

    • @LeftyX,感谢您的回复。这将是我通常会这样做的方式,但正如我在帖子中指出的那样,更改 WCF 方法不是一种选择。
    • @pedrodg:我猜你的 jqgrid 存在于 asp.net 页面或 asp.net MVC 中,对吧?
    • @LeftyX:是的,它存在于 ASP.Net 页面中
    • @pedrodg:好的,所以我想您可以从您的操作中调用您的 WFC 方法,在操作中,您可以进行转换并加入集合以获得新的集合(正如我建议的那样在我的回答中),并将其返回给您的 jqGrid。
    • @LeftyX:再次感谢您的回复。虽然这很有效,并且与我目前正在做的事情一样,但我真正想知道的是 jqGrid 中是否有本地方式。我在下面发布了我的解决方案。我的建议是,也许我们可以扩展 jqGrid 以按照我的方式进行一些映射。
    猜你喜欢
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多