Preciso chamar uma ação do controlador B FileUploadMsgView do Controlador A e preciso passar um parâmetro para ele.
Code---its not going to the controller B's FileUploadMsgView().
In ControllerA
private void Test()
{
try
{//some codes here
ViewBag.FileUploadMsg = "File uploaded successfully.";
ViewBag.FileUploadFlag = "2";
RedirectToAction("B", "FileUploadMsgView", new { FileUploadMsg = "File uploaded successfully" });
}
In ControllerB receiving part
public ActionResult FileUploadMsgView(string FileUploadMsg)
{
return View();
}
c#
asp.net-mvc
asp.net-mvc-4
user2156088
fonte
fonte
Respostas:
Os controladores são apenas classes - são novos e chamam o método de ação como você faria com qualquer outro membro da classe:
var result = new ControllerB().FileUploadMsgView("some string");
fonte
var controller = DependencyResolver.Current.GetService<ControllerB>();
Como @mxmissile diz nos comentários para a resposta aceita, você não deve atualizar o controlador porque faltam dependências configuradas para IoC e não terão o
HttpContext
.Em vez disso, você deve obter uma instância do seu controlador como esta:
fonte
HttpContext
injetados.var controller
seria atribuído o tipoControllerB
, sim.HttpContext
). Acredito que usei essa abordagem sem qualquer IoC para obter um objeto de controlador "superficial" (apenas precisava de acesso a determinadas funcionalidades) e fiquei inicialmente confuso sobre o motivo pelo qual as peças estavam "ausentes". [aparte: eu trabalhei com isso enquanto ainda estava usando essa abordagem, mas provavelmente deveria ter refatorado essa funcionalidade para uma classe compartilhada.] Quanto à configuração e às opções de IoC, eu teria que encaminhá-lo para outros artigos / perguntas sobre SO.Sua amostra se parece com o código psuedo. Você precisa retornar o resultado de
RedirectToAction
:fonte
como @DLeh diz Use
Mas, fornecendo ao controlador, um contexto controlller é importante, especialmente quando você precisa acessar o
User
objeto,Server
objeto ou oHttpContext
interior do controlador 'filho'.Eu adicionei uma linha de código:
ou então você poderia ter usado o System.Web para acessar também o contexto atual, acessar
Server
ou os primeiros objetos mencionadosNB: estou direcionando a versão 4.6 do framework (Mvc5)
fonte
controller.RouteData.Values["controller"] = "Home";controller.RouteData.Values["action"] = "Index";
Supondo que você esteja tentando retornar o resultado da ação Índice no HomeController.this
vez decontroller
. Em última análise, o resultado volta através do controlador local (isto) e é isso que acaba tentando encontrar a visualização.return View("ViewName");
apenas #return View();
Deixe o resolvedor fazer isso automaticamente.
Um controlador interno:
fonte
Se alguém estiver olhando para como fazer isso no núcleo .net, consegui adicionando o controlador na inicialização
Em seguida, injetando-o no outro controlador
Então é só chamar assim
_myControllerIwantToInject.MyMethodINeed();
fonte
Era exatamente isso que eu procurava depois de descobrir que
RedirectToAction()
não passaria objetos de classe complexos.Como exemplo, desejo chamar o
IndexComparison
método noLifeCycleEffectsResults
controlador e transmitir a ele um objeto de classe complexo chamado model.Aqui está o código que falhou:
Vale a pena notar que Strings, números inteiros, etc. estavam sobrevivendo à viagem para esse método de controlador, mas objetos de lista genéricos estavam sofrendo com o que era remanescente dos vazamentos de memória C.
Conforme recomendado acima, aqui está o código que eu substituí por:
Tudo está funcionando como pretendido agora. Obrigado por liderar o caminho.
fonte
A resposta de Dleh está correta e explica como obter uma instância de outro controlador sem falta de dependências configuradas para IoC
No entanto, agora precisamos chamar o método desse outro controlador.
A resposta completa seria:
fonte
Eu sei que é velho, mas você pode:
fonte
se o problema for ligar. você pode chamá-lo usando esse método.
fonte
var res = new ControllerB().SetUpTimer(new TimeSpan(23, 20, 00));