Ich muss eine Controller B-Aktion FileUploadMsgView von Controller A aus aufrufen und einen Parameter dafür übergeben.
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
quelle
quelle
Antworten:
Controller sind nur Klassen - neu und rufen die Aktionsmethode wie jedes andere Klassenmitglied auf:
var result = new ControllerB().FileUploadMsgView("some string");
quelle
var controller = DependencyResolver.Current.GetService<ControllerB>();
Wie @mxmissile in den Kommentaren zur akzeptierten Antwort sagt, sollten Sie den Controller nicht neu einrichten, da ihm die für IoC eingerichteten Abhängigkeiten fehlen und die nicht vorhanden sind
HttpContext
.Stattdessen sollten Sie eine Instanz Ihres Controllers wie folgt erhalten:
quelle
HttpContext
Injektion erhalten.var controller
würde der Typ zugewiesen werdenControllerB
, ja.HttpContext
). Ich glaube, ich habe diesen Ansatz ohne IoC verwendet, um ein "flaches" Controller-Objekt zu erhalten (brauchte nur Zugriff auf bestimmte Funktionen) und war anfangs verwirrt darüber, warum Teile "fehlten". [beiseite: Ich habe es umgangen, während ich diesen Ansatz noch verwendet habe, aber wahrscheinlich hätte ich diese Funktionalität in eine gemeinsam genutzte Klasse umgestalten sollen.] Was das IoC-Setup und die Auswahl betrifft, müsste ich Sie auf andere Artikel / SO-Fragen verweisen.Ihr Beispiel sieht aus wie Pseudocode. Sie müssen zurückkehren das Ergebnis
RedirectToAction
:quelle
wie @DLeh sagt Verwenden Sie lieber
Wenn Sie dem Controller jedoch einen Controller-Kontext geben, ist dies besonders wichtig, wenn Sie auf das
User
Objekt, dasServer
Objekt oder das zugreifen müssenHttpContext
Innere des untergeordneten Controllers .Ich habe eine Codezeile hinzugefügt:
Oder Sie hätten System.Web verwenden können, um auch auf den aktuellen Kontext zuzugreifen und darauf zuzugreifen
Server
zuzugreifen, auf Objekte oder die frühen Metased-Objekte zuzugreifenNB: Ich ziele auf das Framework Version 4.6 (Mvc5)
quelle
controller.RouteData.Values["controller"] = "Home";controller.RouteData.Values["action"] = "Index";
Angenommen, Sie versuchen, das Ergebnis der Indexaktion in HomeController zurückzugeben.this
eher anwenden als aufcontroller
. Letztendlich kommt das Ergebnis über den lokalen Controller (dies) zurück, sodass am Ende versucht wird, die Ansicht zu finden.return View("ViewName");
stattdessen nurreturn View();
Lassen Sie den Resolver das automatisch tun.
Innerhalb eines Controllers:
quelle
Wenn jemand darüber nachdenkt, wie dies im .net-Kern gemacht wird, habe ich dies erreicht, indem ich den Controller beim Start hinzugefügt habe
Dann Injizieren in den anderen Controller
Dann nenne es einfach so
_myControllerIwantToInject.MyMethodINeed();
quelle
Genau das habe ich gesucht, nachdem ich das gefunden hatte
RedirectToAction()
komplexe Klassenobjekte nicht übergeben werden.Als Beispiel möchte ich die
IndexComparison
Methode in der aufrufenLifeCycleEffectsResults
Steuerung und ihr ein komplexes Klassenobjekt mit dem Namen model übergeben.Hier ist der Code, der fehlgeschlagen ist:
Bemerkenswert ist, dass Strings, Ganzzahlen usw. die Reise zu dieser Controller-Methode überlebten, aber generische Listenobjekte unter dem litten, was an C-Speicherlecks erinnerte.
Wie oben empfohlen, ist hier der Code, durch den ich ihn ersetzt habe:
Alles funktioniert jetzt wie vorgesehen. Vielen Dank, dass Sie den Weg weisen.
quelle
Dlehs Antwort ist richtig und erklärt, wie eine Instanz eines anderen Controllers abgerufen werden kann, ohne dass für IoC eingerichtete Abhängigkeiten fehlen
Jetzt müssen wir die Methode jedoch von diesem anderen Controller aus aufrufen.
Die vollständige Antwort wäre:
quelle
Ich weiß, dass es alt ist, aber Sie können:
quelle
wenn das Problem ist anzurufen. Sie können es mit dieser Methode aufrufen.
quelle
var res = new ControllerB().SetUpTimer(new TimeSpan(23, 20, 00));