MVC Probleme ViewData / beginForm [Résolu]

Messages postés
15
Date d'inscription
lundi 29 juin 2009
Dernière intervention
7 décembre 2010
- - Dernière réponse : WiDOC
Messages postés
15
Date d'inscription
lundi 29 juin 2009
Dernière intervention
7 décembre 2010
- 16 juil. 2009 à 10:06
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-
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Messages postés
6827
Date d'inscription
dimanche 15 décembre 2002
Dernière intervention
13 octobre 2010
3
Merci
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

Merci jesusonline 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de jesusonline
Messages postés
15
Date d'inscription
lundi 29 juin 2009
Dernière intervention
7 décembre 2010
0
Merci
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...
Commenter la réponse de WiDOC
Messages postés
6827
Date d'inscription
dimanche 15 décembre 2002
Dernière intervention
13 octobre 2010
0
Merci
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
Commenter la réponse de jesusonline
Messages postés
15
Date d'inscription
lundi 29 juin 2009
Dernière intervention
7 décembre 2010
0
Merci
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. "
Commenter la réponse de WiDOC
Messages postés
15
Date d'inscription
lundi 29 juin 2009
Dernière intervention
7 décembre 2010
0
Merci
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)
Commenter la réponse de WiDOC

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.