2009-03-03 9 views
1

Ce que je suis en train de réaliser:Appeler une autre action du contrôleur après l'action du régulateur de courant a terminé son exécution

  1. Après chaque vue a terminé son exécution, je voudrais faire un appel http séparé à un partenaire externe .

  2. Je dois passer un contenu de la vue en tant que corps de cet appel http.

Ce que j'ai jusqu'à présent:

J'ai un contrôleur de base à partir de laquelle tous mes contrôleurs héritent de.

J'ai trouvé que je peux remplacer la méthode onActionExecuted() du contrôleur de base et y écrire mon code d'appel http partenaire afin qu'il soit exécuté après chaque action.

J'ai écrit un résultat personnalisé après avoir lu l'article au Send asp.net mvc action result inside email. ce qui me permet de saisir le contenu de la vue. (qui fait partie d'un autre contrôleur qui hérite également du contrôleur de base).

Ce que je ne peux pas comprendre:

  1. Comment puis-je faire un appel à l'action du contrôleur (celui qui rendra le contenu du http appelle le corps) pour obtenir le contenu de mon contrôleur de base Méthode onActionExecuted()?

anil

Répondre

0

L'idée de la plupart des cadres MVC pour rendre les choses plus simples. Tout se décompose en un appel à une méthode avec certaines entrées et avec certaines valeurs de retour. D'une certaine façon, vous pouvez accomplir ce que vous voulez en faire quelque chose comme ceci:

class MyController { 
    public ActionResult Action1() { 
    // Do stuff 1 
    } 

    public ActionResult Action2() { 
    // Do stuff 2 
    } 
} 

Vous pouvez ensuite factoriser un peu:

class MyController { 
    public ActionResult Action1() { 
    // Pull stuff out of ViewData 

    DoStuff1(param1, param2, ...); 
    } 

    public ActionResult Action2() { 
    DoStuff2(param1, param2, ...); 
    } 

    public void DoStuff1(/* parameters */) { 
    // Do stuff 1 
    } 

    public void DoStuff2(/* parameters */) { 
    // Do stuff 2 
    } 
} 

Maintenant, vous pouvez simplement appeler DoStuff1() et DoStuff2() directement parce que ce ne sont que des méthodes. Vous pouvez les rendre statiques si possible. N'oubliez pas que vous devrez probablement faire quelque chose à propos de la vérification des erreurs et des types de retour.

+0

Hey Tommy, Cette approche va me faire dupliquer la méthode à chaque contrôleur, puis dupliquer les appels de méthode à la fin de chacune de ses actions. Je cherchais une solution (si c'est possible) qui me permettrait de le faire depuis mon contrôleur de base car tous mes contrôleurs en héritent Anil –

0
protected override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     base.OnActionExecuted(filterContext); 

      this.ViewData.Model = GLB_MODEL; 
      Stream filter = null; 
      ViewPage viewPage = new ViewPage(); 
      viewPage.ViewContext = new ViewContext(filterContext.Controller.ControllerContext, new WebFormView("~/Views/Customer/EmailView.aspx", ""), this.ViewData, this.TempData); 
      var response = viewPage.ViewContext.HttpContext.Response; 
      response.Clear(); 
      var oldFilter = response.Filter; 

      try 
      { 
       filter = new MemoryStream(); 
       response.Filter = filter; 

       viewPage.ViewContext.View.Render(viewPage.ViewContext, viewPage.ViewContext.HttpContext.Response.Output); 
       response.Flush(); 

       filter.Position = 0; 
       var reader = new StreamReader(filter, response.ContentEncoding); 
       string html = reader.ReadToEnd(); 
      } 
      finally 
      { 
       if (filter != null) 
       { 
        filter.Dispose(); 
       } 
       response.Filter = oldFilter; 
      } 

    } 

Ceci est une version modifiée du code de Render a view as a string. Je ne voulais pas afficher le résultat de la vue dans le flux de réponse httpcontext.

1

Ceci appellera une seconde action de commande de la première action du contrôleur dans le même contrôleur:

public ActionResult FirstAction() 
    { 
     // Do FirstAction stuff here. 
     return this.SecondAction(ArgumentsIfAny); 
    } 

    public ActionResult SecondAction() 
    { 
     // Do SecondAction stuff here. 
     return View(); 
    } 

n'a pas besoin d'être trop compliqué. :-)

Questions connexes