Cómo llamar a otro controlador Acción desde un controlador en Mvc

Necesito llamar una acción del controlador B FileUploadMsgView desde el Controlador A y necesito pasarle un parámetro.

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

Los controladores son solo clases: uno nuevo y llame al método de acción como lo haría con cualquier otro miembro de la clase:

var result = new ControllerB().FileUploadMsgView("some string");

Como dice @mxmissile en los comentarios a la respuesta aceptada, no debe actualizar el controlador porque faltarán las dependencias configuradas para IoC y no tendrá el HttpContext .

En su lugar, debe obtener una instancia de su controlador de esta manera:

 var controller = DependencyResolver.Current.GetService(); controller.ControllerContext = new ControllerContext(this.Request.RequestContext, controller); 

Su muestra se parece al código psuedo. Debe devolver el resultado de RedirectToAction :

 return RedirectToAction("B", "FileUploadMsgView", new { FileUploadMsg = "File uploaded successfully" }); 

como @DLeh dice Use más bien

 var controller = DependencyResolver.Current.GetService(); 

Pero, al darle al controlador, un contexto de controlador es importante especialmente cuando necesita acceder al objeto User , el objeto Server o el HttpContext dentro del controlador ‘hijo’.

He agregado una línea de código:

 controller.ControllerContext = new ControllerContext(Request.RequestContext, controller); 

o bien, podría haber utilizado System.Web para acceder también al contexto actual, para acceder al Server o a los primeros objetos mencionados

NB: estoy apuntando a la versión 4.6 del marco (Mvc5)

Deje que el resolver haga eso automáticamente.

Controlador A dentro:

 public class AController : ApiController { private readonly BController _bController; public AController( BController bController) { _bController = bController; } public httpMethod{ var result = _bController.OtherMethodBController(parameters); .... } } 

La respuesta de Dleh es correcta y explica cómo obtener una instancia de otro controlador sin perder dependencias configuradas para IoC

Sin embargo, ahora debemos llamar al método desde este otro controlador.
La respuesta completa sería:

 var controller = DependencyResolver.Current.GetService(); controller.ControllerContext = new ControllerContext(this.Request.RequestContext, controller); //Call your method ActionInvoker.InvokeAction(controller.ControllerContext, "MethodNameFromControllerB_ToCall"); 

Esto es exactamente lo que estaba buscando después de encontrar que RedirectToAction() no pasaría objetos de clase complejos.

Como ejemplo, quiero llamar al método IndexComparison en el controlador LifeCycleEffectsResults y pasarle un objeto de clase complejo llamado modelo.

Aquí está el código que falló:

 return RedirectToAction("IndexComparison", "LifeCycleEffectsResults", model); 

Vale la pena señalar que Strings, enteros, etc. sobrevivieron al viaje a este método de control, pero los objetos de la lista genérica estaban sufriendo de lo que era una reminiscencia de las fugas de la memoria C.

Como se recomendó anteriormente, aquí está el código con el que lo reemplacé:

 var controller = DependencyResolver.Current.GetService(); var result = controller.IndexComparison(model); return result; 

Todo está funcionando como está previsto ahora. Gracias por liderar el camino.

si el problema es llamar puedes llamarlo usando este método.

 yourController obj= new yourController(); obj.yourAction(); 
  public ActionResult First_controller() { return Redirect("~/File_upload/Second_controller"); } public ActionResult Second_controller() { return View(); }