How to Get Odata Next Link from the Returned Json Object Using Angular $Http Service
I Have Implemented Odata Query Syntax for My Web Api. I Am Successfully Able to Return Only the First 10 Results and the Link for the Further Results. However...
I have implemented Odata query syntax for my web api. I am successfully able to return only the first 10 results and the link for the further results. However I am unable to extract this link from the JSON object that is returned by the server using my angularjs front end.
Say the server is responding as follows:
{
"odata.metadata":"","value":[
{
"id":001,"name":"abc"
},{
"id":002,"name":"pqr"
},{
"id":003,"name":"xyz"
},{
.
.
.
],"odata.nextLink":""
}
Now I am displaying the data by using the success method of $http by assigning the returned data to a variable and using ng-repeat. I am assigning it as follows:
.success(function(data)){
$scope.foo = data.value;
}
However when I try to access the next link using:
$scope.link = data.odata.nextLink;
within the success method it gives me an error. What am I missing over here? How else can I access the link returned? Is there any other method to implement server side paging?
5 Answers
I had the same problem, more or less. I guess it has got to do with JavaScript objects and how their properties are referred to. The reference
data.odata.nextLink
would mean there is a property "odata" with a sub-property/field "nextLink". This is not the case, "odata.nextLink" is the name of the property. I don't know why OData is like this.
I got the contents of this property by using a string reference i.e.
data['odata.nextLink']
Don't know if there is some drawback, but seems to work...
using Newtonsoft.Json;
[JsonProperty("@odata.nextLink")]
public string nextPage { get; set; }
I got it to work using
theReturnedObject['@odata.nextLink']
Don't forget that the odata values should have an @ in front of them. I'm not sure how your implementation handles that character but it should be a valid prefix.
The issue I am running into is that some providers use the full path and some only use a relative path from the service endpoint.
The C# method that I devised for use with the Microsoft Graph API is as follows.
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
In the above method, SpecialStrings.EMPTY_STRING is the name of a true constant that I use in lieu of string.Empty.
A similar method should work for PowerShell, too.