As you've alluded to, it's not an ideal practice to output the PK of item table rows out to the View, as if they're in the HTML of the page, they are viewable.
If I understand correctly, by '[hiding] these ids from users' I'm guessing you mean obfuscating the IDs somehow so even if they are taken from the view's HTML, they mean little in their individual context.
One way you could achieve the above is by using a ViewModel to output your bound data to the view, but in your specific ViewModel class, you could have some custom property logic to encode the PKs with an AES (two-way) encryption algorithm, with the salt for the encryption being something only known to you (and your server).
That'd be one way of 'protecting' the PKs in the view.
With such an approach, you may have to factor in the performance overhead though of encrypting/decrypting the PKs when this data is ping ponged back and forth!
This may be of interest if you do go down the encryption route:
Simple insecure two-way "obfuscation" for C#
You could also achieve some greater opacity without encryption by having an in-memory (cache or session data) key-value lookup that outputs arbitrary numbers as IDs to the view for each of your table items and, when retrieved from the view, the PK is reverse looked up from the in-memory collection.