2009-02-12 7 views
3

J'ai une méthode d'action, et en fonction de ce qui lui est passé, je veux rediriger vers une autre action dans un autre contrôleur. Les noms d'action et de contrôleur sont déterminés au moment de l'exécution.Dans ASP.NET MVC, conserver l'URL lors de la restitution RedirectToAction

Si je renvoie RedirectToAction(), cela forcera une redirection et changera l'URL dans le navigateur. Ce que je voudrais, c'est quelque chose comme TransferToAction() qui peut transférer le traitement de la requête en cours vers une autre action, sans faire de redirection. Je me souviens d'une méthode qui se comporte comme ça dans les aperçus précédents, mais je n'arrive pas à le trouver dans la RC d'ASP.NET MVC.

Savez-vous comment je ferais cela?

MISE À JOUR

I ajouté l'itinéraire suivant:

routes.MapRoute(
    "PageRouter", 
    "{site}/{*url}", 
    new { controller = "PageRouter", 
      action = "RoutePage", site = "", url = "" } 
); 

Et l'action du contrôleur PageRouter RoutePage:

public ActionResult RoutePage(string site, string url) 
{ 
    var controller = new HomeController {ControllerContext = ControllerContext}; 
    controller.RouteData.Values["controller"] = "Home"; 
    controller.RouteData.Values["action"] = "Index"; 

    return controller.Index(site, url); 
} 

je devais régler le contrôleur et l'action en RouteData pour l'Index vue à rendre. Sinon, il recherchera une vue Index dans PageRouterController.

J'ai encore besoin de comprendre comment créer un contrôleur et son action ne connaissant que leurs noms. par exemple. Je voudrais être en mesure de simplement appeler quelque chose comme ceci:

public ActionResult RoutePage(string site, string url) 
{ 
    return InvokeAction("Home", "Index"); 
} 

Que devrait aller dans InvokeAction()? Ai-je besoin de passer le contexte?

Répondre

4

Vous devriez pouvoir appeler directement l'autre méthode et, en supposant qu'elle renvoie un ViewResult, elle affichera cette vue en réponse à la requête et l'URL ne changera pas. Notez que vous serez responsable de vous assurer que toutes les données dont l'autre méthode a besoin sont disponibles. Par exemple, si votre autre méthode nécessite des paramètres de formulaire qui n'ont pas été fournis, vous devrez peut-être créer un FormCollection approprié et définir le ValueProvider du contrôleur sur un ValueProvider basé sur votre FormCollection. De même avec tous les arguments requis par la méthode.

+0

Donc je vais devoir utiliser la réflexion pour appeler la méthode d'action? Je ne connais pas le nom de l'action ou du contrôleur que je redirige avant l'exécution. –

+0

En outre, qu'en est-il du contexte du contrôleur? Cette méthode ne semble pas fonctionner pour moi. –

+0

Le contexte du contrôleur sera le même. Ce qui semble ne pas fonctionner? Peut-être que vous pourriez poster du code. – tvanfosson

Questions connexes