RedirectToAction com parâmetro

597

Eu tenho uma ação que chamo de uma âncora assim, Site/Controller/Action/IDonde IDestá um int.

Posteriormente, preciso redirecionar para esta mesma ação de um controlador.

Existe uma maneira inteligente de fazer isso? Atualmente, estou escondendo IDtempdata, mas quando você pressiona f5 para atualizar a página novamente depois de voltar, o tempdata desaparece e a página trava.

Eric Brown - Cal
fonte

Respostas:

947

Você pode passar o ID como parte do parâmetro routeValues ​​do método RedirectToAction ().

return RedirectToAction("Action", new { id = 99 });

Isso causará um redirecionamento para Site / Controller / Action / 99. Não há necessidade de temperatura ou qualquer tipo de visualização de dados.

Kurt Schindler
fonte
2
Existe alguma maneira de fazer isso ou algo semelhante, mas também especificando o controlador? (Eu preciso fazer isso de um controlador para uma ação de outro controlador).
26611 Diego
18
@ Diego: sim, existem algumas sobrecargas para isso. No meu exemplo, seria RedirectToAction ("Action", "Controller", novo {id = 99}) msdn.microsoft.com/en-us/library/dd470154.aspx
Kurt Schindler
10
VB -Return RedirectToAction("Action", "Controller", New With {.id = 99})
Jeremy A. West
Existe uma maneira de fazer a mesma coisa, mas não ter a atualização de URL assim?
Worthy7
@KurtSchindler De qualquer forma, para atualizar sua resposta e incluir seu exemplo de comentário de um redirecionamento para outro controlador também? Para ajudar aqueles que podem pular a leitura dos comentários.
23417 Edward Edward
194

A resposta de Kurt deve estar certa, a partir de minha pesquisa, mas quando tentei, tive que fazer isso para que realmente funcionasse para mim:

return RedirectToAction( "Main", new RouteValueDictionary( 
    new { controller = controllerName, action = "Main", Id = Id } ) );

Se eu não especificasse o controlador e a ação RouteValueDictionarynão funcionasse.

Além disso, quando codificado dessa maneira, o primeiro parâmetro (Ação) parece ser ignorado. Portanto, se você apenas especificar o controlador no Dict e esperar que o primeiro parâmetro especifique a Ação, ele também não funcionará.

Se você vir mais tarde, tente primeiro a resposta de Kurt e, se ainda tiver problemas, tente esta.

Eric Brown - Cal
fonte
6
Ótima resposta. Além disso, acredito que o controllerparâmetro é opcional se a ação de redirecionamento estiver no mesmo controlador da ação da qual você está redirecionando.
im1dermike
1
deveria ser, mas quando fiz dessa maneira, não funcionou, tive que adicionar explicitamente o controlador ... isso foi literalmente nos meus primeiros dias de MVC, se eu tivesse que adivinhar agora, diria que eu teve algum tipo de problema de configuração de roteamento para analisar.
Eric Brown - Cal
Esquisito. Funciona para mim no MVC4.
im1dermike
Isso aconteceu nos dias do MVC1 e funcionou bem para outros, é por isso que suspeito de um problema de configuração, olhando para trás.
Eric Brown - Cal
@ EricBrown-Cal Dada até a sua própria submissão em seus comentários, você não acha que a resposta de Kurt é mais adequada para quem procura uma resposta para o mesmo problema que você teve nos seus primeiros dias?
Edward
62

RedirectToAction com o parâmetro:

return RedirectToAction("Action","controller", new {@id=id});
kavitha Reddy
fonte
1
Funciona? Acredito que esta sintaxe esteja incorreta. Corrija-me se eu estiver errado.
Mohammed Zameer
1
@ pb2q também new {id = id}funciona porque a estrutura sabe a qual variável você está se referindo.
Edward
61

Também é importante notar que você pode passar por mais de 1 parâmetro. id será usado para compor parte da URL e quaisquer outros serão passados ​​como parâmetros após a? no URL e será UrlEncoded como padrão.

por exemplo

return RedirectToAction("ACTION", "CONTROLLER", new {
           id = 99, otherParam = "Something", anotherParam = "OtherStuff" 
       });

Portanto, o URL seria:

    /CONTROLLER/ACTION/99?otherParam=Something&anotherParam=OtherStuff

Estes podem ser referenciados pelo seu controlador:

