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



Мне нужно вызвать контроллер B action FileUploadMsgView из контроллера 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();
}
643   9  

9 ответов:

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

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

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

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

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

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

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

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

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

но, давая контроллер, контекст controlller важен, особенно когда вам нужно получить доступ к

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

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

public class AController : ApiController
{
    private readonly BController _bController;

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

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

}

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");

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.