web-dev-qa-db-fra.com

Afficher une vue d'un autre contrôleur dans ASP.NET MVC

Est-il possible d'afficher une vue d'un autre contrôleur?

Disons par exemple que j'ai une vue CategoriesController et un Category/NotFound.aspx. Pendant que je suis dans la CategoriesController, je peux facilement retourner View("NotFound").

Maintenant, disons que j’ai une ProductsController et une action et une vue pour ajouter un produit. Cependant, cette action nécessite que nous ayons une catégorie pour ajouter le produit. Par exemple, Products/Add/?catid=10.

Si je ne parviens pas à trouver la catégorie en fonction de catid, je souhaite afficher la vue NotFound à partir du contrôleur Catégories au lieu de créer une vue CategoryNotFound sous le contrôleur de produits.

Est-ce possible ou est-ce que je structure les choses de la mauvaise façon? Y at-il un bon moyen de le faire?

223
dtc

Oui. Par défaut, ASP.NET MVC vérifie d'abord dans \Views\[Controller_Dir]\, mais après cela, s'il ne trouve pas la vue, il archive dans \Views\Shared.

Le répertoire partagé sert spécifiquement à partager des vues sur plusieurs contrôleurs. Ajoutez simplement votre vue au sous-répertoire partagé et vous êtes prêt à partir.

Si vous le faites return View("~/Views/Wherever/SomeDir/MyView.aspx") Vous pouvez renvoyer la vue de votre choix.

248
womp

Vous pouvez utiliser:

return View("../Category/NotFound", model);

Il a été testé dans ASP.NET MVC 3, mais devrait également fonctionner dans ASP.NET MVC 2.

155
Guillaume86

Oui c'est possible . Renvoyer une méthode RedirectToAction() comme ceci:

return RedirectToAction("ActionOrViewName", "ControllerName");
40
doncadavona

Avez-vous essayé RedirectToAction?

33
Paul Johnson

Oui, vous pouvez. Renvoyer une action comme celle-ci:

return RedirectToAction("View", "Name of Controller");

Un exemple:

RedirectToAction("Details/" + id.ToString(), "FullTimeEmployees");

Cette approche appellera la méthode GET 

Vous pouvez aussi transmettre des valeurs à une action comme celle-ci:

RedirectToAction("Details/" + id.ToString(), "FullTimeEmployees", new {id = id.ToString(), viewtype = "extended" );
16
ignacio chiazzo

Vous pouvez également appeler n’importe quel contrôleur depuis JavaScript / jQuery . Supposons que vous ayez un contrôleur retournant 404 ou une autre page/usercontrol. Ensuite, lors de certaines actions, à partir de votre code client, vous pouvez appeler une adresse qui déclenchera votre contrôleur et renverra le résultat au format HTML format Votre code client pourra prendre ce résultat renvoyé et le placer où vous le souhaitez. veux en toi ta page ...

5
Marko

Avec ce code, vous pouvez obtenir n’importe quel contrôleur:

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