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();
}
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");
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);
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" });
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)
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);
....
}
}
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");
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.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();
public ActionResult First_controller()
{
return Redirect("~/File_upload/Second_controller");
}
public ActionResult Second_controller()
{
return View();
}
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