2011-05-30 49 views
0

我有一個jqGrid,我綁定到JSON數據源(WCF Web服務)。 WCF方法返回一個id列表。以下是返回的JSON示例。如您所見,它是用戶與分支之間的角色關係,即用戶可以在不同的分支中擁有不同的角色。在jqGrid中顯示外鍵文本

[{"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數組)獲取分支和角色名稱?

回答

0

我和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"}}] 

這種方式有一個很好的結構化的對象集合。

+0

雖然這個方法很有效,但我對它的答案感到滿意,如果任何人都可以提供其他不涉及改變WCF的建議 - 因爲它不能改變 - 我會很樂意將其作爲正確答案刪除。 – pedrodg 2011-06-02 07:00:46

0

爲什麼你不只是調用GetBranchesGetRolesWCF方法,並建立所有的比賽(的關係),生成新的數組,它包含BranchId, BranchName, SysRoleId, SysRoleName, SysUserId對象(名單)?
您只需一個電話即可將您的新清單返回至jqGrid。這將更快,更容易實施。

+0

@LeftyX,謝謝你的回覆。這將是我通常會這樣做的方式,但正如我在我的帖子中指出的,更改WCF方法不是一種選擇。 – pedrodg 2011-05-30 14:24:39

+0

@pedrodg:我猜你的jqgrid生活在一個asp.net頁面或asp.net MVC中,對吧? – LeftyX 2011-05-30 14:26:57

+0

@ LeftyX:是的,它住在一個ASP中。網頁 – pedrodg 2011-05-31 06:35:17