There is no single "best" - as it will depend on the structure of the application and the size of the lump of data you want to transfer. It will also depend on what you are doing with it at either end.
At the most basic level the answer is in Session state - cookies are inappropriate because (generalising) the lump of data you want to move is too big. Cache is there to avoid you having to reload things, but (again generalising) you shouldn t use it for things that you require to be there when you go back to look which leaves you with session.
Of course that assumes that you keep the datatable at all. The other way to do this is to just maintain the key value(s) that allow you to retrieve the datatable from store - so you load the table once for the first page, do stuff, persist the key value(s) navigate to the second page, reload the datatable from your storage and then do such updates as are required. This is notionally a better model (its a tradeoff between the overhead or serializing/deserializing the table to session vs pulling the data from the datastore and of course between datastore and application is an appropriate opportunity to cache data) and if you go down this route you can use either session or, if you want, a cookie which in turn frees you from dependency on session.
As I say, the simple, practical, answer is in Session - but you need to be aware of the overhead and of the other constraints this places upon you.