2016-05-23 127 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>