我已经为我的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;
在成功方法中,它给了我一个错误。我在这里错过了什么?我怎样才能访问返回的链接?有没有其他方法来实现服务器端分页?
答案 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。