Eu tenho uma ação que chamo de uma âncora assim, Site/Controller/Action/ID
onde ID
está um int
.
Posteriormente, preciso redirecionar para esta mesma ação de um controlador.
Existe uma maneira inteligente de fazer isso? Atualmente, estou escondendo ID
tempdata, mas quando você pressiona f5 para atualizar a página novamente depois de voltar, o tempdata desaparece e a página trava.
c#
asp.net-mvc
controller
redirecttoaction
Eric Brown - Cal
fonte
fonte
Return RedirectToAction("Action", "Controller", New With {.id = 99})
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:
Se eu não especificasse o controlador e a ação
RouteValueDictionary
nã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.
fonte
controller
parâmetro é opcional se a ação de redirecionamento estiver no mesmo controlador da ação da qual você está redirecionando.RedirectToAction
com o parâmetro:fonte
new {id = id}
funciona porque a estrutura sabe a qual variável você está se referindo.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
Portanto, o URL seria:
Estes podem ser referenciados pelo seu controlador:
fonte
exemplo
fonte
Exemplo do MVC 4 ...
Observe que você nem sempre precisa passar o parâmetro chamado ID
E,
Obviamente, você pode atribuir string aos campos do modelo em vez de usar o ViewBag, se essa for sua preferência.
fonte
Se o seu parâmetro for um objeto complexo, isso resolve o problema . A chave é o
RouteValueDictionary
construtor.Se você tem coleções, fica um pouco mais complicado, mas essa outra resposta cobre isso muito bem .
fonte
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.fonte
RedirectToAction("Action", "Controller", new { id = id});
era exatamente o que eu precisava no meu aplicativo Core 3.1.Se alguém quiser mostrar uma mensagem de erro
[httppost]
, poderá tentar passar um ID usandopara detalhes como este
Espero que funcione bem.
fonte
....
....
fonte
Eu também tive esse problema, e uma boa maneira de fazer isso se você estiver no mesmo controlador é usar parâmetros nomeados:
fonte
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
os parâmetros que você precisará passar serão alterados para:
fonte
Se você precisar redirecionar para uma ação fora do controlador, isso funcionará.
fonte
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.
fonte