Redirect to Action in another controller

391.6k Views Asked by At

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?

8

There are 8 best solutions below

3
On BEST ANSWER

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.

0
On

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

0
On

This should work

return RedirectToAction("actionName", "controllerName", null);
1
On

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

protected internal RedirectToRouteResult RedirectToAction( string actionName, string controllerName, Object routeValues )

3
On

Use this:

    return this.RedirectToAction<AccountController>(m => m.LogIn());
0
On

You can use this:

return RedirectToAction("actionName", "controllerName", new { area = "Admin" });
0
On

Try switching them:

return RedirectToAction("Account", "Login");

I tried it and it worked.