Redirecionar para ação em outro controlador

124

Eu tenho dois controladores, ambos chamados AccountController. Um deles, vamos chamá-lo Controller A, está em um Areachamado Admine o outro, vamos chamá-lo Controller B, não está em nenhum Area(acho que isso significa que está no padrão Area?). Controller Btem um action methodchamado Login. Eu tenho um action methoddentro Controller A, que tem esta linha

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

O problema é que eu recebo um 404quando esta linha é executada, porque é feita uma tentativa de redirecionar a uma inexistente actionem Controller A. Eu quero chamar o action methodno Controller B. Isso é possível?

Sachin Kainth
fonte
2
possível duplicata de MVC Redirect ao Índice de outro controlador
musefan

Respostas:

235

Você pode fornecer areao routeValuesparâmetro Tente o seguinte:

return RedirectToAction("LogIn", "Account", new { area = "Admin" });

Ou

return RedirectToAction("LogIn", "Account", new { area = "" });

dependendo da área que você deseja.

Rory McCrossan
fonte
e se eu quiser passar de uma visualização em uma determinada área para a ação de um controlador que não está em nenhuma área. Como no MVC5, o botão LogOff no canto superior direito está no AccountController, que não reside em nenhuma área. E eu quero LogOff de uma visão em uma determinada área ??
Awais Mahmood
1
Meu segundo exemplo area = "",, fará isso por você.
Rory McCrossan 26/10/2015
Isso funcionou para mim com o ASP.NET Core .... Quando atualizei para a versão mais recente, o RedirectToAction quebrou e o fiz funcionar usando a area = "" com uma string vazia.
Jonathan Alfaro
28

Usa isto:

return RedirectToAction("LogIn", "Account", new { area = "" });

Isso será redirecionado para a LogInação no Accountcontrolador na área "global".

Está usando essa RedirectToActionsobrecarga:

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

MSDN

gdoron está apoiando Monica
fonte
9

Você pode usar isto:

return RedirectToAction("actionName", "controllerName", new { area = "Admin" });
Muhammad Awais
fonte
2

Usa isto:

    return this.RedirectToAction<AccountController>(m => m.LogIn());
Hiren Patel
fonte
1
Eu gosto do conceito. Eu sempre odiei a parte da string de RedirectToAction e pensei que deveria ser mais parecida com o que você inseriu, mas isso parece irritar c #. Isso está nas estruturas mais recentes que o 4.6.2?
User3071434
@ user3071434 Não, você pode usar adicionando "using Microsoft.Web.Mvc". você pode evitar parte de cordas e reduzir para a obtenção de um erro em tempo de execução devido ao texto Ação errado
Hiren Patel
0

Tente trocá-los:

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

Eu tentei e funcionou.

Raymond Irani
fonte