2014-09-28 12 views
5

Hiện tại trong dịch vụ Rest của tôi, tôi trả về dữ liệu được phân trang bằng cách sử dụng mô hình sau.Thêm số trang để liên kết tiêu đề trong 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; } 
} 

Điều này có hiệu quả nhưng tôi đã xem qua bài đăng sau.

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

sự tò mò của tôi là đỉnh, nó đề cập đến sử dụng các tiêu đề HTTP để trở lại liên kết và thông tin pagination. Mặc dù bài viết đề cập đến RFC 5988, tôi không thể làm sáng tỏ điều đó thực sự có ý nghĩa gì? Có phải mọi thứ đều được chấp nhận như một tiêu chuẩn của một loại nào đó?

Câu hỏi ở đây là trong ASP.Net Web API 2, có hỗ trợ thêm thông tin phân trang trong tiêu đề liên kết không? Tôi sử dụng intellisense để peruse tiêu đề phản ứng HTTP và tôi đã không tìm thấy liên kết, hoặc bất cứ điều gì tương tự.

tôi thấy bài này, nhưng nó không thực sự trả lời câu hỏi của tôi về một cách dễ dàng để làm điều này trong Web API 2.

Link headers vs link elements for RESTful JSON

Trả lời

12

Bạn có thể kiểm tra của tôi post here trong đó cho thấy làm thế nào để thêm pagination là " tiêu đề "(X-Pagination) tùy chỉnh, bên dưới là mã mẫu có thể trợ giúp:

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

Cảm ơn điều này trông giống như những gì tôi đã làm sau. Chỉ cần cho làm rõ của tôi mặc dù, là X-Pagination một tiêu đề tiêu chuẩn, bạn nói tiêu đề tùy chỉnh trong câu trả lời của bạn? Vì vậy, đây không phải là một cái gì đó là phổ biến, đủ để có tiêu đề chuyên dụng của riêng mình chưa? – GetFuzzy

+0

Không có tiêu đề tùy chỉnh, bất kỳ tiêu đề nào bắt đầu bằng X thường không phải là tiêu đề HTTP tiêu chuẩn. –

+1

sẽ tốt hơn nếu sử dụng tiêu đề liên kết? http://tools.ietf.org/html/rfc5988#page-6 – user80855

0

Trong .Net MVC, thêm tiêu đề Liên kết không quan trọng. Theo IETF họ nhận được phân cách bằng dấu phẩy, vì vậy:

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

Lưu ý: đó là pagedResult trong một thể hiện của lớp PagedResult<T> của bạn.

Điều này có thể được sử dụng cùng với tiêu đề X-Pagination của Taiseer ở trên.

Các vấn đề liên quan