2014-09-28 14 views
5

Obecnie w mojej usłudze Resto zwracam dane stronicowane za pomocą poniższego modelu.Dodawanie paginacji do nagłówków linków w 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; } 
} 

To działa dobrze, ale natknąłem się na następujący post.

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

Moja ciekawość była spiczasty, wspomina przy użyciu nagłówków HTTP, aby wrócić linki i informacje paginacji. Chociaż na stanowisku wspomina się RFC 5988, nie byłem w stanie rozwikłać, co to tak naprawdę oznacza? Czy to było właściwie coś, co zostało właściwie przyjęte?

Pytanie tutaj jest w ASP.Net Web API 2, czy istnieje wsparcie dla dodawania informacji o paginacji w nagłówku łącza? Użyłem intellisense do przeglądania nagłówków odpowiedzi HTTP i nie znalazłem linków lub czegoś podobnego.

Znalazłem ten post, ale tak naprawdę nie jest odpowiedź na moje pytanie, łatwości prowadzenia tego w sieci Web API 2.

Link headers vs link elements for RESTful JSON

Odpowiedz

12

Można sprawdzić mój post here który pokazuje, jak dodać stronicowanie jako " zwyczaj”(X-Pagination) header, poniżej jest przykładowy kod, który może pomóc:

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

Dzięki temu wygląda to, czego szukałem. Tylko dla mojego wyjaśnienia, czy X-Pagination jest standardowym nagłówkiem, w swojej odpowiedzi podajesz niestandardowy nagłówek? Więc to nie jest coś, co jest dość powszechne, aby mieć własny dedykowany nagłówek? – GetFuzzy

+0

Nie ma niestandardowego nagłówka, każdy nagłówek zaczyna się od X zwykle nie jest standardowym nagłówkiem HTTP. –

+1

byłoby lepiej użyć nagłówków linków? http://tools.ietf.org/html/rfc5988#page-6 – user80855

0

W nagłówkach dodanie Łącze MVC jest trywialne. Według IETF dostają oddzielone przecinkiem, tak:

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

Uwaga: to pagedResult jest instancją klasy PagedResult<T>.

Może być używany w połączeniu z powyższymi nagłówkami Taiseera X-Pagination.