Je dois appeler une action du contrôleur B FileUploadMsgView à partir du contrôleur A et je dois lui transmettre un paramètre.
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
la source
la source
Réponses:
Les contrôleurs ne sont que des classes - un nouveau et appelez la méthode d'action comme vous le feriez pour n'importe quel autre membre de la classe:
var result = new ControllerB().FileUploadMsgView("some string");
la source
var controller = DependencyResolver.Current.GetService<ControllerB>();
Comme @mxmissile le dit dans les commentaires sur la réponse acceptée, vous ne devriez pas mettre à jour le contrôleur car il manquera les dépendances configurées pour IoC et n'aura pas l'extension
HttpContext
.Au lieu de cela, vous devriez obtenir une instance de votre contrôleur comme ceci:
la source
HttpContext
injectés.var controller
serait attribué le typeControllerB
, oui.HttpContext
). Je crois que j'ai utilisé cette approche sans aucun IoC pour obtenir un objet contrôleur "superficiel" (juste besoin d'accéder à certaines fonctionnalités) et j'étais initialement confus quant à la raison pour laquelle des pièces étaient "manquantes". [À part: j'ai contourné le problème tout en utilisant cette approche, mais j'aurais probablement dû refactoriser cette fonctionnalité dans une classe partagée.] En ce qui concerne la configuration et les choix d'IoC, je devrais vous référer à d'autres articles / questions SO.Votre exemple ressemble à du code psuedo. Vous devez renvoyer le résultat de
RedirectToAction
:la source
comme @DLeh dit Utiliser plutôt
Mais, en donnant au contrôleur, un contexte de contrôleur est important, en particulier lorsque vous devez accéder à l'
User
objet, à l'Server
objet ou à l'HttpContext
intérieur du contrôleur «enfant».J'ai ajouté une ligne de code:
ou bien vous auriez pu utiliser System.Web pour accéder également au contexte actuel, pour accéder
Server
aux objets mentionnés plus tôtNB: je cible le framework version 4.6 (Mvc5)
la source
controller.RouteData.Values["controller"] = "Home";controller.RouteData.Values["action"] = "Index";
En supposant que vous essayez de renvoyer le résultat de l'action Index dans HomeController.this
plutôt qu'àcontroller
. En fin de compte, le résultat revient via le contrôleur local (this), c'est donc ce qui finit par essayer de trouver la vue.return View("ViewName");
place simplementreturn View();
Laissez le résolveur faire cela automatiquement.
À l'intérieur d'un contrôleur:
la source
Si quelqu'un cherche comment faire cela dans .net core, je l'ai accompli en ajoutant le contrôleur au démarrage
Puis l'injecter dans l'autre contrôleur
Alors appelle ça comme ça
_myControllerIwantToInject.MyMethodINeed();
la source
C'est exactement ce que je recherchais après avoir découvert que
RedirectToAction()
les objets de classe complexes ne passeraient pas.Par exemple, je veux appeler la
IndexComparison
méthode dans leLifeCycleEffectsResults
contrôleur et lui passer un objet de classe complexe nommé model.Voici le code qui a échoué:
Il convient de noter que les chaînes, les entiers, etc. survivaient au voyage vers cette méthode de contrôleur, mais les objets de liste génériques souffraient de ce qui rappelait les fuites de mémoire C.
Comme recommandé ci-dessus, voici le code que je l'ai remplacé par:
Tout fonctionne comme prévu maintenant. Merci d'avoir montré la voie.
la source
La réponse de Dleh est correcte et explique comment obtenir une instance d'un autre contrôleur sans dépendances manquantes configurées pour IoC
Cependant, nous devons maintenant appeler la méthode depuis cet autre contrôleur.
La réponse complète serait:
la source
Je sais que c'est vieux, mais vous pouvez:
la source
si le problème est d'appeler. vous pouvez l'appeler en utilisant cette méthode.
la source
var res = new ControllerB().SetUpTimer(new TimeSpan(23, 20, 00));