2009-09-11 4 views
2

Je rends un formulaire de connexion commun à l'aide de Html.RenderAction, sur chaque page de mon site.Gestion de ViewData entre les appels RenderAction

Si l'utilisateur entre ses données dans le zone de texte et clique sur « Soumettre », il fait un POST à ​​un contrôleur qui gère le journal en.

S'ils font une erreur, telles que la saisie d'un email non valide adresse, il remplira le ModelState avec un message d'erreur, puis redirigera vers la page précédente.

Le problème est, parce que RenderAction se produit comme une demande distincte, je perds le ViewModel.

Même lorsque je l'ai placé dans TempData, il est perdu car TempData est vidé pour chaque requête séparée.

Existe-t-il un moyen de préserver les données entre des appels Html.RenderAction consécutifs?

Si non, des suggestions sur comment je pourrais être en mesure de pirater cela? (Devrait mettre les données dans la session?)

+0

Note: On dirait que je ne suis pas le seul à avoir ce problème: http://forums.asp.net/t/1438013.aspx – Jonathan

+0

Essayez ceci aussi bien: http://jonkruger.com/blog/2009/04/06/aspnet-mvc-pass-parameters-when-redirecting-from-one-action-to-another/ – mawaldne

Répondre

0

Voici ce que j'ai fait pour le moment. (Ce n'est probablement pas la solution la plus idéale.)

J'ai créé un 'PreserveViewDataAttribute', que je mets sur n'importe quelle action pour laquelle je veux conserver le ViewData dans la session.

Dans mon BaseController, j'ai remplacé la méthode 'Redirect' par ma propre méthode, qui est la suivante.

  1. Obtient une référence à la méthode d'action qui l'a appelé (un peu de réflexion ici)

  2. vérifie si cette méthode a le « PreserveViewDataAttribute » définie sur elle

  3. Si elle le fait, copie le ViewData actuel dans une variable de session. (Le libellé de la variable est le même que le nom de l'action en cours, avec '_ViewData' collé à la fin.)

  4. Dans les deux cas, appelle la méthode de redirection de base.

Je crée une propriété dans le BaseController appelé « PreservedViewData », qui renvoie la ViewData en session, pertinente pour l'action en cours. (Ou retourne null si non trouvé). Par conséquent, pour conserver ViewData aussi longtemps que je le souhaite, je n'ai qu'à décorer mon action avec 'PreserveViewDataAttribute', puis appeler 'PreservedViewData' quand j'en ai besoin. Faites-moi savoir si vous voulez le code source à cela.

Questions connexes