How to Implement Pagination in ASP.NET Core WebAPI? – Ultimate Guide
In this guide, we will learn how to implement Advanced Pagination in ASP.NET Core WebApi with ease. Pagination is one of the most important concepts while building RESTful APIs. You would have seen several public APIs implementing this feature for better user experience and security. We will go in detail and try to build an ASP.NET Core 3.1 WebApi that implements advanced pagination.
The source code for this tutorial is on my Github repo.
What we will be Building
Before getting started let’s analyze what we are going to build. This helps you understand our potential requirements and the scope of this Article before hand.

As you can see, It’s a simple API endpoint that just returns a list of all Customers. But we have made it much cooler and more usable in practical cases by adding a pagination layer to the data. We will add the current page number, page size, the link to the first, last, next, and the previous pages to our API response.
We would be requesting https://localhost:44312/api/customer?pageNumber=3&pageSize=10 and get a paged response with 10 customer details on page 3. This is what you will be learning in the article.
Seems Cool? Let’s start.
What is Paging / Pagination? Why is it Important?
Imagine you have an endpoint in your API that could potentially return millions of records with a single request. Let’s say there are 100s of users that are going to exploit this endpoint by requesting all the data in a single go at the same time. This would nearly kill your server and lead to several issues including security.
An ideal API endpoint would allow it’s consumers to get only a specific number of records in one go. In this way, we are not giving load to our Database Server, the CPU on which the API is hosted, or the network bandwidth. This is a highly crucial feature for any API. especially the public APIs.
Paging or Pagination in a method in which you get paged response. This means that you request with a page number and page size, and the ASP.NET Core WebApi returns exactly what you asked for, nothing more.
By implementing Pagination in your APIs, your Front end Developers would have a really comfortable time in building UIs that do not lag. Such APIs are good for integration by other consumers (MVC, React.js Applications) as the data already comes paginated.
Setting up the ASP.NET Core 3.1 WebAPI Project
For this tutorial, we will work on an ASP.NET Core 3.1 WebAPI along with Entity Framework Core that includes a Customer Controller which returns all the data and data by customer id.
I will skip forward and reach the part where I have a controller that is able to return all the customers (../api/customer/) and also return a customer by id(../api/customer/{id}).
I will be using Visual Studio 2019 Comunity as my IDE. For data access, I am going with Entity Framework Core – Code First Approach using SQL Server Local Db. You can read about implementing EF Core on your APIs here.
Here is my Customer model at Models/Customer.
public class Customer { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string Contact { get; set; } public string Email { get; set; } }
After doing all the required migrations and updating my database, I am still missing out on a crucial part. The Customer data 😀 I usually use generatedata.com to generate sample data for quick demonstrations. It generates SQL insert snippets / Xls / CSV formatted data collection. Here is how to use this handy utility.

After inserting the data into the customer’s table, let’s run the application. I will be using Chrome Browser to test the data, as it is quite enough for our scenario.

Let’s make this out much more pretty by installing a chrome extension, JSON Formatter. What this extension does is simple. It makes your JSON outputs neat and readable. Get the extension here.

You can see that we are getting all the data from this endpoint. This is exactly what we spoke about earlier. We will transform this endpoint into a paginated one. Let’s begin.
Getting Started with Pagination in ASP.NET Core WebApi
Wrappers for API Endpoints
It’s always a good practice to add wrappers to your API response. What is a wrapper? Instead of just returning the data in the response, you have a possibility to return other parameters like error messages, response status, page number, data, page size, and so on. You get the point. So, instead of just returning List<Customer>, we will return Response<List<Customer>>. This would give us more flexibility and data to work with, Right?
Create a new class, Wrappers/Response.cs
public class Response<T> { public Response() { } public Response(T data) { Succeeded = true; Message = string.Empty; Errors = null; Data = data; } public T Data { get; set; } public bool Succeeded { get; set; } public string[] Errors { get; set; } public string Message { get; set; } }
This is a pretty straight forward wrapper class. It can show you the status, the messages or error if any, and the data itself (T). This is how you would ideally want to expose your API endpoints. Let’s modify our CustomerController/GetById method.
[HttpGet("{id}")] public async Task<IActionResult> GetById(int id) { var customer = await context.Customers.Where(a => a.Id == id).FirstOrDefaultAsync(); return Ok(new Response<Customer>(customer)); }
Line 4 gets the customer record from our DB for a particular ID.
Line 5 Returns a new wrapper class with customer data.

