Transmission de données entre différentes méthodes d’action du contrôleur

J’utilise ASP.NET MVC 4 . J’essaie de transmettre des données d’un contrôleur à un autre contrôleur. Je ne comprends pas bien. Je ne suis pas sûr si c’est possible?

Voici ma méthode d’action source où je veux transmettre les données de:

 public class ServerController : Controller { [HttpPost] public ActionResult ApplicationPoolsUpdate(ServiceViewModel viewModel) { XDocument updatedResultsDocument = myService.UpdateApplicationPools(); // Redirect to ApplicationPool controller and pass // updatedResultsDocument to be used in UpdateConfirmation action method } } 

Je dois le transmettre à cette méthode d’action dans ce contrôleur:

 public class ApplicationPoolController : Controller { public ActionResult UpdateConfirmation(XDocument xDocument) { // Will add implementation code return View(); } } 

J’ai essayé ce qui suit dans la méthode d’action ApplicationPoolsUpdate mais cela ne fonctionne pas:

 return RedirectToAction("UpdateConfirmation", "ApplicationPool", new { xDocument = updatedResultsDocument }); return RedirectToAction("UpdateConfirmation", new { controller = "ApplicationPool", xDocument = updatedResultsDocument }); 

Comment pourrais-je y arriver?

HTTP et redirections

Rappelons d’abord comment fonctionne ASP.NET MVC:

  1. Lorsqu’une requête HTTP arrive, elle est comparée à un ensemble de routes. Si un itinéraire correspond à la demande, l’action du contrôleur correspondant à l’itinéraire sera appelée.
  2. Avant d’appeler la méthode d’action, ASP.NET MVC effectue la liaison de modèle. La liaison de modèle est le processus de mappage du contenu de la requête HTTP, qui est fondamentalement du texte, avec les arguments fortement typés de votre méthode d’action.

Rappelons-nous également ce qu’est une redirection:

Une redirection HTTP est une réponse que le serveur Web peut envoyer au client, lui demandant de rechercher le contenu demandé sous une URL différente. La nouvelle URL est contenue dans un en-tête Location que le serveur Web renvoie au client. Dans ASP.NET MVC, vous effectuez une redirection HTTP en renvoyant un RedirectResult partir d’une action.

Transmission de données

Si vous transmettiez simplement des valeurs simples telles que des chaînes et / ou des entiers, vous pourriez les transmettre en tant que parameters de requête dans l’URL de l’en-tête Location . C’est ce qui se passerait si vous utilisiez quelque chose comme

 return RedirectToAction("ActionName", "Controller", new { arg = updatedResultsDocument }); 

comme d’autres l’ont suggéré

La raison pour laquelle cela ne fonctionnera pas est que le XDocument est un object potentiellement très complexe. Il n’existe aucun moyen simple pour le framework ASP.NET MVC de sérialiser le document en quelque chose qui rentre dans une URL, puis de lier le modèle de la valeur de l’URL à votre paramètre d’action XDocument .

En général, transmettre le document au client pour que le client le répète au serveur lors de la prochaine demande est une procédure très fragile: cela nécessiterait toutes sortes de sérialisation et de désérialisation et toutes sortes de problèmes pourraient survenir. Si le document est volumineux, cela peut également représenter une perte de bande passante importante et avoir de graves conséquences sur les performances de votre application.

Au lieu de cela, vous souhaitez conserver le document sur le serveur et transmettre un identifiant au client. Le client transmet ensuite l’identifiant avec la requête suivante et le serveur récupère le document en utilisant cet identifiant.

Stockage des données pour la récupération sur la prochaine demande

Donc, la question devient maintenant, où le serveur stocke-t-il le document entre-temps? Eh bien, c’est à vous de décider et le meilleur choix dépendra de votre scénario particulier. Si ce document doit être disponible à long terme, vous souhaiterez peut-être le stocker sur disque ou dans une firebase database. Si elle ne contient que des informations transitoires, le conserver dans la mémoire du serveur Web, dans le cache ASP.NET ou dans la Session (ou TempData , qui est TempData la même que la Session ) peut être la bonne solution. De toute façon, vous stockez le document sous une clé qui vous permettra de récupérer le document ultérieurement:

 int documentId = _myDocumentRepository.Save(updatedResultsDocument); 

et puis vous renvoyez cette clé au client:

 return RedirectToAction("UpdateConfirmation", "ApplicationPoolController ", new { id = documentId }); 

Lorsque vous souhaitez récupérer le document, vous le récupérez simplement en fonction de la clé:

  public ActionResult UpdateConfirmation(int id) { XDocument doc = _myDocumentRepository.GetById(id); ConfirmationModel model = new ConfirmationModel(doc); return View(model); } 

Avez-vous essayé d’utiliser ASP.NET MVC TempData ?

Le dictionnaire ASP.NET MVC TempData est utilisé pour partager des données entre les actions du contrôleur. La valeur de TempData persiste jusqu’à sa lecture ou jusqu’à l’expiration de la session de l’utilisateur actuel. La persistance des données dans TempData est utile dans des scénarios tels que la redirection, lorsque des valeurs sont requirejses au-delà d’une requête unique.

Le code serait quelque chose comme ça:

 [HttpPost] public ActionResult ApplicationPoolsUpdate(ServiceViewModel viewModel) { XDocument updatedResultsDocument = myService.UpdateApplicationPools(); TempData["doc"] = updatedResultsDocument; return RedirectToAction("UpdateConfirmation"); } 

Et dans ApplicationPoolController:

 public ActionResult UpdateConfirmation() { if (TempData["doc"] != null) { XDocument updatedResultsDocument = (XDocument) TempData["doc"]; ... return View(); } } 

Personnellement, je n’aime pas utiliser TempData, mais je préfère passer un object fortement typé, comme expliqué dans Passing Information Between Contrôleurs dans ASP.Net-MVC .

Vous devriez toujours trouver un moyen de le rendre explicite et attendu.

Je préfère utiliser ceci au lieu de TempData

 public class Home1Controller : Controller { [HttpPost] public ActionResult CheckBox(ssortingng date) { return RedirectToAction("ActionName", "Home2", new { Date =date }); } } 

et un autre controller Action est

 public class Home2Controller : Controller { [HttpPost] Public ActionResult ActionName(ssortingng Date) { // do whatever with Date return View(); } } 

il est trop tard mais j’espère être utile pour quelqu’un à l’avenir

Si vous devez transmettre des données d’un contrôleur à un autre, vous devez transmettre les données par les valeurs d’itinéraire. Les deux étant différentes, si vous envoyez des données d’une page à une autre, vous devez utiliser la chaîne de requête.

Mais vous pouvez faire un truc:

Dans votre action appelante, appelez l’action appelée comme une méthode simple:

 public class ServerController : Controller { [HttpPost] public ActionResult ApplicationPoolsUpdate(ServiceViewModel viewModel) { XDocument updatedResultsDocument = myService.UpdateApplicationPools(); ApplicationPoolController pool=new ApplicationPoolController(); //make an object of ApplicationPoolController class. return pool.UpdateConfirmation(updatedResultsDocument); // call the ActionMethod you want as a simple method and pass the model as an argument. // Redirect to ApplicationPool controller and pass // updatedResultsDocument to be used in UpdateConfirmation action method } }