2016-05-23 160 views
0

這似乎是一種常見的情況,所以我一直在尋找這樣的問題,但我找不到它。我在ASP.NET中構建了一個RESTful Web API。我有兩個相關的表格:照片和PhotoGroups。照片表有一個PhotoGroupID列,它與PhotoGroups中的同一列相關。在我的AngularJS單頁應用程序中,我使用標準RESTful查詢從兩個表中檢索數據。我正在顯示網頁佈局中列出的照片,其中一列是PhotoGroupID,數字如1,2,3和4.因此,如何通過加入圖片來顯示這些組的名稱而不是這些數字以REST風格進行兩次查詢?我知道如何在Web API中添加一個新方法,使我能夠加入數據,但這在RESTful的意義上看起來並不自然。在AngularJS的客戶端執行此操作的常用方法是什麼?是否有某種連接兩個表的過濾器,或者某種特殊語法將列綁定到PhotoGroup名稱列?在將來顯示相關表格的信息時,我會碰到類似的情況,我想以正確的方式做到這一點。如何在REST風格的Web API中加入相關數據?

+0

你能不能一個列表屬性添加到PhotoGroups。那麼當你打開/查看一個攝影組時,它會拉下該組內的所有照片?然後,您可以訪問該組信息以及該組內的所有照片。 – Dylan

+2

我的看法是,您有API處理照片和PhotoGroups之間的關係,並避免第二次調用API。如果您擔心處理可能對錶格造成負面影響的更新,那麼我將使用適當的映射來實現DTO,從而將任何實體從更新中排除。我不認爲這違反了一個寧靜的API的精神。 – jbrown

+1

關於這個話題有一個很好的複合視頻:https://wildermuth.com/2015/07/22/Mapping_Between_Entities_and_View_Models –

回答

0

我開始通過向我的Web API添加一個新方法來解決這個問題,該方法加入了Photos和PhotoGroups表,但我很快意識到我將返回一組匿名對象。要解決這個問題,需要聲明一個包含我想返回的列的新類。這似乎比REST的美觀和簡單複雜得多。

所以我考慮了AngularJS中的替代方案,並決定我可以編寫一個自定義過濾器,使用我已經在控制器範圍內擁有的PhotoGroups JSON數組,將PhotoGroupID轉換爲GroupName。下面顯示了實現該解決方案的代碼。這有點麻煩,但不是很好,它使Web API保持簡潔。

in Filter.js: 
 

 
angular.module('PhotoFilters', []).filter('groupName', function() 
 
{ 
 
    return function (input, scope) 
 
    { 
 
     var groupName = "Not Found"; 
 
     angular.forEach(scope.PhotoGroups, function (group) 
 
     { 
 
      if (group.PhotoGroupID == input) 
 
      { 
 
       groupName = group.GroupName; 
 
      } 
 
     }); 
 
     return groupName; 
 
    }; 
 
}); 
 

 
in my HTML table: 
 

 
<td>{{ x.PhotoGroupID | groupName:this }}</td>