You can see how useful this kind of approach is. Response.cs will be our base class. Now, from our API, we have 2 possibilities of responses, paged data (List of Customers) or a single record with no paged data (Customer by Id).
We will extend the base class by adding pagination properties. Create another class, Wrappers/PagedResponse.cs
public class PagedResponse<T> : Response<T> { public int PageNumber { get; set; } public int PageSize { get; set; } public Uri FirstPage { get; set; } public Uri LastPage { get; set; } public int TotalPages { get; set; } public int TotalRecords { get; set; } public Uri NextPage { get; set; } public Uri PreviousPage { get; set; } public PagedResponse(T data, int pageNumber, int pageSize) { this.PageNumber = pageNumber; this.PageSize = pageSize; this.Data = data; this.Message = null; this.Succeeded = true; this.Errors = null; } }
That’s quite a lot of properties to work with. We have page size, number, Uris of the first page, last page, total page count, and much more. Let’s start working on our Customer Controller.
Customer Controller – GetAll
[HttpGet] public async Task<IActionResult> GetAll() { var response = await context.Customer.ToListAsync(); return Ok(response); }
This is what our CustomerController looked like. We will be modifying this method to accommodate pagination. For starters, we would ideally need the required page parameters on the query string of the request, so that request would like https://localhost:44312/api/customer?pageNumber=3&pageSize=10. We will call this model as PaginationFilter.
Pagination Filter
Create a new class , Filter/PaginationFilter.cs
public class PaginationFilter { public int PageNumber { get; set; } public int PageSize { get; set; } public PaginationFilter() { this.PageNumber = 1; this.PageSize = 10; } public PaginationFilter(int pageNumber, int pageSize) { this.PageNumber = pageNumber < 1 ? 1 : pageNumber; this.PageSize = pageSize > 10 ? 10 : pageSize; } }
Line 12 states that the minimum page number is always set to 1.
Line 13 – For this demonstration, we will set our filter such that the maximum page size a user can request for is 10. If he/she requests a page size of 1000, it would default back to 10.
Let’s add this filter to our controller method.
[HttpGet] public async Task<IActionResult> GetAll([FromQuery] PaginationFilter filter) { var validFilter = new PaginationFilter(filter.PageNumber, filter.PageSize); var response = await context.Customer.ToListAsync(); return Ok(response); }
Line 2 – Read the Query string on the request for page filter properties.
Line 3 – Validates the filter to a valid filter object (defaulting back to the allowed values). Ps, you would probably want to use a mapper here. But this current approach is fine for our guide.
Paging with Entity Framework Core
This is the core function of the entire implementation, the actual paging. It’s pretty easy with EFCore. Instead of querying the entire list of data from the source. EFCore makes it dead easy to query just a particular set of records, ideal for paging. Here is how you would achieve it.
var pagedData = await context.Customers .Skip((validFilter.PageNumber - 1) * validFilter.PageSize) .Take(validFilter.PageSize) .ToListAsync();
Line 1 accesses the Customer Table.
Line 2 Skips a certain set of records, by the page number * page size.
Line 3 Takes only the required amount of data, set by page size.
Modify the controller as below.
[HttpGet] public async Task<IActionResult> GetAll([FromQuery] PaginationFilter filter) { var validFilter = new PaginationFilter(filter.PageNumber, filter.PageSize); var pagedData = await context.Customers .Skip((validFilter.PageNumber - 1) * validFilter.PageSize) .Take(validFilter.PageSize) .ToListAsync(); var totalRecords = await context.Customers.CountAsync(); return Ok(new PagedResponse<List<Customer>>(pagedData, validFilter.PageNumber, validFilter.PageSize)); }
Line 9 – We will be counting the total records for further use.
Line 10 – Wraps the paged data in our PagedResponse Wrapper.

That’s great! We have already implemented basic paging in our ASP.NET Core API. Let’s try to request with a page size larger than 10.

