Как вызвать действие контроллера из контроллера в MVC

Мне нужно позвонить в контроллер b действие FileUploadMsgView от контроллера и нужно передать параметр для него.

 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();
    }
Комментарии к вопросу (6)

Как @mxmissile говорит в комментарии принято отвечать, Вы должен'т нового контроллера, потому что он будет отсутствовать зависимостей создана для МОК и выиграл'т у свойство HttpContext.

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

var controller = DependencyResolver.Current.GetService();
controller.ControllerContext = new ControllerContext(this.Request.RequestContext, controller);
Комментарии (12)
Решение

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

ВАР результат = новый ControllerB().FileUploadMsgView (на"некоторые строки на");

Комментарии (12)

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

return RedirectToAction("B", 
                        "FileUploadMsgView",
                        new { FileUploadMsg = "File uploaded successfully" });
Комментарии (2)

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

var controller = DependencyResolver.Current.GetService();

Но, давая контроллер, контроллером контексте-это важно, особенно когда вам нужно получить доступ к пользователя объекта,сервер` объект, или свойство HttpContext внутри 'ребенок' контроллер.

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

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

или еще вы могли бы использовать систему.Веб тоже вход текущий контекст, чтобы открыть "сервер" или ранние основных объектов

NB: меня ориентируетесь в Framework версии 4.6 (Mvc5)

Комментарии (4)

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

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

public class AController : ApiController
{
    private readonly BController _bController;

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

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

}
Комментарии (1)

Если кто-то ищет способы сделать это .чистая ядра я сделал это путем добавления контроллера в автозагрузку

services.AddTransient();

Затем впрыскивая его в другой контроллер

public class controllerBeingInjectedInto : ControllerBase
{
    private readonly MyControllerIwantToInject _myControllerIwantToInject

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

Тогда просто называйте это как так _myControllerIwantToInject.MyMethodINeed();

Комментарии (0)

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

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

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

//Call your method
ActionInvoker.InvokeAction(controller.ControllerContext, "MethodNameFromControllerB_ToCall");
Комментарии (1)

Это именно то, что я искал после того, что RedirectToAction()` не прошел бы сложными объектами класса.

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

Вот код, который не удалось:<БР />

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

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

Как было рекомендовано выше, здесь'ы код Я заменил его:<БР />

var controller = DependencyResolver.Current.GetService();

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

Все работает, как задумано сейчас. Спасибо за лидером.

Комментарии (0)

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

yourController obj= new yourController();

obj.yourAction();
Комментарии (1)