Your object in a TempDataDictionary is read, it will be marked for deletion at the end of that request.
That means if you put something on TempData like
TempData["category"] = "your value";
first request
object value = TempData["catetory"];
second request
object value = TempData["category"];
//value = null
If you want to keep value you can use Keep method.
object value = TempData["category"];
//keep it to use later
TempData.Keep("value");
//second request, read value and mark it for deletion
object value = TempData["category"];
If you want to retain the value for another request, you can use Peek. Use Keep when retaining the value depends on additional logic.
//It will be not deleted at the end of the request
object value = TempData.Peek("category");
//second request, read value and mark it for deletion
object value = TempData["category"];