I have the following code which represents the results of a paged query.
public class Page<T> : IEnumerable<T>
{
public IEnumerable<T> Source { get; }
public int PageNumber { get; }
public int PageSize { get; }
public int TotalCount { get; }
public int TotalPages => TotalCount / PageSize + (TotalCount % PageSize > 0 ? 1 : 0);
public Page(
IEnumerable<T> source,
int pageNumber,
int pageSize,
int totalCount)
{
Source = source;
PageNumber = pageNumber;
PageSize = pageSize;
TotalCount = totalCount;
}
public IEnumerator<T> GetEnumerator()
{
return Source.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
And here is an MVC controller method that returns a page of results via the MVC Json Serializer (not the WebAPI serializer).
[HttpGet, Route("mergeable")]
public async Task<ActionResult> Mergeable([FromUri] Mergeable.Query query)
{
Page<Mergeable.Model> result = await mediator.Send(query);
return Json(result, JsonRequestBehavior.AllowGet);
}
When called, the response Json is the array of T. All the paging meta properties (TotalCount, PageNumber, PageSize) are not serialized.
Does the default MVC Json serializer (whatever that is) ignore other properties on an instance of IEnumerable? How can I override this behaviour?