2010-11-02 22 views
1

Je pense que je ne comprends pas quelque chose à propos de MVC. Je suis en train de faire ce qui suit:Appelez ActionA à partir d'ActionB puis passez à ActionB

public class ControllerA : Controller 
{ 
    public ActionResult Index() 
    { 
     // do code 

     // perform action on ControllerB - something like: 
     // RedirectToAction("Action", "ControllerB"); 

     // CARRY ON with more code 
    } 
} 

public class ControllerB : Controller 
{ 
    public void Action() 
    { 
     // do code 
    } 
} 

Il est évident que RedirectToAction("Action", "ControllerB"); ne fonctionne pas. Alors, comment je fais? Je suppose que je pourrais avoir tous les contrôleurs qui ont besoin d'utiliser Action() hérité de ControllerB mais c'est vraiment un mauvais moyen de le faire. S'il vous plaît aider!

+0

est-ce que vous voulez préciser ce que fait '// do code' dans ControllerB? Peut-être que vous avez besoin de RenderAction dans le code de vue? – dotjoe

+0

Juste une sorte de logique métier réutilisée que vous souhaitez utiliser dans plusieurs contrôleurs. – ajbeaven

+0

Ensuite, vous devriez tirer cette logique métier dans une classe distincte afin que vous puissiez l'utiliser dans plusieurs contrôleurs. – dotjoe

Répondre

3

Vous devez retourner le ActionResult de RedirectToAction()

return RedirectToAction("Action", "ControllerB"); 

est ce que vous devez faire si vous voulez RedirectToAction rediriger effectivement à une action. Après avoir clarifié ce que "ne fonctionne pas" signifie pour vous, je pense que vous devriez juste avoir tous les contrôleurs hérités d'une base. C'est une approche assez standard.

public class ControllerA : ControllerB 
{ 
    public ActionResult Index() 
    { 
     // do code 

     Action(); 

     // CARRY ON with more code 
    } 
} 

public class ControllerB : Controller 
{ 
    public void Action() 
    { 
     // do code 
    } 
} 
+0

Comment cela fonctionne-t-il si Index() est censé retourner une vue et Action() est vide? Index() ne pourra pas continuer après notre RedirectToAction. – ajbeaven

+0

Bien que Index() ne continue pas, vous quittez la méthode. Je ne comprends pas votre question car Action() n'a pas de vue donc vous n'avez rien à rediriger aussi. – jfar

+0

C'est parce que je ne veux pas qu'Action() renvoie une vue, je veux qu'elle fasse quelque chose, puis continue avec l'action qui l'a appelée. – ajbeaven

0

Je crois que le contrôleur vous en cours d'exécution est une instance de la classe si vous devez faire une instance de contrôleur B pour être en mesure d'exécuter quoi que ce soit, donc ce que vous essayez de faire là juste ne fonctionnera pas vraiment sans un hack.

Je pense cependant il y a 2 méthodes pour mieux obtenir les résultats que je pense que vous êtes après:

1) Faire une classe « ControllerBase » et ont tous les contrôleurs héritent de lui au lieu de partir « contrôleur », puis tout partagé code que vous pouvez ajouter dans la classe de base (comme une méthode statique peut-être), puis tous les contrôleurs peuvent y accéder en tant que membre agréable et facile. 2) Comme MVC créera une DLL directe, vous pouvez ajouter de nouvelles classes selon vos besoins, par exemple ajouter un nouveau dossier de projet comme 'Globals' ajouter un nouveau fichier de classe appelé 'Funcs' et là vous avez une librairie statique que vous pouvez accéder de n'importe où, Funcs.SendEmail(); etc

Si je suis hors de la marque ok! codage heureux de toute façon heh

0

J'ai injecté des contrôleurs avec une méthode d'usine de la fabrique du contrôleur en tant que délégué (Func CreateController), et utilisé pour créer des sous-contrôleurs, comme dans ce cas. Il y a beaucoup de façons d'atteindre votre objectif, mais je pense que cela pourrait être un moyen rapide d'obtenir ce que vous voulez travailler.