Last week, a new version of the MvcPaging library has been released. This time there are some breaking changes and that’s why the major version number is increased.

What’s new:

  • Simplified API with reduced number of Html.Pager overloads;
  • DisplayTemplate option and PaginationModel;
  • Configurable number of pages.

Simplified API

There have been some requests for extra configuration options, but I didn’t want to add more overloads to the Html.Pager helper. Instead, the number of overloads is reduced drastically:

Html.Pager(int pageSize, int currentPage, int totalItemCount)


Html.Pager(int pageSize, int currentPage, int totalItemCount, AjaxOptions ajaxOptions)

We now only have a method with the required parameters and one overload for Ajax scenarios. Also, the Ajax.Pager helper is removed. Note that this is a breaking change, so if you were using the Ajax.Pager helper, you now have to use the Html.Pager with the AjaxOptions overload.

Non-required configuration options are added via the Options() method. This interface also replaces the overloads in the previous version where you could set route values or controller actions. This is the second breaking change. You can now only set these values via the Options method.

Html.Pager(pageSize, pageNumber, totalItemCount).Options(o => o
    .AddRouteValue("q", mySearchQuery)

Below are all options:

  • Action(string action)Sets an alternative action for the pager that is different from the current action.
  • AddRouteValue(string name, object value)Adds a single route value parameter that is added to page url’s.
  • RouteValues(object routeValues)Adds route value parameters that are added to the page url’s.
  • RouteValues(RouteValueDictionary routeValues)Adds route value parameters that are added to the page url’s.
  • DisplayTemplate(string displayTemplate)When set, the internal HTML rendering is bypassed and a DisplayTemplate view with the given name is rendered instead. Note that the DisplayTemplate must have a model of type PaginationModel.
  • MaxNrOfPages(int maxNrOfPages)Sets the maximum number of pages to show.

DisplayTemplate option

A few people have been asking for configurable rendering, especially since Twitter Bootstrap has become popular. Rajeesh CV submitted a pull request that introduced a view model for the Pager, the PaginationModel. This view model made it very easy to create an option where you can specify a DisplayTemplate that is used for the actual rendering. It works like any other ASP.NET MVC DisplayTemplate and requires a model of PaginationModel. As a bonus, the PaginationModel makes unit testing a lot easier.

The MvcPaging.Demo project has an example DisplayTemplate that renders Html that is compatible with Twitter Bootstrap:

Html.Pager(pageSize, pageNumber, totalItemCount).Options(o => o


Configurable number of pages

As you can see in  the screenshot above, the pager can now be configured to show more or less than 10 pages via the MaxNrOfPages() option.

I’d like to thank Rajeesh CV, jbucht01 for the contributions and ideas. For more information, visit the GitHub project page, or install the Pager in your own projects with NuGet.

MvcPaging 2.0
Tagged on:

30 thoughts on “MvcPaging 2.0

  • Pingback:Martijn Boland » Paging with ASP.NET MVC

  • April 24, 2012 at 5:08 pm

    Hello, I just started using this library….great work. Is there back button support that I am missing somewhere? If it’s not included, would this be something that could be incorporated later on? Great work.

  • April 24, 2012 at 9:03 pm

    What do you mean with back button support? Ajax scenarios?

  • May 19, 2012 at 3:15 am

    Please can you make a tuto to how to use it didn’t get the point in your old post 🙁

  • May 28, 2012 at 2:10 pm

    Hi Martin,

    I’ve been using your MVCPager for some time, great work, thanks.

    I do have a small problem which I hope you can help me with, the domain name is missing in the link within the pager whenever I don’t use the deepest url on my search controller.

    For example this page is fine

    However I have landing pages for each parameter in the above path (linked to within individual results) and hance use pages such as this

    On the latter page you’ll see that the pager links are not fully qualified and hence broken, any thoughts on how I can fix this?



  • May 28, 2012 at 3:15 pm

    I’ve fixed the above issue. I had all my url parameters using UrlParameter.Optional in my global.asax. Now using default values and the pager is working as expected.

    Hope this might help somebody else.


  • June 9, 2012 at 2:54 am

    Hi Martin,
    I am using your MVCPaging control.
    In one our page as
    @Html.Pager(Model.PageSize, Model.PageNumber, Model.TotalItemCount, new AjaxOptions { UpdateTargetId = “gridcontainer” }).Options(o => o.Action(“MyActionForAjaxPage”))
    But I face an issue like I have given the page size as 1 for testing purpose
    I get some 2 pages, When I navigate through pages, I am able to navigate.
    Then I logout the application and login is another user, who say for example has 3 pages
    when I navigat through pages it tries to show the previous user’s page, when I try to go to page 3, it show me as only 2 pages are there and that to previous users page is shown.

    I don’t have any cache mechanism in my application, Even I felt it may be due to temp data, I deleted the IE history, but even then I am gettting the same issue consistently, Can you please tell me If I am missing something,

    Even When I try to navigate to 2nd or 3rd page the breakpoint in the action method is not being hit.

    Please help me out as this is a critical issue we are facing.

  • June 9, 2012 at 4:23 pm

    Could you please try a different browser than IE? IE is known to cache AJAX results very aggresively.
    You might also try to disable caching via an attribute on the AJAX action:
    [OutputCache(NoStore = true, Duration = 0, VaryByParam = “*”)].

  • June 9, 2012 at 7:52 pm

    Thanks a lot it is working perfectly now , after giving the specified option in the Ajax action, Also in firefox even without that cache disable option it is working fine

  • July 9, 2012 at 11:26 am

    Hello there and many thanks to your MvcPaging!!

    I have a question, I’m using partiall views for my pages, so I need to add to my partial view the option “Action”. This is fine, but.. Although I see the url is http://blahblah/blah?page=something at my link hover, when I actually click the link to go to the next page, the route value “page” disappears from my link ( the results are fine )
    How do I add it back??

    Thanks in advance!

  • July 9, 2012 at 2:16 pm

    Uhm.. sorry for my question, I closed Visual Studio, I opened it again and everything worked!

  • September 12, 2012 at 7:25 am

    I have an error as below.
    Page Number cannot be below 1.
    what should i do now?

  • September 25, 2012 at 9:40 am


    Great library ! Really easy to install and make it working

    I have a question :

    I have a generated survey form with 10 Questions, I want to paginate it.
    All works but how can I assign to the Next and Previous button a submission of the form ?

    Thanks !

  • September 25, 2012 at 12:16 pm


    I don’t know if that’s easy. I’d probably try something like (javascript/jQuery):
    – intercept the pager click (link)
    – extract the page number from the pager link and put that in a hidden field in the form
    – submit the form
    – return false, so the original pager click is discarded

  • September 25, 2012 at 4:18 pm

    Thanks this is a great idea ! Will try to implement it 🙂

  • October 5, 2012 at 4:45 pm


    Your solution for the paging and submit works like a charm ! I have another issue, I tried to find a solution but I’ve not succeeded :

    I want to “customize” the paging. I explain :
    Example with a paging of 2 elements / page
    E1 – true -> Page 1
    E2 – true -> Page 1

    E3 – true -> Page 2
    E4 – false -> Page 2
    E5 – true -> Page 2

    E6 – true -> Page 3

    Each element with IsVisible = false, will be inserted to the page but will not be counted

    If you have any Idea, thank you very much again

  • October 14, 2012 at 8:45 am


    I am passing a routevaluedictionary to my Pager

    @Html.Pager(Model.Problems.PageSize, Model.Problems.PageNumber, Model.Problems.TotalItemCount).Options(o => o.RouteValues(tRVD).Action(“Search”))

    The problem is that my routevaluedictionary contains a list of (PostedSpecialties.PostedSpecialty) values (one key – multiple values)
    and Pager returns URL

    PostedSpecialties PostedSpecialty = 2,3,4

    instead of

    PostedSpecialties.PostedSpecialty=2&PostedSpecialties.PostedSpecialty=3&PostedSpecialties. PostedSpecialty=4

    Is there any way to solve this?

  • October 14, 2012 at 1:21 pm

    I don’t know if this could be solved easily. What happens if you make an ActionLink with the same routevalues dictionary?

  • October 28, 2012 at 9:42 pm

    @tryhp3: I think it will take very little to convert the bootstrap example to something that works with Zurb foundation. They’re the same, conceptually and you’ll probably only have to change some css class names in the DisplayTemplate.

  • October 29, 2012 at 11:42 pm

    I want to change the name of the parameter ‘page’. For example Controler/Action?page=1 to Controler/Action?PageNumber=1. Is it possible?

  • October 29, 2012 at 11:55 pm

    I have additional quesiton. I want use RouteValues(object routeValues) for my Filter model:
    public class ShopFilter
    public string ProductCode { get; set; }
    public int[] SelectedSuppliers { get; set; } //list of checkboxes
    but generated url is wrong:

    Is possible serialize int[] ?
    should be:
    ?ProductCode=test&SelectedSuppliers=1&SelectedSuppliers=5&page=1 etc.

  • October 30, 2012 at 2:59 pm

    Hello Martijn,

    To be able to use your MvcPaging in a base view (for example, a general index page in a rather simple crud application), it would be good to add covariance to IPagedList. Therefore, two things need to be changed:
    1. The parameter T in the interface IPagedList needs to be marked as covariant, so it will be IPagedList
    2. Because IList doesn’t support covariance either, IPagedList can’t inherit from IList anymore. I solved this by having it inherit form IEnumerable instead.

    My question to you is: do you see any problem in doing the latter?

  • November 4, 2012 at 6:18 pm

    Can I do a redirect to another controller? .Action(“action”,”controler”) ?

  • November 4, 2012 at 10:06 pm

    @pty: You can add a route value to specify a different controller:
    .Action(“action”).AddRouteValue(“controller”, “MyController”)

  • November 23, 2012 at 2:04 pm

    Thanks for great work.
    why when using Ajax and bootstrap together Ajax functionality doesn’t work?


Leave a Reply

Your email address will not be published. Required fields are marked *