Question

Je rends un formulaire de connexion commun à l'aide de Html.RenderAction sur chaque page de mon site.

Si l'utilisateur entre ses détails dans la zone de texte et clique sur "Soumettre", il effectue un test POST vers un contrôleur qui gère la connexion.

S'ils commettent une erreur, telle que la saisie d'une adresse e-mail non valide, le ModelState sera peuplé d'un message d'erreur, puis redirigé vers la page sur laquelle ils étaient auparavant.

Le problème vient du fait que RenderAction se présente sous la forme d'une requête distincte et que je perds le ViewModel.

Même lorsque je le mets dans TempData, il est perdu car TempData est vidé à chaque requête distincte.

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

Si non, des suggestions sur la manière dont je pourrais peut-être pirater cela? (Faut-il mettre les données en session?)

Était-ce utile?

La solution

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 pour toutes les actions pour lesquelles je souhaite préserver les ViewData dans la session.

Dans mon BaseController, j'ai remplacé la méthode "Redirect" par ma propre méthode, qui effectue les opérations suivantes.

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

  2. Vérifie si le "PreserveViewDataAttribute" est défini sur cette méthode

  3. Si tel est le cas, copie le ViewData actuel dans une variable de session. (Le libellé de la variable est identique au nom de l'action en cours, '_ViewData' étant ajouté à la fin.)

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

Ensuite, j'ai créé dans BaseController une propriété appelée 'PreservedViewData', qui renvoie le ViewData en session correspondant à l'action en cours. (Ou renvoie null si non trouvé).

Ainsi, pour conserver ViewData aussi longtemps que je le souhaite, il suffit de décorer mon action avec "PreserveViewDataAttribute", puis d'appeler "PreservedViewData" chaque fois que j'en ai besoin.

Faites-moi savoir si vous souhaitez utiliser le code source.

Autres conseils

Vous pourriez aimer cette approche de la section Post-Redirect-Get par Kazi Rashid.

http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx#prg

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top