Как вызвать другой controller Действие С controllerа в Mvc

Мне нужно вызвать controller B действия FileUploadMsgView из controllerа A и передать ему параметр.

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

Контроллеры – это только classы – новый и вызов метода действия, как и любой другой член classа:

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

Поскольку в комментариях к принятому ответу @mxmissile говорит, что вы не должны вводить новый controller, потому что он будет отсутствовать зависимостями, установленными для IoC, и не будет иметь HttpContext .

Вместо этого вы должны получить экземпляр своего controllerа следующим образом:

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

Ваш образец выглядит как psuedo-код. Вам нужно вернуть результат RedirectToAction :

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

как говорит @DLeh.

 var controller = DependencyResolver.Current.GetService(); 

Но, давая controllerу, контекст controlller важен, особенно когда вам нужно получить доступ к объекту User объекту Server или HttpContext внутри «дочернего» controllerа.

Я добавил строку кода:

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

или вы могли бы использовать System.Web для доступа к текущему контексту, чтобы получить доступ к Server или ранним связанным объектам

NB: я нацелен на версию версии 4.6 (Mvc5)

Пусть резольвер автоматически сделает это.

Внутри controllerа:

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

Ответ Dleh правилен и объясняет, как получить экземпляр другого controllerа без отсутствующих зависимостей, настроенных для IoC

Однако теперь нам нужно вызвать метод из этого другого controllerа.
Полный ответ:

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

Это именно то, что я искал после обнаружения того, что RedirectToAction() не будет передавать сложные объекты classа.

В качестве примера я хочу вызвать метод IndexComparison в controllerе LifeCycleEffectsResults и передать ему сложный объект classа с именем model.

Вот код, который не прошел:

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

Стоит отметить, что строки, целые числа и т. Д. Выжили в пути к этому методу controllerа, но общие объекты списка страдали от того, что напоминало утечки памяти C.

Как было рекомендовано выше, вот код, который я заменил на него:

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

Все работает так, как сейчас. Спасибо, что завели путь.

если проблема заключается в вызове. вы можете вызвать его с помощью этого метода.

 yourController obj= new yourController(); obj.yourAction(); 
  public ActionResult First_controller() { return Redirect("~/File_upload/Second_controller"); } public ActionResult Second_controller() { return View(); } 
Interesting Posts
Давайте будем гением компьютера.