2014-09-28 4 views
5

В настоящее время в моем сервисе «Отдых» я возвращаю выгружаемые данные, используя следующую модель.Добавление разбивки на страницы заголовков в Web Api 2

public class PagedResults<T> 
{ 
    public List<LinkModel> Links { get; set; } 
    public int TotalCount { get; set; } 
    public double TotalPages { get; set; } 
    public List<T> Results { get; set; } 
} 

Это работает хорошо, но я наткнулся на следующее сообщение.

http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api#pagination

Мое любопытство было козырьком, он упоминает, используя заголовки HTTP для возврата ссылки и информацию постраничной. Хотя в сообщении упоминается RFC 5988, я не смог раскрыть то, что это действительно означает? Был ли он фактически принят в качестве какого-то стандарта?

Вопрос здесь в ASP.Net Web API 2, есть ли поддержка для добавления информации разбиения на страницы в заголовке ссылки? Я использовал intellisense для просмотра заголовков HTTP-ответов, и я не нашел ссылок или что-то подобное.

Я нашел этот пост, но это не реально ответить на мой вопрос легкости делать это в Web API 2.

Link headers vs link elements for RESTful JSON

ответ

12

Вы можете проверить мой post here, который показывает, как добавить нумерацию страниц, как " обычай»заголовок (X-Pagination), ниже приведен пример кода, который может помочь:

public IEnumerable<StudentBaseModel> Get(int page = 0, int pageSize = 10) 
{ 
    IQueryable<Student> query; 

    query = TheRepository.GetAllStudentsWithEnrollments().OrderBy(c => c.LastName); 

    var totalCount = query.Count(); 
    var totalPages = (int)Math.Ceiling((double)totalCount/pageSize); 

    var urlHelper = new UrlHelper(Request); 
    var prevLink = page > 0 ? urlHelper.Link("Students", new { page = page - 1, pageSize = pageSize }) : ""; 
    var nextLink = page < totalPages - 1 ? urlHelper.Link("Students", new { page = page + 1, pageSize = pageSize }) : ""; 

    var paginationHeader = new 
    { 
     TotalCount = totalCount, 
     TotalPages = totalPages, 
     PrevPageLink = prevLink, 
     NextPageLink = nextLink 
    }; 

    System.Web.HttpContext.Current.Response.Headers.Add("X-Pagination", 
    Newtonsoft.Json.JsonConvert.SerializeObject(paginationHeader)); 

    var results = query 
    .Skip(pageSize * page) 
    .Take(pageSize) 
    .ToList() 
    .Select(s => TheModelFactory.CreateSummary(s)); 

    return results; 
} 
+0

Спасибо, похоже, что я был после. Просто для моего разъяснения, однако, является X-Pagination стандартным заголовком, вы говорите пользовательский заголовок в своем ответе? Так что это не то, что достаточно распространено, чтобы иметь собственный выделенный заголовок? – GetFuzzy

+0

Нет собственного пользовательского заголовка, любой заголовок, начинающийся с X, обычно не является стандартным HTTP-заголовком. –

+1

было бы лучше использовать заголовки ссылок? http://tools.ietf.org/html/rfc5988#page-6 – user80855

0

В .Net MVC заголовкам добавления Link тривиальна. Согласно IETF они получают через запятую, так:

HttpContext.Response.Headers.Add("Link", string.Join(",", pagedResult.Links)); 

Примечание: что pagedResult в экземпляре вашего PagedResult<T> класса.

Это может использоваться в сочетании с заголовками Taisser X-Pagination выше.

Смежные вопросы