如何使用angular $ http服务从返回的JSON对象获取Odata Next Link

时间:2015-05-04 17:23:56

标签: .net json angularjs asp.net-web-api odata

我已经为我的web api实现了Odata查询语法。我成功地只能返回前10个结果和更多结果的链接。但是,我无法从使用angularjs前端的服务器返回的JSON对象中提取此链接。

假设服务器响应如下:

{
  "odata.metadata":"http://localhost:60497/odata/$metadata#tables","value":[
    {
      "id":001,"name":"abc"
    },{
      "id":002,"name":"pqr"
    },{
      "id":003,"name":"xyz"
    },{
      .
      .
      .
  ],"odata.nextLink":"http://localhost:60497/odata/tables?$skip=10"
}

现在我通过使用$ http的成功方法显示数据,方法是将返回的数据分配给变量并使用ng-repeat。我按如下方式分配:

.success(function(data)){
  $scope.foo = data.value;
}

但是,当我尝试使用以下方式访问下一个链接时

$scope.link = data.odata.nextLink;

在成功方法中,它给了我一个错误。我在这里错过了什么?我怎样才能访问返回的链接?有没有其他方法来实现服务器端分页?

5 个答案:

答案 0 :(得分:6)

我或多或少都有同样的问题。我想这与JavaScript对象及其属性的引用有关。参考

data.odata.nextLink

意味着有一个属性" odata"使用子属性/字段" nextLink"。事实并非如此," odata.nextLink"是该物业的名称。我不知道为什么OData是这样的。

我通过使用字符串引用获得了此属性的内容,即

data['odata.nextLink']

不知道是否有缺点,但似乎有效......

答案 1 :(得分:2)

    using Newtonsoft.Json;     
    [JsonProperty("@odata.nextLink")]
    public string nextPage { get; set; }

答案 2 :(得分:1)

我可以使用它

theReturnedObject['@odata.nextLink']

答案 3 :(得分:0)

不要忘记odata值应该在他们面前有一个@。我不确定您的实现如何处理该字符,但它应该是一个有效的前缀。

我遇到的问题是某些提供程序使用完整路径,而有些提供程序仅使用服务端点的相对路径。

答案 4 :(得分:0)

我设计的用于 Microsoft Graph API 的 C# 方法如下。

private static string GetNextLink ( JObject pjobjResult )
{
    JProperty jtLastToken = ( JProperty ) pjobjResult.Last;

    if ( jtLastToken.Name.Equals ( @"@odata.nextLink" ) )
    {
        return jtLastToken.Value.ToString ( );
    }   // TRUE (There is at least one more page.) block, if ( jtLastToken.Name.Equals ( @"@odata.nextLink" ) )
    else
    {
        return SpecialStrings.EMPTY_STRING;
    }   // FALSE (The current page is the last one.) block, if ( jtLastToken.Name.Equals ( @"@odata.nextLink" ) )
}   // private static string GetNextLink

在上述方法中,SpecialStrings.EMPTY_STRING 是我用来代替 string.Empty 的真正常量的名称。

类似的方法也适用于 PowerShell