MVC Probleme ViewData / beginForm [Résolu]

Signaler
Messages postés
15
Date d'inscription
lundi 29 juin 2009
Statut
Membre
Dernière intervention
7 décembre 2010
-
Messages postés
15
Date d'inscription
lundi 29 juin 2009
Statut
Membre
Dernière intervention
7 décembre 2010
-
Bonjour,

Voila je développe un intranet avec asp.net MVC / VB qui sert a suivre la production d'une entreprise donc :

Lorsque une personne se log dessus il a accès à certain menu ou pas et aussi à des sous menu qui correspondent aux différentes fonctions dans l'entreprise
tout cela est géré par nos tables sans soucis.

- Par conséquent dans mon modèle -> je récupère dans un dataread la liste des menu accessible pour la personne
- Dans mon controlleur -> je récupère ce dataread comme ceci : 
            ViewData("id_menu") = Models.Home.Menu()
où "Models.Home.Menu()" est la procedure qui me retourne mon Dataread
puis je "return View"
- Ma vue retourné se place dans site.Master
et dans site.Master je génère mes actionLink qui mèneront aux différentes IHMs de mon application.(qui elles se metteront dans le placeHolder du site.Master)

tout cela marche très très bien  " MAIS " (bah oui si il n'y avait pas de "mais" je ne serai pas la :s)
mais mais mais ,,,, lorsque je vais dans une de ses applications ou tout autre lien je ne passe donc pas par le controleur Index et apperement le ViewData se reset.
DONC je perd le ViewData("id")  (qui je le rapel est écrit dans le controleur Index) DONC mon menu disparait....

le seul moyen que j'ai trouvé c'est de réécrire ViewData("id_menu") = Models.Home.Menu() DANS TOUS MES CONTROLEURS
.....berk !!....sa fait quand même un accès à la base pour rien et j'ai deux menus à gérer ainsi. (puis rien que dans le code c'est crade.)

je cherche un moyen de ne rafraichir QUE le ContentPLaceHolder dans le site.Master la ou toute mes vues vont se percher pour que le script qui genere le menu avec le ViewData("id_menu") n'ai pas à se réexecuter (puisqu'il sera vide)
Alors le problème c'est que le UpdatePanel (que je n'arrivait déja pas a mettre en place a 100%)  ne respecte pas la logique MVC (c'est pour ça que sa marchait pas)
J'ai vu qu'il y avait de nouveaux outils implémenter dans MicrosoftAjax.js à utiliser.
Le probleme c'est que les soluce sont souvent écrit en C#  (je suis en VB) et que je n'arrive pas à appliquer leurs solutions parce qu'ils n'utilisent pas le contentPlaceHolder ou que je ne comprend pas comment écrire le BeginForm comme sur cette exemple.
http://weblogs.asp.net/dwahlin/archive/2009/05/14/emulating-the-updatepanel-in-asp-net-mvc-1-0-with-ajaxhelper.aspx

Si quelqu'un peut m'aider où si je ne suis pas assez clair n'hésitez surtout pas, je ne suis sans doute pas le meilleur des orateurs.

-WiDOC-
A voir également:

5 réponses

Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
27
Bonjour,

Cela me parait normal :-)
Il n'y a pas de persistence entre les vues, tu dois donc gérer manuellement cette persistence. Ce que tu peux faire, c'est retourné un objet complexe au niveau de ton ViewData (ViewData.Model = Pouet()  de mémoire)  Ensuite tu fais hériter ton objet complexe d'un objet de base ou tu auras la propriété id_menu.

Au niveau des UpdatePanels, ASP.net MVC n'a pas du tout la meme logique, il faut donc éviter d'essayer de reprendre le comportement des webforms ! La solution proposé par Microsoft c'est d'utiliser des vues que tu vas mettre à jour dynamiquement via JavaScript. Ce n'est pas une solution pour contourner le problème rencontré, et tu auras beaucoup de limitation en agisant ainsi.

Je te conseille vivement de regarder comment transiter un objet complexe entre le controlleur et ta vue (via ViewData.Model je crois) ainsi grace à l'héritage, tu pourras facilement gérer ton menu. Bien sur cela nécessite de faire sa propre persistance, ce qui était habituellement fait via le viewstate.

<hr />Cyril - MVP ASP.net - MCPD ASP.net & MCTS SQL - Consultant indépendant
Messages postés
15
Date d'inscription
lundi 29 juin 2009
Statut
Membre
Dernière intervention
7 décembre 2010

Je reviens sur ce poste ..
déjà merci d'avoir répondu.

J'ai contourné le problème mais je sais pas si c'est très respectueux MVC.

en fait dans mon Modele j'ai un fichier "globalVariable", et une de ces variables est un dataset que j'alimente avec ma requete depuis mon controleur, ensuite dans ma masterpage en code behind sur l'evenement LOAD je lis le dataset et il se case comme je veux ensuite....

Donc comme tu dis je crée ma propre persistance...
après ce fichier GlobalVariable je pense n'a rien a faire dans le dossier "Modèles" mais je changerai plus tard...
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
27
Bonjour,

Comment est stocké tes variables ? via un membre static ? Dans ce cas tu vas avoir des soucis, car les membres statics sont partagés entres TOUS les utilisateurs.

Cyril - MVP ASP.net - MCPD ASP.net & MCTS SQL - Consultant indépendant
Messages postés
15
Date d'inscription
lundi 29 juin 2009
Statut
Membre
Dernière intervention
7 décembre 2010

ben...j'ai un fichier GlobalVariable.vb dans lequel je met mes variables pour remplir mes menus (puisque je doit les remplir chaque fois que je clic sur une vue puisque rien ne reste), que je fait hérité dans le code-behind de mon site.Master.
De la je peut recup' mes variables pour générer mes menus...

sinon pour ta solution je crois avoir trouvé comment utilisé le viewdata.model mais je ne comprend pas la suite de ta phrase
---> "tu fais hériter ton objet complexe d'un objet de base ou tu auras la propriété id_menu. "
Messages postés
15
Date d'inscription
lundi 29 juin 2009
Statut
Membre
Dernière intervention
7 décembre 2010

en fait je ne vois tout simplement pas en quoi ta solution règle le problème de persistance...qu'importe ce que j'envoi en viewdata..puisque c'est perdu dès que l'utilisateur part sur une autre vue...d'où ma petite rustine (oui une rustinette quoi)