Hi Brian,
I do not recall the decision behind this - the RedirectToAction<T> extensions were provided as a patch quite a long time ago and I haven't really looked at them since.
You're right about the ability to override ToString - normally, this would be handled by the RedirectToRouteResult internally but RemoveReferenceTypesFromRouteValues removes them from the dictionary before it can get this far, so it never happens. In my opinion, reference types should not be removed from the RouteValueDictionary.
RedirectToAction<T> also has a dependency on TempData which is not something that I'm happy with. I think the idea behind this is that calling RedirectToAction acts like a method call so that all the parameters that you pass to the expression are serialized to tempdata and then at the other end of the redirect they are deserialized back into action parameters. This way, you don't have to worry about how complex types are represented in the URL.
However, I do not think this is a particularly helpful abstraction - it is inconsistent with the MVC framework's built-in overloads for RedirectToAction/RedirectToRoute and is not an accurate representation of what happens during an HTTP redirect.
I propose that we introduce a new class - Redirect<T> which inherits from RedirectToRouteResult and encapsulates the expression parsing logic. This should not have a dependency on TempData, nor should it discard reference types. For backwards compatibility, I think the PassParameterDuringRedirect filter could be modified to encapsulate all of the tempdata-related tasks so anyone relying on this behaviour can still use it.
Any other thoughts would be welcome
Thanks
Jeremy