If you don't want a database call for each page of data, then the best option is to return all of the data to the client, and use Javascript to page the data.
For example, you could render all of the data as one large
<table>
, and then use
DataTables[
^] to turn it into a paged list.
Trying to store all of the data in the session for each user will be significantly less efficient than loading a single page at a time from the database.