Muszę wywołać akcję kontrolera B FileUploadMsgView z kontrolera A i muszę przekazać dla niej 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();
}
c#
asp.net-mvc
asp.net-mvc-4
user2156088
źródło
źródło
Odpowiedzi:
Kontrolery to po prostu klasy - nowe w górę i wywołaj metodę akcji, tak jak każdy inny członek klasy:
var result = new ControllerB().FileUploadMsgView("some string");
źródło
var controller = DependencyResolver.Current.GetService<ControllerB>();
Jak @mxmissile mówi w komentarzach do zaakceptowanej odpowiedzi, nie powinieneś aktualizować kontrolera, ponieważ będzie brakował zależności skonfigurowanych dla IoC i nie będzie miał
HttpContext
.Zamiast tego powinieneś otrzymać taką instancję kontrolera:
źródło
HttpContext
wstrzyknięci.var controller
zostanie przypisany typControllerB
, tak.HttpContext
). Wydaje mi się, że zastosowałem to podejście bez żadnego IoC, aby uzyskać „płytki” obiekt kontrolera (po prostu potrzebowałem dostępu do pewnych funkcji) i początkowo nie miałem pojęcia, dlaczego „brakuje” części. [na marginesie: obejrzałem to, wciąż stosując to podejście, ale prawdopodobnie powinienem był przekształcić tę funkcjonalność w klasę współdzieloną]. Jeśli chodzi o konfigurację IoC i wybory, musiałbym skierować cię do innych artykułów / pytań SO.Twoja próbka wygląda jak kod pseudo. Musisz zwrócić wynik
RedirectToAction
:źródło
jak mówi @DLeh Użyj raczej
Jednak przekazanie kontrolerowi kontekstu kontrolera jest ważne, zwłaszcza gdy potrzebujesz uzyskać dostęp do
User
obiektu,Server
obiektu lubHttpContext
wnętrza kontrolera „podrzędnego”.Dodałem linię kodu:
w przeciwnym razie mógłbyś użyć System.Web, aby uzyskać dostęp do bieżącego kontekstu, aby uzyskać dostęp
Server
do obiektów, które zostały wcześniej wymienioneUwaga: celuję w platformę w wersji 4.6 (Mvc5)
źródło
controller.RouteData.Values["controller"] = "Home";controller.RouteData.Values["action"] = "Index";
Zakładając, że próbujesz zwrócić wynik z akcji Index w HomeController.this
zamiastcontroller
. Ostatecznie wynik wraca przez lokalny kontroler (ten), więc to właśnie kończy się próbą znalezienia widoku.return View("ViewName");
zamiast tego użyć po prostureturn View();
Pozwól resolverowi to zrobić automatycznie.
Wewnątrz kontrolera:
źródło
Jeśli ktoś zastanawia się, jak to zrobić w .net core, udało mi się to przez dodanie kontrolera podczas uruchamiania
Następnie wstrzyknięcie go do innego kontrolera
Następnie tak to nazwij
_myControllerIwantToInject.MyMethodINeed();
źródło
To jest dokładnie to, czego szukałem po znalezieniu tego
RedirectToAction()
że nie przejdzie przez złożone obiekty klas.Na przykład chcę wywołać
IndexComparison
metodę wLifeCycleEffectsResults
kontrolerze i przekazać jej obiekt klasy złożonej o nazwie model.Oto kod, który się nie powiódł:
Warto zauważyć, że ciągi znaków, liczby całkowite itp. Przetrwały podróż do tej metody kontrolera, ale ogólne obiekty listy cierpiały z powodu czegoś, co przypominało wycieki pamięci C.
Zgodnie z powyższymi zaleceniami, oto kod, który zastąpiłem:
Teraz wszystko działa zgodnie z przeznaczeniem. Dziękuję za wytyczenie drogi.
źródło
Odpowiedź Dleha jest poprawna i wyjaśnij, 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ź brzmiałaby:
źródło
Wiem, że jest stary, ale możesz:
źródło
jeśli problemem jest zadzwonić. możesz to nazwać za pomocą tej metody.
źródło
var res = new ControllerB().SetUpTimer(new TimeSpan(23, 20, 00));