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 });