2011-12-01 5 views
1

Je tente d'appeler un contrôleur via un actionLink() dans une vue. Ce contrôleur obtient les données d'un référentiel TempData. Cependant, il semble que peu importe ce que je fais, si je place le dépôt TempData dans la vue, il ne passera pas au contrôleur? Dois-je utiliser ViewData à la place? Quelle est votre recommandation pour un système comme celui-là?TempData passant de la vue au contrôleur

Merci

+0

Vous n'êtes pas censé définir TempData de vue, si vous avez besoin de cela, pensez à changer votre conception –

Répondre

2

TempData, ni ViewData est censé être réglé dans une vue. Une vue est supposée consommer des données qui ont été stockées dans ces structures à l'intérieur des actions de votre contrôleur (bien, en fait, ce n'est pas le cas, une vue est supposée consommer un modèle de vue mais c'est un autre sujet). TempData peut être utilisé lorsque vous souhaitez conserver des informations entre deux redirections. Il devrait être placé à l'intérieur d'une action de contrôleur qui redirige vers une autre action du contrôleur qui va lire les données:

public ActionResult Foo() 
{ 
    SomeModel model = ... 
    TempData["foo"] = model; 
    return RedirectToAction("Bar"); 
} 

public ActionResult Bar() 
{ 
    var model = TempData["foo"] as SomeModel; 
    ... 
} 

donc une action de contrôleur devrait obtenir des données de la structure TempData que si cette action a été invoquée après une redirection d'une autre action qui définit les données. Une telle action de contrôleur ne doit jamais être appelée depuis une vue car si vous avez une vue, cela signifie que cette vue a été rendue à partir d'une action du contrôleur qui a vraisemblablement défini les données dans TempData, mais il y a toujours un risque. le serveur - AJAX ou quelque chose), le TempData sera perdu.

Pour votre cas, lorsqu'une vue doit appeler le serveur, il existe essentiellement 3 techniques:

  • Utilisez un HTML <form> avec des champs d'entrée qui envoie les données au serveur
  • Utilisez une ancre et transmettre des données en tant que paramètres de chaîne de requête au contrôleur
  • Utilisez javascript et envoyer une requête AJAX ou une redirection vers le serveur
+0

J'avais peur de cela. Alors, comment gérer les actualisations de page à partir d'un bouton (créé à partir d'un formulaire) si vous avez reçu des données d'un référentiel TempData? Actuellement, pour rafraîchir via le bouton, j'appelle simplement le contrôleur à partir d'un lien action ... Là réside le problème. Ce contrôleur contient des informations provenant d'un référentiel TempData. Si j'appelle cela et son null la page ne rechargera pas correctement. Y a-t-il une meilleure façon de le faire? – SoftwareSavant

+0

@DmainEvent, c'est exactement l'un des problèmes de TempData. La page s'actualise avec F5. Ce pourrait être un PITA. Personnellement, je n'utilise jamais TempData. Si j'ai besoin de persister quelque chose pour pouvoir survivre aux actualisations de pages, je le persiste dans mon back-end pour que je puisse toujours le récupérer si nécessaire étant donné son identifiant unique. TempData devrait vraiment être utilisé pour un mécanisme de stockage d'objets de très courte durée: des choses comme des messages de notification par exemple. –

+0

Comment le stockez-vous dans le back-end? Dans comme une base de données ou existe-t-il un mécanisme comme une session que vous utilisez? – SoftwareSavant

2

Vous devez définir le TempData valeur à l'avance, dans le contrôleur qui rend votre vue. La valeur sera alors captée par l'action du contrôleur qui rend votre seconde vue (ActionLink).

Questions connexes