ASP.NET Core Pitfalls – Redirect to Action Keeps Route Parameters
When you redirect after a POST – following the famous Post-Redirect-Get pattern – but your previous view was constructed using a route parameter, then it will be sent to the redirect action as well.
For example, say you are responding to a request for /Filter/Smartphone, where Smartphone is a route parameter, you POST it to some controller action and at the end you redirect to the Index action using the RedirectToAction method:
return this.RedirectToAction(nameof(Index)); |
The browser will issue the GET request for Index but keeps the Smartphone route parameter, which is not good.
The solution is to pass a routeValues parameter to RedirectToAction that doesn’t contain any of the possible route parameters. One way to do it would be to create a dictionay with all action parameters nullified:
return this.RedirectToAction(nameof(Index), MethodBase.GetCurrentMethod().GetParameters().ToDictionary(x => x.Name, x => (object) null)); |
The solution to have this done automatically lies in the MethodBase.GetCurrentMethod() method. This way, you are sure to avoid any unwanted route parameters on your next request.
In case you are wondering, passing null, a dictionary without entries or object won't work, the only other way is to pass an anonymous value with the parameters explicitly set to null.