Redirect to Action in another controller
I have two controllers, both called AccountController
. One of them, lets call it Controller A
, is in an Area
called Admin
and the other, lets call it Controller B
, is not in any Area
(I guess that means it's in the default Area
?). Controller B
has an action method
called Login
. I have an action method
in Controller A
, which has this line
return RedirectToAction("LogIn", "Account");
The problem is that I get a 404
when this line gets executed because an attempt is made to redirect to a non-existent action
in Controller A
. I want to call the action method
in Controller B
. Is this possible?
Solution 1:
You can supply the area
in the routeValues
parameter. Try this:
return RedirectToAction("LogIn", "Account", new { area = "Admin" });
Or
return RedirectToAction("LogIn", "Account", new { area = "" });
depending on which area you're aiming for.
Solution 2:
Use this:
return RedirectToAction("LogIn", "Account", new { area = "" });
This will redirect to the LogIn
action in the Account
controller in the "global" area.
It's using this RedirectToAction
overload:
protected internal RedirectToRouteResult RedirectToAction(
string actionName,
string controllerName,
Object routeValues
)
MSDN
Solution 3:
You can use this:
return RedirectToAction("actionName", "controllerName", new { area = "Admin" });
Solution 4:
Use this:
return this.RedirectToAction<AccountController>(m => m.LogIn());
Solution 5:
RedirectToRoute() is also available. Also, a better way to do it might be using nameof() so you can avoid hardcoding strings in your codebase.
return RedirectToRoute(nameof(AccountController) + nameof(AccountController.Login));
And, if you are redirecting to an endpoint that takes parameters, pass those along.
return RedirectToRoute(nameof(Account) + nameof(Account.ChangePassword), new { id = id });