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.

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.


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.


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

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
          }

43
//How to use RedirectToAction in MVC

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

exemplo

return RedirectToAction("Index", "Home", new { id = 2});

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.



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.


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.


16

....

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

....

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

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

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

7

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

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

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", "mike@myemail.com");
    return RedirectToAction(nameof(ToAction));
         // will redirect to /to/mike@myemail.com
}
[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
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.