It gets defaulted to 10 😀 Now, let’s start adding some advanced features like URL of the next page and so on.
Generating Pagination URLs
What are Pagination URLs ?
Pagination URLs help the consumer to navigate through the available API Endpoint data with so much ease. Links of the First Page, Last Page, Next page and Previous page are usually the Pagination URLs. Here is a sample response.
"firstPage": "https://localhost:44312/api/customer?pageNumber=1&pageSize=10", "lastPage": "https://localhost:44312/api/customer?pageNumber=10&pageSize=10", "nextPage": "https://localhost:44312/api/customer?pageNumber=3&pageSize=10", "previousPage": "https://localhost:44312/api/customer?pageNumber=1&pageSize=10",
To implement this in our project, we will need a service that has a single responsibility, to build URLs based on the pagination filter passed. Let’s call it UriService.
Create a new Interface, Services/IUriService.cs
public interface IUriService { public Uri GetPageUri(PaginationFilter filter, string route); }
In this interface, we have a function definition that takes in the pagination Filter and a route string (api/customer). PS, we will have to dynamically build this route string, as we are building it in a way that it can be used by any controller (Product, Invoice, Suppliers, etc etc) and on any host (localhost, api.com, etc). Clean and Efficient Coding is what you have to concentrate on! 😀
Add a concrete class, Services/UriServics.cs to implement the above interface.
public class UriService : IUriService { private readonly string _baseUri; public UriService(string baseUri) { _baseUri = baseUri; } public Uri GetPageUri(PaginationFilter filter, string route) { var _enpointUri = new Uri(string.Concat(_baseUri, route)); var modifiedUri = QueryHelpers.AddQueryString(_enpointUri.ToString(), "pageNumber", filter.PageNumber.ToString()); modifiedUri = QueryHelpers.AddQueryString(modifiedUri, "pageSize", filter.PageSize.ToString()); return new Uri(modifiedUri); } }
Line 3 – We will be getting the base URL (localhost , api.com , etc) in this string via Dependency Injection from the startup class. I will show it later in this article.
Line 10 – Makes a new Uri from base uri and route string. ( api.com + /api/customer = api.com/api/customer )
Line 11 – Using the QueryHelpers class (built-in), we add a new query string, “pageNumber” to our Uri. (api.com/api/customer?pageNumber={i})
Line 12 – Similarly, we add another query string, “pageSize”.
Configuring the Service to get the Base URL
public void ConfigureServices(IServiceCollection services) { services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer( Configuration.GetConnectionString("DefaultConnection"), b => b.MigrationsAssembly(typeof(ApplicationDbContext).Assembly.FullName))); services.AddHttpContextAccessor(); services.AddSingleton<IUriService>(o => { var accessor = o.GetRequiredService<IHttpContextAccessor>(); var request = accessor.HttpContext.Request; var uri = string.Concat(request.Scheme, "://", request.Host.ToUriComponent()); return new UriService(uri); }); services.AddControllers(); }
Here we get the base URL of the application (http(s)://www.api.com) from the HTTP Request and Context.
Now that our Service class is done, Let’s use this in a helper class to generate required endpoint links.
Pagination Helper
Given the fact that our Controller code is quite increasing by time, Let’s add a new Pagination Helper class so that we can segregate the code much better.
Add a new class, Helpers/PaginationHelper.cs. In this class, we will have a static function that will take in parameters and return a new PagedResponse<List<T>> where T can be any class. Code Reusability, Remember?
public static PagedResponse<List<T>> CreatePagedReponse<T>(List<T> pagedData, PaginationFilter validFilter, int totalRecords, IUriService uriService, string route) { var respose = new PagedResponse<List<T>>(pagedData, validFilter.PageNumber, validFilter.PageSize); var totalPages = ((double)totalRecords / (double)validFilter.PageSize); int roundedTotalPages = Convert.ToInt32(Math.Ceiling(totalPages)); respose.NextPage = validFilter.PageNumber >= 1 && validFilter.PageNumber < roundedTotalPages ? uriService.GetPageUri(new PaginationFilter(validFilter.PageNumber + 1, validFilter.PageSize), route) : null; respose.PreviousPage = validFilter.PageNumber - 1 >= 1 && validFilter.PageNumber <= roundedTotalPages ? uriService.GetPageUri(new PaginationFilter(validFilter.PageNumber - 1, validFilter.PageSize), route) : null; respose.FirstPage = uriService.GetPageUri(new PaginationFilter(1, validFilter.PageSize), route); respose.LastPage = uriService.GetPageUri(new PaginationFilter(roundedTotalPages, validFilter.PageSize), route); respose.TotalPages = roundedTotalPages; respose.TotalRecords = totalRecords; return respose; }
Line 3 – takes in the paged data from EFCore, filter, total record count, URI service object, and route string of the controller. (/api/customer/)
Line 5 – Initializes the Response Object with required params.
Line 6-7 Some basic math functions to calculate the total pages. (total records / pageSize)
Line 8 – We have to generate the next page URL only if a next page exists right? We check if the requested page number is less than the total pages and generate the URI for the next page. if the requested page number is equal to or greater than the total number of available pages, we simply return null.
Line 12 – Similarly, we generate the URL for the previous page.
Line 16-17 – We generate URLs for the First and Last page by using our URIService.
Line 18-19 – Setting the total page and total records to the response object.
Line 20 – Returns the response object.
Now let’s make the last couple of changes to our Controller. We will initially have to inject the IUriService to the constructor of CustomerController.
private readonly ApplicationDbContext context; private readonly IUriService uriService; public CustomerController(ApplicationDbContext context, IUriService uriService) { this.context = context; this.uriService = uriService; } [HttpGet] public async Task<IActionResult> GetAll([FromQuery] PaginationFilter filter) { var route = Request.Path.Value; var validFilter = new PaginationFilter(filter.PageNumber, filter.PageSize); var pagedData = await context.Customers .Skip((validFilter.PageNumber - 1) * validFilter.PageSize) .Take(validFilter.PageSize) .ToListAsync(); var totalRecords = await context.Customers.CountAsync(); var pagedReponse = PaginationHelper.CreatePagedReponse<Customer>(pagedData, validFilter, totalRecords, uriService, route); return Ok(pagedReponse); }
Line 6 – Injecting the IUriService object to the constructor.
Line 11 – I have mentioned that we need to get the route of the current controller action method (api/customer). Request.Path.Value does it for you. It is this string that we are going to pass to our helper class method. I guess there can be better ways to generate the route of the current request. Let me know about it in the comments section.
Line 18 – Calls the Helper class with required params.
Line 19 – Returns the Paginated Response.
That’s it with the development! 😀 Let’s build our application and run it.

We have requested the first page, ie page number = 1, i.e the Previous page URL is null, as we expected. Let’s go to the last page of this endpoint and check. With the JSONFormatter extension for chrome, it’s easy to navigate through this data. Just click on the Pagination URL and it works!

There you go! You can see that the next page is null because we are on the last page. We have built quite an awesome feature into our ASP.NET Core 3.1 API, haven’t we? You should probably implement Pagination in literally all the APIs you are going to work with.
Summary
In this highly detailed guide, we learned how to implement Pagination in ASP.NET Core WebApi. Right from the basics of Pagination like the page number and page size, to the Advanced concepts like Pagination URLs, we have covered everything. You can find the source code of this entire demonstration over at my Github. Do follow me over there as well! I hope you all enjoyed this article 😀
Do you have any other queries / suggestions for me? Feel free to leave them below in the comments section. Happy Coding ?
Hi Mukesh,
I like your idea I use similar approach for pagination. But I don’t think API should be responsible for link generation. Too many details comes from API that can be easily calculated on the front-end. Beside modern pagination components are doing this out of the box.
Hi Alexander, Thanks for your feedback. However, when it comes to APIs that are going to be consumed by various clients (MVC, React.js, etc), instead of having the same logic written on different tech stacks, I believe it would be a better practice to have the central API generate it for you.
Yes, I know that this is quite a lot of data that the API is generating. But this article was for demonstration purposes only. Ultimately it depends on your project requirements. Meanwhile, I have worked with quite a lot of public APIs that return the Links as well, which I found to be very convenient. The one issue with having the front end do the pagination link is, it would still be possible to exploit the data limit factor. It gets perfectly secured in this approach. What do you think about it?
If pagination component allows user to change page size or select page other than next/previous front end must calculate links.
PageNumber, pageSize and totalRecords are my set
Great instructional article! Very clear and explanations are easy to comprehend! Thank you
Nice article. However, you should consider the case where the APIs are behind an API gateway. In this case, the base URI shouldn’t be ever the base URI of the API itself (the base URI is behind the gateway and therefore unknown or hidden to the API’s clients).
Agree with you, maybe can just remove/separate the base URI from the result. Anyway, thanks for the great article.
This is really helpful. Thanks a lot for the beautiful post
Thanks for the feedback 🙂
This is an excellent article.
Thank you very much for your sharing and efforts.
Best Regards.
Thanks for your continuous support and feedback Tarik.
Regards 🙂
Dear Mukesh,
I am sorry for disturbing you but I am new to web technology and API’s since all my experience on desktop applications.
i am trying to call the API from Blazor Server service to get all rows with this excellent Technic as :
async Task IOwnerService.GetCityForTest(string uri)
{
try
{
IEnumerable Founded;
Founded = await _httpClient.GetFromJsonAsync<IEnumerable>(“Products?pagenumber=1&pagesize=10″);
return Founded;
}
catch (Exception ex)
{
errorString = $”There was an error: {ex.Message}”;
}
return null;
}
but when the data returns from the api controller – which working good – i got the following error :
“The JSON value could not be converted to System.Collections.Generic.IEnumerable`1[System.Object]. Path: $ | LineNumber: 0 | BytePositionInLine: 1.”
Could you please help me to solve this, your help will be highly appreciated.
Thank you so much for your effort.
Best Regards.
Hi.
At the part where you are calling the httpClient, shouldn’t it be IEnumerable of Product instead of just IEnumumerable? Because I guess you need to specify the type of List of object for the JSON to parse through it.
Also you defined your function as a TASK, but i guess it should be something like Task of Product or at least Task of IActionResult, as you are returning something (either a list or null)
Just check these 2 points maybe.
PS, I am not able to use ‘ / <> / ‘ for security reasons, So i used things like ‘Task of ‘ and so on.. you get the point
Thanks
Sorry Mukesh, but i did not succeed to read the data from the controller.
If you could please give me an example to follow of how to call this controller from Blazor server service :
public async Task GetAll([FromQuery] PaginationFilter filter)
{
var route = Request.Path.Value;
var validFilter = new PaginationFilter(filter.PageNumber, filter.PageSize);
var pagedData = await _context.PmsCities
.Skip((validFilter.PageNumber – 1) * validFilter.PageSize)
.Take(validFilter.PageSize)
.ToListAsync();
var totalRecords = await _context.PmsCities.CountAsync();
var pagedReponse = PaginationHelper.CreatePagedReponse(pagedData, validFilter, totalRecords, uriService, route);
return Ok(pagedReponse);
}
and receive the pagedRespnse result from it using httpclient, i will be very thankful.
Thank you very much indeed.
Best Regards
Please check this – https://codewithmukesh.com/blog/blazor-crud-with-entity-framework-core/. I had used something like ‘ developers = await client.GetFromJsonAsync(“api/developer”);’. Check the FetchData Component Section
Dear Mukesh,
First of all i apologize for bothering you.
I am following the example of this article (with many thanks to you) step by step and every thing works fine when i run it form the postman or call the API direct form the browser.
but my problem is when i call this API action :
public async Task GetAll([FromQuery] PaginationFilter filter)
{
var route = Request.Path.Value;
var validFilter = new PaginationFilter(filter.PageNumber, filter.PageSize);
var pagedData = await _context.PmsCities
.Skip((validFilter.PageNumber – 1) * validFilter.PageSize)
.Take(validFilter.PageSize)
.ToListAsync();
var totalRecords = await _context.PmsCities.CountAsync();
var pagedReponse = PaginationHelper.CreatePagedReponse(pagedData, validFilter, totalRecords, uriService, route);
return Ok(pagedReponse);
}
the only deference that i am using PmsCity model instead of the customer model you are using.
I also followed the article you referred me to and use the same Technic as the following
1- PmsCity[] developers { get; set; }
2- in OnInitializedAsync() i used
developers = await client.GetFromJsonAsync(“http://localhost:5000/API/cities?pagenumber=1&pagesize=10”);
Put unfortunately it gives me the following error at run time :
“The JSON value could not be converted to DataTowerPMS.Entities.Models.StModels.PmsCity[]. Path: $ | LineNumber: 0 | BytePositionInLine: 1.”
I think i am missing something in calling function.
I also tried the following syntax :
var response1 = await _httpClient.GetAsync(“Cities?pagenumber=1&pagesize=10”);
var content1 = await response1.Content.ReadAsStringAsync();
var ct1 = (IEnumerable)JsonConvert.DeserializeObject<Response<IEnumerable>>(content1);
the response1 work good but when i Deserialized it it gives me null Data.
I know i am asking to much, but i am really stuck on this and can not go father in my project due to this problem.
Thank you so much for your patient, and your help will be highly appreciated.
Best Regards.
After the var response1 declaration line, add this line.
var responseType = response1.GetType();
Now you know what type of response you received.
During de-serializing you must provide the same exact type.
It would go something like JsonConvert.DeserializeObject(Response(Enumerable(T)))() , where T is your model. Ps, Replace () with < Also refer, https://stackoverflow.com/questions/28012335/json-net-deserializeobject-to-list-of-objects
I really don’t know how to thank you.
finally it works for me.
So many thanks for your help.
I wish you the best, with best regards.
Great! I am glad that I could help.
Share this blog within your community as a help maybe 😉
Thanks and Regards
Your code is very clean and elegant, thanks a lot …. would you please make another article explaining the sorting and searching using a generic way like you did with pagination.
Thank you so much for this excellent tutorial.
Thank you very much! You really helped me 😀
Hi I like your detailed style. I have manged to get it to work with Comos Db SQL-API and the CosmosClient API, although it would be nice to have all the goodness from the EF core API.
Do you have a suggestion about how implement pagination using the ContinuationToken from the CosmosClient API ?
I was thinking that in order to have the previousPage-option , I’d have to somehow keep track of all the pages a client has visited for it to work correct.
Hi I am having trouble with Generating Pagination URLs section of your tutorial when I add the code (public void ConfigureServices(IServiceCollection services) to Startup.cs) I am getting
Error CS1061 ‘IServiceCollection’ does not contain a definition for ‘AddDbContext’ and no accessible extension method ‘AddDbContext’ accepting a first argument of type ‘IServiceCollection’ could be found (are you missing a using directive or an assembly reference?) mAPI Startup.cs 41
Also in I am getting the following error for public interface IUriService
Severity Code Description Project File Line Suppression State
Error CS8703 The modifier ‘public’ is not valid for this item in C# 7.3. Please use language version ‘8.0’ or greater. mAPI F:\SFA Others\source\repos\API\mAPI 26_10_2020\mAPI\Services\Class1.cs 10 Active
Can you please help?
Hello Mukesh,
I was following your amazing tutorial Advanced Pagination in ASP.NET Core WebApi but I got stuck in Generating Pagination URLs.
When I try to add your code as a interface I get the following error.
Severity Code Description Project File Line Suppression State
Error CS8703 The modifier ‘public’ is not valid for this item in C# 7.3. Please use language version ‘8.0’ or greater. mAPI F:\SFA Others\source\repos\API\mAPI 26_10_2020\mAPI\Services\Class1.cs 10 Active
Which I tried updating my .net api to 8.0 I couldn’t find the LangVersion tag in my solution file.
Also when I tried adding your code (public void ConfigureServices(IServiceCollection services)) from Configuring the Service to get the Base URL. I get the following errors
Severity Code Description Project File Line Suppression State
Error CS0246 The type or namespace name ‘PaginationFilter’ could not be found (are you missing a using directive or an assembly reference?) mAPI F:\SFA Others\source\repos\API\mAPI 26_10_2020\mAPI\Services\Class1.cs 10 Active
Error CS1061 ‘IServiceCollection’ does not contain a definition for ‘AddDbContext’ and no accessible extension method ‘AddDbContext’ accepting a first argument of type ‘IServiceCollection’ could be found (are you missing a using directive or an assembly reference?) mAPI F:\SFA Others\source\repos\API\mAPI 26_10_2020\mAPI\Startup.cs 41 Active
Error CS0246 The type or namespace name ‘IHttpContextAccessor’ could not be found (are you missing a using directive or an assembly reference?) mAPI F:\SFA Others\source\repos\API\mAPI 26_10_2020\mAPI\Startup.cs 48 Active
Error CS0246 The type or namespace name ‘UriService’ could not be found (are you missing a using directive or an assembly reference?) mAPI F:\SFA Others\source\repos\API\mAPI 26_10_2020\mAPI\Startup.cs 51 Active
Error CS1061 ‘IServiceCollection’ does not contain a definition for ‘AddControllers’ and no accessible extension method ‘AddControllers’ accepting a first argument of type ‘IServiceCollection’ could be found (are you missing a using directive or an assembly reference?) mAPI F:\SFA Others\source\repos\API\mAPI 26_10_2020\mAPI\Startup.cs 53 Active
I am new to web API coding and this is really defeating me
Beautiful! Just Beautiful! Thanks alot mate! <3
Nice Article,
I am using Dapper and Stored Procedures in my api, can you please help me to implement this functionality in this situation?
Thank You . Great Article. Can you please explain to me how to use this API with JQuery Data Table and server side processing ?
Hi, Thanks. I have an article specific to Jquery Datatable Server Side. You can check it. https://codewithmukesh.com/blog/jquery-datatable-in-aspnet-core/
As for using the API, you can use the IHTTPFactory and some adjustments in how the datatable gets paginated. Regards.
This is really helpful. Thanks a lot for the beautiful post, I love it.
This is an excellent article.
Thank you very much for your sharing and efforts.
Best Regards.
thank you for the great article, really helpful 🙂
Hi Mukesh,
Awesome work, I easily implemented on my .net 5 web api project and works fantastic.
Thank you very much for this awesome work, I like it because I can listen to music while learning.
Awesome! Glad that I could help.
Regards
you just made my day 🙂 keep posting awesome articles like this.
The rounded Total pages will always be 1 cause the pageSize and the total records
are always equal
Hi Mukesh,
Thank you for the great article. I know this is an older article at this point but do you have a technique for implementing this in Onion Architecture? In my attempt I have an interface for Wrapper/IResponse in my application layer, which takes a type parameter TEntity. The implementation is in my infrastructure layer. The problem comes up when trying to deserialize (my infrastructure is an external REST API) — you cannot deserialize to an interface, but I also cannot implement my repository interface using the implementation of IResponse, because the repository interface is also part of my app layer, and thus has no access to the infrastructure implementation of Response.
How would you approach?
Thanks for the nice article. I found one issue in page: https://github.com/iammukeshm/Pagination.WebApi/blob/master/Pagination.WebApi/Helpers/PaginationHelper.cs
The below code will show the firstPage always as 1. That should not be the case when I request for second or other page. So instead of hard coding as 1, we can set it as validFilter.PageNumber.
respose.FirstPage = uriService.GetPageUri(new PaginationFilter(1, validFilter.PageSize), route);
Thank you for this article, I like the way you present and deliver the information. Straightforward and easy to follow.
Hi. Some good ideas here. A few small bits of feedback.
1. You should perhaps look to see if there is an x-forwarded-for header incase you are behind a load balancer.
2. You really should not use offset paging. Rather use keyset pagination.
Thanks for the Great Article and the very useful comments
Awesome article! Well explained! I have implemented and tested this with a new .Net Core 6 API.
Great Article , Thanks Mukesh!
Hi Mukesh,
thank you for your post. It was beautiful to see that you are concerned about reusability and clean code. I learned very useful tips.
One question though: in section “Pagination Filter” what do you mean by “Ps, you would probably want to use a mapper here. But this current approach is fine for our guide.”?
Do you mean using a tool like AutoMapper? I am using it to map application DTO’s and domain models but I don’t see why we would need it here just to get the query string parameters. AFAIK, ASP.NET Core performs automatic model binding for [FromQuery] (and [FromBody] and others). So in this case we can use the parameter paginationFilter straightforward. No need to map it to anything. Or yes? That’s my question.
Muito bom. Obrigado!
This is very helpful tutorial, can you please create one more step for this tutorial that, how can use the api in separate mvc project with datatable? Thanks in advance.