Jak wywołać inną akcję kontrolera z kontrolera w Mvc

Muszę wywołać kontroler B action FileUploadMsgView z kontrolera a i przekazać do niego parametr.

 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();
    }
Author: Askolein, 2013-06-01

9 answers

Kontrolery są tylko klasami - nowe wywołują metodę akcji tak jak każdy inny członek klasy:

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

 82
Author: Tieson T.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-01 07:55:59

Jak pisze @mxmissile w komentarzach do zaakceptowanej odpowiedzi, nie powinieneś zmieniać kontrolera, ponieważ będzie brakował zależności skonfigurowanych dla IoC I nie będzie miał HttpContext.

Zamiast tego powinieneś otrzymać instancję kontrolera w następujący sposób:

var controller = DependencyResolver.Current.GetService<ControllerB>();
controller.ControllerContext = new ControllerContext(this.Request.RequestContext, controller);
 138
Author: DLeh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-27 17:13:09

Twoja próbka wygląda jak kod psuedo. Musisz zwrócić wynik RedirectToAction:

return RedirectToAction("B", 
                        "FileUploadMsgView",
                        new { FileUploadMsg = "File uploaded successfully" });
 55
Author: Ed Chapel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-28 13:07:25

Jak mówi @DLeh Użyj raczej

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

Ale, podając kontroler, kontekst kontrolera jest ważny szczególnie, gdy trzeba uzyskać dostęp do obiektu User, Server lub HttpContext wewnątrz kontrolera 'potomnego'.

Dodałem wiersz kodu:

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

Albo mogłeś użyć systemu.Web, aby uzyskać dostęp do bieżącego kontekstu, aby uzyskać dostęp do Server lub wczesnych obiektów metioned

NB: jestem targeting Framework Wersja 4.6 (Mvc5)

 13
Author: Nishanth Shaan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-04 12:55:40

Niech resolver automatycznie to zrobi.

Wewnątrz kontrolera:

public class AController : ApiController
{
    private readonly BController _bController;

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

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

}
 2
Author: David Castro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-30 23:14:47

Odpowiedź Dleh jest poprawna i wyjaśnia, jak uzyskać instancję innego kontrolera bez brakujących zależności skonfigurowanych dla IoC

Jednak teraz musimy wywołać metodę z tego innego kontrolera.
Pełna odpowiedź brzmi:

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

//Call your method
ActionInvoker.InvokeAction(controller.ControllerContext, "MethodNameFromControllerB_ToCall");
 2
Author: AlexB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-09 18:24:10

Tego właśnie szukałem po odkryciu, że RedirectToAction() nie przejdzie przez złożone obiekty klas.

Jako przykład chcę wywołać metodę IndexComparison w kontrolerze LifeCycleEffectsResults i przekazać jej złożony obiekt klasy o nazwie model.

Oto kod, który się nie powiódł:

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

Warto zauważyć, że ciągi, liczby całkowite itp. przetrwały podróż do tej metody kontrolera, ale obiekty listy generic cierpiały z powodu tego, co przypominało pamięć C przecieki.

Zgodnie z powyższymi zaleceniami, oto kod, który zamieniłem na:

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

var result = controller.IndexComparison(model);
return result;
Wszystko działa zgodnie z planem. Dziękuję za poprowadzenie.
 1
Author: cghore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-28 20:56:29

Jeśli problem polega na wywołaniu. można to nazwać za pomocą tej metody.

yourController obj= new yourController();

obj.yourAction();
 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-20 05:28:43
        public ActionResult First_controller()
        {
            return Redirect("~/File_upload/Second_controller");
        }
        public ActionResult Second_controller()
        {
            return View();
        }
 -1
Author: Pramod Variya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-20 17:34:07