public ActionResult ACTION(string id, string otherParam, string anotherParam) {
   // Your code
          }
CF5
fonte
43
//How to use RedirectToAction in MVC

return RedirectToAction("actionName", "ControllerName", routevalue);

exemplo

return RedirectToAction("Index", "Home", new { id = 2});
Thivan Mydeen
fonte
39

Exemplo do MVC 4 ...

Observe que você nem sempre precisa passar o parâmetro chamado ID

var message = model.UserName + " - thanks for taking yourtime to register on our glorious site. ";
return RedirectToAction("ThankYou", "Account", new { whatever = message });

E,

public ActionResult ThankYou(string whatever) {
        ViewBag.message = whatever;
        return View();
} 

Obviamente, você pode atribuir string aos campos do modelo em vez de usar o ViewBag, se essa for sua preferência.

Rohit
fonte
21
RedirectToAction("Action", "Controller" ,new { id });

Trabalhou para mim, não precisava fazer new{id = id}

Eu estava redirecionando para dentro do mesmo controlador, então não precisava do, "Controller"mas não tenho certeza da lógica específica por trás de quando o controlador é necessário como parâmetro.

Zaeem Q
fonte
RedirectToAction("Action", "Controller", new { id = id});era exatamente o que eu precisava no meu aplicativo Core 3.1.
orangecaterpillar
18

Se alguém quiser mostrar uma mensagem de erro [httppost], poderá tentar passar um ID usando

return RedirectToAction("LogIn", "Security", new { @errorId = 1 });

para detalhes como este

 public ActionResult LogIn(int? errorId)
        {
            if (errorId > 0)
            {
                ViewBag.Error = "UserName Or Password Invalid !";
            }
            return View();
        }

[Httppost]
public ActionResult LogIn(FormCollection form)
        {
            string user= form["UserId"];
            string password = form["Password"];
            if (user == "admin" && password == "123")
            {
               return RedirectToAction("Index", "Admin");
            }
            else
            {
                return RedirectToAction("LogIn", "Security", new { @errorId = 1 });
            }
}

Espero que funcione bem.

Toriq Sagor
fonte
16

....

int parameter = Convert.ToInt32(Session["Id"].ToString());

....

return RedirectToAction("ActionName", new { Id = parameter });
aslanpayi
fonte
15

Eu também tive esse problema, e uma boa maneira de fazer isso se você estiver no mesmo controlador é usar parâmetros nomeados:

return RedirectToAction(actionName: "Action", routeValues: new { id = 99 });
Charles Philip
fonte
7

Isso pode ser anos atrás, mas de qualquer forma, isso também depende da sua rota de mapa Global.asax, pois você pode adicionar ou editar parâmetros para se adequar ao que você deseja.

por exemplo.

Global.asax

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            //new { controller = "Home", action = "Index", id = UrlParameter.Optional 
            new { controller = "Home", action = "Index", id = UrlParameter.Optional,
                  extraParam = UrlParameter.Optional // extra parameter you might need
        });
    }

os parâmetros que você precisará passar serão alterados para:

return RedirectToAction( "Main", new RouteValueDictionary( 
    new { controller = controllerName, action = "Main", Id = Id, extraParam = someVariable } ) );
Bahamut
fonte
7

Se você precisar redirecionar para uma ação fora do controlador, isso funcionará.

return RedirectToAction("ACTION", "CONTROLLER", new { id = 99 });
chr.solr
fonte
1

O seguinte foi bem-sucedido com o asp.net core 2.1. Pode ser aplicado em outro lugar. O dicionário ControllerBase.ControllerContext.RouteData.Values ​​é diretamente acessível e gravável no método de ação. Talvez este seja o destino final dos dados nas outras soluções. Também mostra de onde vêm os dados de roteamento padrão.

[Route("/to/{email?}")]
public IActionResult ToAction(string email)
{
    return View("To", email);
}
[Route("/from")]
public IActionResult FromAction()
{
    ControllerContext.RouteData.Values.Add("email", "[email protected]");
    return RedirectToAction(nameof(ToAction));
         // will redirect to /to/[email protected]
}
[Route("/FromAnother/{email?}")]`
public IActionResult FromAnotherAction(string email)
{
    return RedirectToAction(nameof(ToAction));
         // will redirect to /to/<whatever the email param says>
         // no need to specify the route part explicitly
}
mikemay
fonte