177 votes

Comment appeler l'action d'un autre contrôleur à partir d'un contrôleur en Mvc ?

J'ai besoin d'appeler l'action FileUploadMsgView du contrôleur B depuis le contrôleur A et je dois lui passer un paramètre.

Il ne va pas vers le contrôleur B FileUploadMsgView() .

Voici le code :

ContrôleurA :

private void Test()
{
    try
    {   //some codes here
        ViewBag.FileUploadMsg = "File uploaded successfully.";
        ViewBag.FileUploadFlag = "2";
        RedirectToAction("B", "FileUploadMsgView", new { FileUploadMsg = "File   uploaded successfully" });
    }
}

ContrôleurB (partie réceptrice) :

public ActionResult FileUploadMsgView(string FileUploadMsg)
{
    return View();
}

239voto

DLeh Points 838

Comme @mxmissile le dit dans les commentaires de la réponse acceptée, vous ne devriez pas mettre à jour le contrôleur parce qu'il lui manquera les dépendances configurées pour IoC et qu'il n'aura pas l'attribut HttpContext .

Au lieu de cela, vous devriez obtenir une instance de votre contrôleur comme ceci :

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

122voto

Tieson T. Points 8972

Les contrôleurs sont de simples classes : créez-en une 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");

64voto

Ed Chapel Points 5038

Votre échantillon ressemble à du code de psuedo. Vous devez retourner le résultat de RedirectToAction :

return RedirectToAction("B", 
                        "FileUploadMsgView",
                        new { FileUploadMsg = "File uploaded successfully" });

17voto

Nishanth Shaan Points 919

Comme le dit @DLeh Utilisez plutôt

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

Mais il est important de donner au contrôleur un contexte de contrôleur, en particulier lorsque vous devez accéder à l'interface de l'utilisateur. User objet, Server ou l'objet HttpContext dans le contrôleur "enfant".

J'ai ajouté une ligne de code :

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

ou bien vous auriez pu utiliser System.Web pour accéder au contexte actuel également, pour accéder à Server ou les premiers objets mentionnés

NB : Je vise la version 4.6 du framework (Mvc5).

10voto

user3199531 Points 1

Laissez le résolveur le faire automatiquement.

A l'intérieur d'un contrôleur :

public class AController : ApiController
{
    private readonly BController _bController;

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

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

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X