2014-09-28 13 views
5

Şu anda Dinlenme hizmetimde, aşağıdaki modeli kullanarak disk belleği verilerini döndürüyorum.Web Api'ye Bağlantı Başlıkları Ekleme Sayfalandırması 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; } 
} 

Bu işlem tamamdır, ancak aşağıdaki yazıya rastladım.

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

Merakım o bağlantıları ve sayfalandırma bilgileri döndürmek için HTTP başlıklarını kullanarak bahseder, tepeli oldu. Yazının RFC 5988'den bahsedmesine rağmen, bunun gerçekten ne anlama geldiğini çözemedim. Her şey bir çeşit standart olarak kabul edildi mi?

Buradaki soru, ASP.Net Web API 2'de, bağlantı üstbilgisinde sayfalama bilgisi eklemeye yönelik herhangi bir destek var mı? HTTP yanıtı üstbilgilerini incelemek için intellisense kullandım ve Links'i veya benzer bir şeyi bulamadım.

Bu yazı bulundu, ama gerçekten kontrol edebilirsiniz Web API 2.

Link headers vs link elements for RESTful JSON

cevap

12

Bunu yapmanın kolaylığı soruma cevap vermez benim "olarak pagination nasıl ekleneceğini gösterir post here ASP.NET MVC ekleme Bağlantı başlıklarında

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

Teşekkürler, neyin peşinde olduğum gibi görünüyor. Sadece açıklamam için, X-Pagination standart bir başlık, cevabınızda özel başlık mı diyorsun? Öyleyse bu, henüz kendine ait bir başlığa sahip olacak kadar ortak bir şey değil mi? – GetFuzzy

+0

Özel üstbilgisi yok, X ile başlayan herhangi bir başlık genellikle standart HTTP başlığı değil. –

+1

Bağlantı başlıklarını kullanmak daha iyi olur mu? http://tools.ietf.org/html/rfc5988#page-6 – user80855

0

önemsiz: özel"(X-Sayfalama) başlığı altında yardımcı olabilecek örnek koddur. IETF göre bu kadar, virgülle ayrılmış olsun:

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

Not: pagedResult sizin PagedResult<T> sınıfının bir örneği olduğunu.

Bu, Taiseer'in yukarıdaki X-Pagination başlıklarıyla birlikte kullanılabilir.