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

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

 Code---its not going to the controller B 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();
    }

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

как говорит @DLeh Используйте скорее

var controller = DependencyResolver.Current.GetService<ControllerB>();

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

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

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

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

NB: я нацелен на фреймворк версии 4.6 (Mvc5)

Ответ 5

Позволяет распознателю автоматически делать это.

Внутри контроллера A:

public class AController : ApiController
{
    private readonly BController _bController;

    public AController(
    BController bController)
    {
        _bController = bController;
    }

    public httpMethod{
    var result =  _bController.OtherMethodBController(parameters);
    ....
    }

}

Ответ 6

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

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

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

//Call your method
ActionInvoker.InvokeAction(controller.ControllerContext, "MethodNameFromControllerB_ToCall");

Ответ 7

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

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

Вот код, который не удалось:

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

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

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

var controller = DependencyResolver.Current.GetService<LifeCycleEffectsResultsController>();

var result = controller.IndexComparison(model);
return result;

Все работает по-настоящему. Спасибо за то, что вы проложили путь.

Ответ 8

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

yourController obj= new yourController();

obj.yourAction();

Ответ 9

Если кто-то смотрит на то, как это сделать в ядре.net, я сделал это, добавив контроллер при запуске.

services.AddTransient<MyControllerIwantToInject>();

Затем вводить его в другой контроллер

public class controllerBeingInjectedInto : ControllerBase
{
    private readonly MyControllerIwantToInject _myControllerIwantToInject

     public controllerBeingInjectedInto(MyControllerIwantToInject myControllerIwantToInject)
{
       _myControllerIwantToInject = myControllerIwantToInject;
      }

Затем просто назовите его так, как _myControllerIwantToInject.MyMethodINeed();

Ответ 10

        public ActionResult First_controller()
        {
            return Redirect("~/File_upload/Second_controller");
        }
        public ActionResult Second_controller()
        {
            return View();
        }