Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2019-02-14T23:19:37+01:00Les derniers messages parus sur le forum de Zeste de Savoir.Comment mettre l'url ?, message #1990562019-02-14T23:19:37+01:00Maldoror/@Maldororhttps://zestedesavoir.com/forums/sujet/12105/comment-mettre-lurl/?page=1#p199056<p>Bonjour à tous,</p>
<p>J’ai fait le tuto avec succès "<em>Ma première page avec ASP.NET</em>" avec Visual Studio 2017 Entreprise.</p>
<p>En fait j’allais bien sur la page Web.</p>
<p>Sur la page du tuto suivante, j’ai vu qu’il y avait deux fichiers :</p>
<p><strong>RouteConfig.cs</strong> et</p>
<p><strong>FilterConfig.cs</strong></p>
<p>Mais Visual Studio n’a pas généré le fichier <strong>FilterConfig.cs</strong></p>
<p>Je ne sais pas s’il était bien utile en tout cas je l’ai écrit sans souci.</p>
<p>Mais depuis (et je ne sais pas si cela a un rapport avec ce fichier) je ne peux pas avoir la page Web depuis Visual Studio car l’url est tronqué : <strong><a href="http://localhost:54898/">http://localhost:54898/</a></strong> au lieu de <strong><a href="http://localhost:54898/Salutation/index">http://localhost:54898/Salutation/index</a></strong></p>
<p>Que faudrait-il modifier pour avoir l’url complet ?</p>
<p>Je précise que je suis débutant complet dans la structure ASP.NET MVC</p>Controller template, message #1823322018-06-22T22:47:06+02:00Zérotisme/@Z%C3%A9rotismehttps://zestedesavoir.com/forums/sujet/10884/controller-template/?page=1#p182332<p>J’ai reussi a reduire encore plus le code requis dans les controlleur concret en creant une classe ViewBuilder et en ajoutant un attribut static dans la EpController.</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="k">public</span> <span class="k">class</span> <span class="nc">ClientController</span> <span class="p">:</span> <span class="n">EpController</span><span class="p">.</span><span class="n">EpController</span><span class="p"><</span><span class="n">Client</span><span class="p">,</span> <span class="n">ClientViewModel</span><span class="p">,</span> <span class="n">ClientListModel</span><span class="p">,</span> <span class="n">ClientContext</span><span class="p">></span>
<span class="p">{</span>
<span class="k">static</span> <span class="nf">ClientController</span><span class="p">()</span>
<span class="p">{</span>
<span class="n">ViewBuilder_</span><span class="p">.</span><span class="n">AddView</span><span class="p">(</span><span class="n">EpController</span><span class="p">.</span><span class="n">ViewName</span><span class="p">.</span><span class="n">List</span><span class="p">,</span> <span class="s">"Index"</span><span class="p">);</span>
<span class="n">ViewBuilder_</span><span class="p">.</span><span class="n">AddView</span><span class="p">(</span><span class="n">EpController</span><span class="p">.</span><span class="n">ViewName</span><span class="p">.</span><span class="n">Detail</span><span class="p">,</span> <span class="s">"Detail"</span><span class="p">);</span>
<span class="n">ViewBuilder_</span><span class="p">.</span><span class="n">AddView</span><span class="p">(</span><span class="n">EpController</span><span class="p">.</span><span class="n">ViewName</span><span class="p">.</span><span class="n">SuccessSave</span><span class="p">,</span> <span class="s">"Index"</span> <span class="p">,</span> <span class="k">true</span><span class="p">);</span>
<span class="n">ViewBuilder_</span><span class="p">.</span><span class="n">AddView</span><span class="p">(</span><span class="n">EpController</span><span class="p">.</span><span class="n">ViewName</span><span class="p">.</span><span class="n">FailedSave</span><span class="p">,</span> <span class="s">"Detail"</span> <span class="p">);</span>
<span class="p">}</span>
<span class="k">public</span> <span class="nf">ClientController</span><span class="p">()</span> <span class="p">:</span> <span class="k">base</span><span class="p">(){}</span>
<span class="k">public</span> <span class="k">override</span> <span class="k">void</span> <span class="nf">InitializeViewBag</span><span class="p">()</span>
<span class="p">{</span>
<span class="n">ViewBag</span><span class="p">.</span><span class="n">SomeData</span> <span class="p">=</span> <span class="s">"Some data"</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
</td></tr></table></div>
<p>C’est maintenant tout ce qui est nécéssaire pour avoir un controlleur fonctionnel sans avoir a réécrire du code dans chaque controlleur qui se repetent et de plus on s’assure que tous les dev utilisent les model et la vue de la meme facon ( pas le choix vu le retour du controlleur et les assert sur la forme du model ).</p>Controller template, message #1823272018-06-22T21:03:26+02:00Zérotisme/@Z%C3%A9rotismehttps://zestedesavoir.com/forums/sujet/10884/controller-template/?page=1#p182327<p>Bon .. apres avoir testé je me suis rendu compte qu’une fonction abstraite ne peut etre static .. ce qui est logique .. donc je ne peut pas faire un model abstrait avec method static. Comme mon but etait d’imposer a nos dev une forme pour le model , j’ai du changer mon code et ai mis des assertion sur l’existance de la fonction static sur le modele ainsi que sur le type de retour ( try cast / catch assert() ).</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16</pre></div></td><td class="code"><div class="codehilite"><pre><span></span> <span class="c1">// Get the TModel 'Get' method</span>
<span class="kt">var</span> <span class="n">method</span> <span class="p">=</span> <span class="k">typeof</span><span class="p">(</span><span class="n">TModel</span><span class="p">).</span><span class="n">GetMethod</span><span class="p">(</span><span class="s">"Get"</span><span class="p">);</span>
<span class="c1">// Assert that the method exists</span>
<span class="n">AssertMethodExist</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="s">"Get"</span><span class="p">);</span>
<span class="c1">// try a 'TModel' cast</span>
<span class="k">try</span>
<span class="p">{</span>
<span class="n">TModel</span> <span class="n">model</span> <span class="p">=</span> <span class="p">(</span><span class="n">TModel</span><span class="p">)(</span><span class="n">method</span><span class="p">.</span><span class="n">Invoke</span><span class="p">(</span><span class="k">null</span><span class="p">,</span> <span class="k">new</span> <span class="kt">object</span><span class="p">[]</span> <span class="p">{</span> <span class="n">db</span><span class="p">,</span> <span class="n">id</span> <span class="p">}));</span>
<span class="k">return</span> <span class="nf">View</span><span class="p">(</span><span class="n">ViewBuilder_</span><span class="p">[</span><span class="n">ViewName</span><span class="p">.</span><span class="n">Detail</span><span class="p">].</span><span class="n">Keys</span><span class="p">.</span><span class="n">FirstOrDefault</span><span class="p">(),</span> <span class="n">model</span><span class="p">);</span>
<span class="p">}</span><span class="k">catch</span><span class="p">(</span><span class="n">Exception</span> <span class="n">ex</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="k">false</span><span class="p">,</span> <span class="s">"The model 'Get' function must return a 'TModel' "</span><span class="p">);</span>
<span class="k">return</span> <span class="k">null</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</td></tr></table></div>Controller template, message #1822892018-06-22T16:26:12+02:00Zérotisme/@Z%C3%A9rotismehttps://zestedesavoir.com/forums/sujet/10884/controller-template/?page=1#p182289<p>Bonjour a tous ,
J’ai récemment été engagé dans mon premier emploie dans le domaine en tant que full-stack dev asp ( <img alt=":soleil:" src="/static/smileys/soleil.png"> ).</p>
<p>Apres avoir travaillé sur 1 ou 2 projet , j’ai décidé d’etre pro-actif dans mon entreprise en fournissant un template de model/controlleur qui abstrait ce que nous faisons 95% du temps , ce qui nous permettrais de sauver enormement de temps de developpement. </p>
<p>Ce que j’ai cherché a faire c’est d’isoler les operations entre vue | model n’ayant qu’a s’occuper de :
vue -> quoi faire lors d’un success/fail ?
model -> quoi faire lors des operatioons : save , delete , get , getlist.</p>
<p>Je crois avoir reussi a isoler une tres grosse partie de notre travail.</p>
<p>Ce que j’aimerais c’est votre avis .. je ne fait du c# que depuis 3 mois : A premiere vu j’ai louper des truc ? Voyez vous ce qui pourrait faire "planter" le fonctionnement ? Suggestions ou autre procédés a me proposer ? Je compte le présenter dans un meeting R&D la semaine prochaine.</p>
<p>Mise en contexte :</p>
<p>je travail sur des projet en petite equipe ( 4 personnes ) et nous sommes tous des full stack. Bien que nos modeles soit un minimum standardisé .. certaines personnes travaillent sur un framework interne afin de mettre un standard sur nos procédés. C’est ce que ce template tente d’apporter : un standard dans le procédé de travail. Le plus gros probleme c’est les différence entre les dev : gestion des erreurs dans le controlleur ou dans le modele ( meme certain le font dans la vue .. ). Operations dans le controlleur ou modele. </p>
<p>Avec ce template je contrains donc ce fonctionnement : les operations du controlleurs reste minimales et ne font qu’apeller la fonction respective du model. Tous les operations sont donc fait dans une fonction static du model. </p>
<p>Q : Pourquoi une struct epresult ?</p>
<p>Est-ce que ta question porte sur le struct vs class ou sur le pourquoi retourner une structure ?
En fait c’est qu’en cas d’exception ( pas une Exception mais une différence dans le fonctionnement de notre logiciel comparé a ce que nous faisons habituellement ) , il y’a des cas ou nous voudrions faire des operations différente sur le model. Ce EpResult permet donc dans le cas d’un save de recuperer autant la liste d’erreur que le model. Nous n’avons donc qu’a overload ’Save’ dans le controlleur concret et recuperer ces resultats. ( meme si ce point est discutable du fait que ces exceptions peuvent etre geré dans le model .. j’ai quand meme voulu laisser cette posibilité d’overide les fonctions du controlleur sans cassé le workflow que j’etabli avec le model )</p>
<p>Q : Pourquoi expose tu a certain endroit des List<string>** ?</p>
<p>Afin de contreindre le fonctionnement entre model et vue. Les fonction qui peuvent produire une erreur retournent donc une liste de string qui est la liste des erreurs produits ( a part ceux du modelstate/annotations ) dans les operations du model. Par exemple un save : bien que le model puisse etre valide , identity peut retourner une erreur dans le cas d’un email deja utilisé par exemple. Ces retour contreignent donc nos futur dev a utiliser le model correctement : Si les conditions passent tu save et le controlleur s’occupe de retourner succes. Sinon tu rempli une liste d’erreur que le controlleur s’occupe de mettre dans le modelState afin que la vue les affiche.</p>
<p>Q : Lien entre TModel et TViewModel : </p>
<p>presque aucun a part le fait que certaines personne aime bien MVVM et travailler avec des ViewModel plutot que le model directement. Je leur est donc laissé la possibilité d’envoyé un ViewModel a leur model afin de procédé au ’Save’ désiré.</p>
<p>Q : Index et Detail</p>
<p>En fait , c’est question de convention interne : pour une liste de model nous utilisons toujours "Index" et pour la page de détail "Detail" , c’est donc la convention que j’ai représenté ici. Je veux que notre liste s’affiche lorsque nous allons dans /Controlleur/Index.</p>
<p>Flow du template :
<img alt="flowchart" src="https://s8.postimg.cc/6xhevm7b9/template_flow.png"></p>
<p>Template :</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="k">using</span> <span class="nn">System</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Collections.Generic</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Diagnostics</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Linq</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Web</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Web.Mvc</span><span class="p">;</span>
<span class="k">namespace</span> <span class="nn">EpController</span>
<span class="p">{</span>
<span class="c1">/// <summary></span>
<span class="c1">/// Enum for the different views. Each views MUST be defined</span>
<span class="c1">/// </summary></span>
<span class="k">public</span> <span class="k">enum</span> <span class="n">ViewName</span>
<span class="p">{</span>
<span class="n">List</span> <span class="p">=</span> <span class="m">0</span><span class="p">,</span>
<span class="n">Detail</span> <span class="p">=</span> <span class="m">1</span><span class="p">,</span>
<span class="n">SuccessSave</span> <span class="p">=</span> <span class="m">2</span><span class="p">,</span>
<span class="n">FailedSave</span> <span class="p">=</span> <span class="m">3</span>
<span class="p">}</span>
<span class="c1">/// <summary></span>
<span class="c1">/// Result from Save functions to have a list of errors and the model</span>
<span class="c1">/// </summary></span>
<span class="c1">/// <typeparam name="TModel"></typeparam></span>
<span class="k">public</span> <span class="k">struct</span> <span class="nc">EpResult</span><span class="p"><</span><span class="n">TModel</span><span class="p">></span>
<span class="p">{</span>
<span class="k">public</span> <span class="n">List</span><span class="p"><</span><span class="kt">string</span><span class="p">></span> <span class="n">Errors</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
<span class="k">public</span> <span class="n">TModel</span> <span class="n">Model</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
<span class="p">}</span>
<span class="c1">/// <summary></span>
<span class="c1">/// Base class for any model used by any EpController</span>
<span class="c1">/// </summary></span>
<span class="c1">/// <typeparam name="TModel">The model class</typeparam></span>
<span class="c1">/// <typeparam name="TViewModel">The modelView class</typeparam></span>
<span class="c1">/// <typeparam name="TListModel">The model list class</typeparam></span>
<span class="c1">/// <typeparam name="TDataBaseConext">The database context</typeparam></span>
<span class="k">public</span> <span class="k">abstract</span> <span class="k">class</span> <span class="nc">EpModel</span><span class="p"><</span><span class="n">TModel</span><span class="p">,</span><span class="n">TViewModel</span><span class="p">,</span> <span class="n">TListModel</span><span class="p">,</span> <span class="n">TDataBaseConext</span><span class="p">></span>
<span class="p">{</span>
<span class="k">public</span> <span class="k">abstract</span> <span class="n">TModel</span> <span class="nf">Get</span><span class="p">(</span><span class="n">TDataBaseConext</span> <span class="n">db</span><span class="p">,</span> <span class="kt">string</span> <span class="n">id</span><span class="p">);</span>
<span class="k">public</span> <span class="k">abstract</span> <span class="n">List</span><span class="p"><</span><span class="n">TListModel</span><span class="p">></span> <span class="n">GetList</span><span class="p">(</span><span class="n">TDataBaseConext</span> <span class="n">db</span><span class="p">);</span>
<span class="k">public</span> <span class="k">abstract</span> <span class="n">EpResult</span><span class="p"><</span><span class="n">TModel</span><span class="p">></span> <span class="n">Save</span><span class="p">(</span><span class="n">TDataBaseConext</span> <span class="n">db</span><span class="p">,</span> <span class="n">TModel</span> <span class="n">model</span><span class="p">);</span>
<span class="k">public</span> <span class="k">abstract</span> <span class="n">EpResult</span><span class="p"><</span><span class="n">TViewModel</span><span class="p">></span> <span class="n">Save</span><span class="p">(</span><span class="n">TDataBaseConext</span> <span class="n">db</span><span class="p">,</span> <span class="n">TViewModel</span> <span class="n">viewModel</span><span class="p">);</span>
<span class="k">public</span> <span class="k">abstract</span> <span class="n">List</span><span class="p"><</span><span class="kt">string</span><span class="p">></span> <span class="n">Delete</span><span class="p">(</span><span class="n">TDataBaseConext</span> <span class="n">db</span><span class="p">,</span> <span class="n">List</span><span class="p"><</span><span class="kt">string</span><span class="p">></span> <span class="n">ids</span><span class="p">);</span>
<span class="p">}</span>
<span class="c1">/// <summary></span>
<span class="c1">/// Ep controller managing an EpModel</span>
<span class="c1">/// </summary></span>
<span class="c1">/// <typeparam name="TModel">The model class</typeparam></span>
<span class="c1">/// <typeparam name="TViewModel">The model view class</typeparam></span>
<span class="c1">/// <typeparam name="TListModel">The model list class</typeparam></span>
<span class="c1">/// <typeparam name="TDataBaseContext">The database context</typeparam></span>
<span class="k">public</span> <span class="k">abstract</span> <span class="k">class</span> <span class="nc">EpController</span><span class="p"><</span><span class="n">TModel</span><span class="p">,</span> <span class="n">TViewModel</span><span class="p">,</span> <span class="n">TListModel</span><span class="p">,</span> <span class="n">TDataBaseContext</span><span class="p">></span> <span class="p">:</span> <span class="n">Controller</span>
<span class="k">where</span> <span class="n">TModel</span> <span class="p">:</span> <span class="n">EpModel</span><span class="p"><</span><span class="n">TModel</span><span class="p">,</span><span class="n">TViewModel</span><span class="p">,</span><span class="n">TListModel</span><span class="p">,</span> <span class="n">TDataBaseContext</span><span class="p">>,</span> <span class="k">new</span><span class="p">()</span>
<span class="k">where</span> <span class="n">TViewModel</span> <span class="p">:</span> <span class="k">new</span><span class="p">()</span>
<span class="k">where</span> <span class="n">TListModel</span> <span class="p">:</span> <span class="k">new</span><span class="p">()</span>
<span class="k">where</span> <span class="n">TDataBaseContext</span> <span class="p">:</span> <span class="n">IDisposable</span><span class="p">,</span> <span class="k">new</span><span class="p">()</span>
<span class="p">{</span>
<span class="c1">/// <summary></span>
<span class="c1">/// The controller views [ Detail, List, SucessSave, FailedSave]</span>
<span class="c1">/// </summary></span>
<span class="k">private</span> <span class="n">Dictionary</span><span class="p"><</span><span class="n">ViewName</span><span class="p">,</span> <span class="kt">string</span><span class="p">></span> <span class="n">Views</span><span class="p">;</span>
<span class="c1">/// <summary></span>
<span class="c1">/// Constructor</span>
<span class="c1">/// </summary></span>
<span class="c1">/// <param name="views">The controller views [ Detail, List, SucessSave, FailedSave]</param></span>
<span class="k">public</span> <span class="nf">EpController</span><span class="p">(</span><span class="n">Dictionary</span><span class="p"><</span><span class="n">ViewName</span><span class="p">,</span><span class="kt">string</span><span class="p">></span> <span class="n">views</span><span class="p">)</span>
<span class="p">{</span>
<span class="kt">var</span> <span class="n">AllViewDefined</span> <span class="p">=</span> <span class="p">(</span><span class="n">views</span><span class="p">[</span><span class="n">ViewName</span><span class="p">.</span><span class="n">List</span><span class="p">]</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span> <span class="p">&&</span> <span class="p">(</span><span class="n">views</span><span class="p">[</span><span class="n">ViewName</span><span class="p">.</span><span class="n">SuccessSave</span><span class="p">]</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span> <span class="p">&&</span> <span class="p">(</span><span class="n">views</span><span class="p">[</span><span class="n">ViewName</span><span class="p">.</span><span class="n">FailedSave</span><span class="p">]</span> <span class="p">!=</span> <span class="k">null</span><span class="p">);</span>
<span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">AllViewDefined</span><span class="p">,</span> <span class="s">"Tous les vues ( sauf detail ) doivent etre définis [ List, SucessSave, FailedSave ]"</span><span class="p">);</span>
<span class="n">Views</span> <span class="p">=</span> <span class="n">views</span><span class="p">;</span>
<span class="p">}</span>
<span class="c1">/// <summary></span>
<span class="c1">/// Returns the Model List</span>
<span class="c1">/// </summary></span>
<span class="c1">/// <returns>The list view</returns></span>
<span class="k">public</span> <span class="n">ActionResult</span> <span class="nf">Index</span><span class="p">()</span>
<span class="p">{</span>
<span class="k">using</span> <span class="p">(</span><span class="kt">var</span> <span class="n">db</span> <span class="p">=</span> <span class="k">new</span> <span class="n">TDataBaseContext</span><span class="p">())</span>
<span class="p">{</span>
<span class="kt">var</span> <span class="n">type</span> <span class="p">=</span> <span class="k">typeof</span><span class="p">(</span><span class="n">TModel</span><span class="p">);</span>
<span class="kt">var</span> <span class="n">method</span> <span class="p">=</span> <span class="n">type</span><span class="p">.</span><span class="n">GetMethod</span><span class="p">(</span><span class="s">"GetList"</span><span class="p">);</span>
<span class="n">List</span><span class="p"><</span><span class="n">TListModel</span><span class="p">></span> <span class="n">listModel</span> <span class="p">=</span> <span class="p">(</span><span class="n">List</span> <span class="p"><</span> <span class="n">TListModel</span> <span class="p">></span> <span class="p">)(</span><span class="n">method</span><span class="p">.</span><span class="n">Invoke</span><span class="p">(</span><span class="k">null</span><span class="p">,</span> <span class="k">new</span> <span class="kt">object</span><span class="p">[]</span> <span class="p">{</span> <span class="n">db</span> <span class="p">}));</span>
<span class="n">InitializeViewBag</span><span class="p">();</span>
<span class="k">return</span> <span class="nf">View</span><span class="p">(</span><span class="n">Views</span><span class="p">[</span><span class="n">ViewName</span><span class="p">.</span><span class="n">List</span><span class="p">],</span> <span class="n">listModel</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="c1">/// <summary></span>
<span class="c1">/// Save the model from the detail page</span>
<span class="c1">/// </summary></span>
<span class="c1">/// <returns>The SuccessSave or FailedSave view</returns></span>
<span class="k">public</span> <span class="n">ActionResult</span> <span class="nf">Save</span><span class="p">(</span><span class="n">TModel</span> <span class="n">model</span><span class="p">,</span> <span class="kt">string</span> <span class="n">successView</span><span class="p">,</span> <span class="kt">string</span> <span class="n">errorView</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="n">ModelState</span><span class="p">.</span><span class="n">IsValid</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">ModelState</span><span class="p">.</span><span class="n">Clear</span><span class="p">();</span>
<span class="n">using</span><span class="p">(</span><span class="kt">var</span> <span class="n">db</span> <span class="p">=</span> <span class="k">new</span> <span class="n">TDataBaseContext</span><span class="p">())</span>
<span class="p">{</span>
<span class="kt">var</span> <span class="n">result</span> <span class="p">=</span> <span class="p">(</span><span class="n">EpResult</span><span class="p"><</span><span class="n">TModel</span><span class="p">>)(</span> <span class="k">typeof</span><span class="p">(</span><span class="n">TModel</span><span class="p">).</span><span class="n">GetMethod</span><span class="p">(</span><span class="s">"Save"</span><span class="p">).</span><span class="n">Invoke</span><span class="p">(</span><span class="k">null</span><span class="p">,</span> <span class="k">new</span> <span class="kt">object</span><span class="p">[]</span> <span class="p">{</span> <span class="n">db</span><span class="p">,</span> <span class="n">model</span> <span class="p">})</span> <span class="p">);</span>
<span class="n">InitializeViewBag</span><span class="p">();</span>
<span class="k">if</span> <span class="p">(</span><span class="n">result</span><span class="p">.</span><span class="n">Errors</span><span class="p">.</span><span class="n">Count</span><span class="p">()</span> <span class="p">></span> <span class="m">0</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">foreach</span><span class="p">(</span><span class="kt">var</span> <span class="n">error</span> <span class="k">in</span> <span class="n">result</span><span class="p">.</span><span class="n">Errors</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">ModelState</span><span class="p">.</span><span class="n">AddModelError</span><span class="p">(</span><span class="s">""</span><span class="p">,</span> <span class="n">error</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="n">Json</span><span class="p">(</span><span class="k">new</span> <span class="p">{</span> <span class="n">success</span> <span class="p">=</span> <span class="k">false</span><span class="p">,</span> <span class="n">view</span> <span class="p">=</span> <span class="n">RenderHelper</span><span class="p">.</span><span class="n">RenderHelper</span><span class="p">.</span><span class="n">PartialViewToString</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="n">Views</span><span class="p">[</span><span class="n">ViewName</span><span class="p">.</span><span class="n">FailedSave</span><span class="p">],</span> <span class="n">model</span><span class="p">)</span> <span class="p">});</span>
<span class="p">}</span>
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="n">Json</span><span class="p">(</span><span class="k">new</span> <span class="p">{</span> <span class="n">success</span> <span class="p">=</span> <span class="k">true</span> <span class="p">,</span> <span class="n">view</span> <span class="p">=</span> <span class="n">RenderHelper</span><span class="p">.</span><span class="n">RenderHelper</span><span class="p">.</span><span class="n">PartialViewToString</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="n">Views</span><span class="p">[</span><span class="n">ViewName</span><span class="p">.</span><span class="n">SuccessSave</span><span class="p">],</span> <span class="n">model</span><span class="p">)</span> <span class="p">});</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="n">InitializeViewBag</span><span class="p">();</span>
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="n">Json</span><span class="p">(</span><span class="k">new</span> <span class="p">{</span> <span class="n">success</span> <span class="p">=</span> <span class="k">false</span><span class="p">,</span> <span class="n">view</span> <span class="p">=</span> <span class="n">RenderHelper</span><span class="p">.</span><span class="n">RenderHelper</span><span class="p">.</span><span class="n">PartialViewToString</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="n">Views</span><span class="p">[</span><span class="n">ViewName</span><span class="p">.</span><span class="n">FailedSave</span><span class="p">],</span> <span class="n">model</span><span class="p">)</span> <span class="p">});</span>
<span class="p">}</span>
<span class="c1">/// <summary></span>
<span class="c1">/// Save the model</span>
<span class="c1">/// </summary></span>
<span class="c1">/// <returns>The SuccessSave or FailedSave view</returns></span>
<span class="k">public</span> <span class="n">ActionResult</span> <span class="nf">Save</span><span class="p">(</span><span class="n">TViewModel</span> <span class="n">viewModel</span> <span class="p">,</span> <span class="kt">string</span> <span class="n">successView</span> <span class="p">,</span> <span class="kt">string</span> <span class="n">errorView</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="n">ModelState</span><span class="p">.</span><span class="n">IsValid</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">ModelState</span><span class="p">.</span><span class="n">Clear</span><span class="p">();</span>
<span class="k">using</span> <span class="p">(</span><span class="kt">var</span> <span class="n">db</span> <span class="p">=</span> <span class="k">new</span> <span class="n">TDataBaseContext</span><span class="p">())</span>
<span class="p">{</span>
<span class="kt">var</span> <span class="n">result</span> <span class="p">=</span> <span class="p">(</span><span class="n">EpResult</span><span class="p"><</span><span class="n">TViewModel</span><span class="p">>)(</span> <span class="k">typeof</span><span class="p">(</span><span class="n">TModel</span><span class="p">).</span><span class="n">GetMethod</span><span class="p">(</span><span class="s">"Save"</span><span class="p">).</span><span class="n">Invoke</span><span class="p">(</span><span class="k">null</span><span class="p">,</span> <span class="k">new</span> <span class="kt">object</span><span class="p">[]</span> <span class="p">{</span> <span class="n">db</span><span class="p">,</span> <span class="n">viewModel</span> <span class="p">})</span> <span class="p">);</span>
<span class="n">InitializeViewBag</span><span class="p">();</span>
<span class="k">if</span> <span class="p">(</span><span class="n">result</span><span class="p">.</span><span class="n">Errors</span><span class="p">.</span><span class="n">Count</span><span class="p">()</span> <span class="p">></span> <span class="m">0</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">foreach</span> <span class="p">(</span><span class="kt">var</span> <span class="n">error</span> <span class="k">in</span> <span class="n">result</span><span class="p">.</span><span class="n">Errors</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">ModelState</span><span class="p">.</span><span class="n">AddModelError</span><span class="p">(</span><span class="s">""</span><span class="p">,</span> <span class="n">error</span><span class="p">);</span>
<span class="p">}</span>
<span class="c1">// use result.Model to send it to the view</span>
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="n">Json</span><span class="p">(</span><span class="k">new</span> <span class="p">{</span> <span class="n">success</span> <span class="p">=</span> <span class="k">false</span><span class="p">,</span> <span class="n">view</span> <span class="p">=</span> <span class="n">RenderHelper</span><span class="p">.</span><span class="n">RenderHelper</span><span class="p">.</span><span class="n">PartialViewToString</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="n">Views</span><span class="p">[</span><span class="n">ViewName</span><span class="p">.</span><span class="n">FailedSave</span><span class="p">],</span> <span class="n">viewModel</span><span class="p">)</span> <span class="p">});</span>
<span class="p">}</span>
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="n">Json</span><span class="p">(</span><span class="k">new</span> <span class="p">{</span> <span class="n">success</span> <span class="p">=</span> <span class="k">true</span><span class="p">,</span> <span class="n">view</span> <span class="p">=</span> <span class="n">RenderHelper</span><span class="p">.</span><span class="n">RenderHelper</span><span class="p">.</span><span class="n">PartialViewToString</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="n">Views</span><span class="p">[</span><span class="n">ViewName</span><span class="p">.</span><span class="n">SuccessSave</span><span class="p">],</span> <span class="n">viewModel</span><span class="p">)</span> <span class="p">});</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="n">InitializeViewBag</span><span class="p">();</span>
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="n">Json</span><span class="p">(</span><span class="k">new</span> <span class="p">{</span> <span class="n">success</span> <span class="p">=</span> <span class="k">false</span><span class="p">,</span> <span class="n">view</span> <span class="p">=</span> <span class="n">RenderHelper</span><span class="p">.</span><span class="n">RenderHelper</span><span class="p">.</span><span class="n">PartialViewToString</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="n">Views</span><span class="p">[</span><span class="n">ViewName</span><span class="p">.</span><span class="n">FailedSave</span><span class="p">],</span> <span class="n">viewModel</span><span class="p">)</span> <span class="p">});</span>
<span class="p">}</span>
<span class="c1">/// <summary></span>
<span class="c1">/// Get the detail page</span>
<span class="c1">/// </summary></span>
<span class="c1">/// <param name="id"></param></span>
<span class="c1">/// <returns>The detail view</returns></span>
<span class="k">public</span> <span class="n">ActionResult</span> <span class="nf">Detail</span><span class="p">(</span><span class="kt">string</span> <span class="n">id</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">using</span> <span class="p">(</span><span class="kt">var</span> <span class="n">db</span> <span class="p">=</span> <span class="k">new</span> <span class="n">TDataBaseContext</span><span class="p">())</span>
<span class="p">{</span>
<span class="n">InitializeViewBag</span><span class="p">();</span>
<span class="k">if</span> <span class="p">(</span><span class="n">Views</span><span class="p">[</span><span class="n">ViewName</span><span class="p">.</span><span class="n">Detail</span><span class="p">]</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">TModel</span> <span class="n">model</span> <span class="p">=</span> <span class="p">(</span><span class="n">TModel</span><span class="p">)</span><span class="k">typeof</span><span class="p">(</span><span class="n">TModel</span><span class="p">).</span><span class="n">GetMethod</span><span class="p">(</span><span class="s">"Get"</span><span class="p">).</span><span class="n">Invoke</span><span class="p">(</span><span class="k">null</span><span class="p">,</span> <span class="k">new</span> <span class="kt">object</span><span class="p">[]</span> <span class="p">{</span> <span class="n">db</span><span class="p">,</span> <span class="n">id</span> <span class="p">});</span>
<span class="k">return</span> <span class="nf">View</span><span class="p">(</span><span class="n">Views</span><span class="p">[</span><span class="n">ViewName</span><span class="p">.</span><span class="n">Detail</span><span class="p">],</span> <span class="n">model</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">else</span>
<span class="p">{</span>
<span class="k">return</span> <span class="nf">Index</span><span class="p">();</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="c1">/// <summary></span>
<span class="c1">/// Delete a list of models</span>
<span class="c1">/// </summary></span>
<span class="c1">/// <param name="ids"></param></span>
<span class="k">public</span> <span class="k">void</span> <span class="nf">Delete</span><span class="p">(</span><span class="n">List</span><span class="p"><</span><span class="kt">string</span><span class="p">></span> <span class="n">ids</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">using</span> <span class="p">(</span><span class="kt">var</span> <span class="n">db</span> <span class="p">=</span> <span class="k">new</span> <span class="n">TDataBaseContext</span><span class="p">())</span>
<span class="p">{</span>
<span class="kt">var</span> <span class="n">result</span> <span class="p">=</span> <span class="p">(</span><span class="n">List</span><span class="p"><</span><span class="kt">string</span><span class="p">>)</span><span class="k">typeof</span><span class="p">(</span><span class="n">TModel</span><span class="p">).</span><span class="n">GetMethod</span><span class="p">(</span><span class="s">"Delete"</span><span class="p">).</span><span class="n">Invoke</span><span class="p">(</span><span class="k">null</span><span class="p">,</span> <span class="k">new</span> <span class="kt">object</span><span class="p">[]</span> <span class="p">{</span> <span class="n">db</span><span class="p">,</span> <span class="n">ids</span> <span class="p">});</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">public</span> <span class="k">abstract</span> <span class="k">void</span> <span class="nf">InitializeViewBag</span><span class="p">();</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
</td></tr></table></div>
<p>Exemple model :</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="k">public</span> <span class="k">class</span> <span class="nc">Client</span> <span class="p">:</span> <span class="n">EpController</span><span class="p">.</span><span class="n">EpModel</span><span class="p"><</span><span class="n">Client</span><span class="p">,</span><span class="n">ClientViewModel</span><span class="p">,</span><span class="n">ClientListModel</span><span class="p">,</span><span class="n">ClientContext</span><span class="p">></span>
<span class="p">{</span>
<span class="k">public</span> <span class="kt">string</span> <span class="n">Id</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
<span class="k">public</span> <span class="kt">string</span> <span class="n">Name</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
<span class="k">public</span> <span class="kt">string</span> <span class="n">Email</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
<span class="k">public</span> <span class="kt">int</span> <span class="n">RoleId</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
<span class="k">public</span> <span class="k">override</span> <span class="n">List</span><span class="p"><</span><span class="n">ClientListModel</span><span class="p">></span> <span class="n">GetList</span><span class="p">(</span><span class="n">ClientContext</span> <span class="n">db</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="n">db</span><span class="p">.</span><span class="n">GetList</span><span class="p">();</span>
<span class="p">}</span>
<span class="k">public</span> <span class="k">override</span> <span class="n">EpResult</span><span class="p"><</span><span class="n">Client</span><span class="p">></span> <span class="n">Save</span><span class="p">(</span><span class="n">ClientContext</span> <span class="n">db</span><span class="p">,</span> <span class="n">Client</span> <span class="n">model</span><span class="p">)</span>
<span class="p">{</span>
<span class="c1">//do operations</span>
<span class="n">db</span><span class="p">.</span><span class="n">Save</span><span class="p">(</span><span class="n">model</span><span class="p">);</span>
<span class="k">return</span> <span class="k">new</span> <span class="n">EpResult</span><span class="p"><</span><span class="n">Client</span><span class="p">>()</span> <span class="p">{</span> <span class="n">Errors</span> <span class="p">=</span> <span class="k">null</span><span class="p">,</span> <span class="n">Model</span> <span class="p">=</span> <span class="n">model</span> <span class="p">};</span> <span class="c1">// return the errors and model</span>
<span class="p">}</span>
<span class="k">public</span> <span class="k">override</span> <span class="n">EpResult</span><span class="p"><</span><span class="n">ClientViewModel</span><span class="p">></span> <span class="n">Save</span><span class="p">(</span><span class="n">ClientContext</span> <span class="n">db</span><span class="p">,</span> <span class="n">ClientViewModel</span> <span class="n">viewModel</span><span class="p">)</span>
<span class="p">{</span>
<span class="c1">// do operations</span>
<span class="n">db</span><span class="p">.</span><span class="n">Save</span><span class="p">(</span><span class="n">viewModel</span><span class="p">);</span>
<span class="k">return</span> <span class="k">new</span> <span class="n">EpResult</span><span class="p"><</span><span class="n">ClientViewModel</span><span class="p">>()</span> <span class="p">{</span> <span class="n">Errors</span> <span class="p">=</span> <span class="k">null</span><span class="p">,</span> <span class="n">Model</span> <span class="p">=</span> <span class="n">viewModel</span> <span class="p">};</span> <span class="c1">// return the errors and model</span>
<span class="p">}</span>
<span class="k">public</span> <span class="k">override</span> <span class="n">List</span><span class="p"><</span><span class="kt">string</span><span class="p">></span> <span class="n">Delete</span><span class="p">(</span><span class="n">ClientContext</span> <span class="n">db</span><span class="p">,</span> <span class="n">List</span><span class="p"><</span><span class="kt">string</span><span class="p">></span> <span class="n">ids</span><span class="p">)</span>
<span class="p">{</span>
<span class="c1">// do operations</span>
<span class="n">db</span><span class="p">.</span><span class="n">Delete</span><span class="p">(</span><span class="n">ids</span><span class="p">);</span>
<span class="k">return</span> <span class="k">new</span> <span class="n">List</span><span class="p"><</span><span class="kt">string</span><span class="p">>();</span> <span class="c1">// return the errors</span>
<span class="p">}</span>
<span class="k">public</span> <span class="k">override</span> <span class="n">Client</span> <span class="nf">Get</span><span class="p">(</span><span class="n">ClientContext</span> <span class="n">db</span><span class="p">,</span> <span class="kt">string</span> <span class="n">id</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">throw</span> <span class="k">new</span> <span class="nf">NotImplementedException</span><span class="p">();</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">public</span> <span class="k">class</span> <span class="nc">ClientListModel</span>
<span class="p">{</span>
<span class="k">public</span> <span class="kt">string</span> <span class="n">Id</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
<span class="k">public</span> <span class="kt">string</span> <span class="n">Name</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
<span class="k">public</span> <span class="kt">string</span> <span class="n">Email</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
<span class="k">public</span> <span class="kt">string</span> <span class="n">Role</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
<span class="p">}</span>
<span class="k">public</span> <span class="k">class</span> <span class="nc">ClientViewModel</span>
<span class="p">{</span>
<span class="k">public</span> <span class="kt">string</span> <span class="n">Id</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
<span class="k">public</span> <span class="kt">string</span> <span class="n">Name</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
<span class="k">public</span> <span class="kt">string</span> <span class="n">Email</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
<span class="k">public</span> <span class="kt">string</span> <span class="n">Role</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
<span class="p">}</span>
</pre></div>
</td></tr></table></div>
<p>Exemple de controller :</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="k">namespace</span> <span class="nn">EpControllerTemplate.Controllers</span>
<span class="p">{</span>
<span class="k">public</span> <span class="k">class</span> <span class="nc">Views</span>
<span class="p">{</span>
<span class="k">public</span> <span class="k">static</span> <span class="n">Dictionary</span><span class="p"><</span><span class="n">EpController</span><span class="p">.</span><span class="n">ViewName</span><span class="p">,</span> <span class="kt">string</span><span class="p">></span> <span class="n">ClientViews</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Dictionary</span><span class="p"><</span><span class="n">EpController</span><span class="p">.</span><span class="n">ViewName</span><span class="p">,</span> <span class="kt">string</span><span class="p">>();</span>
<span class="k">static</span> <span class="nf">Views</span><span class="p">()</span>
<span class="p">{</span>
<span class="n">ClientViews</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">EpController</span><span class="p">.</span><span class="n">ViewName</span><span class="p">.</span><span class="n">Detail</span><span class="p">,</span> <span class="s">"_ClientDetail"</span><span class="p">);</span>
<span class="n">ClientViews</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">EpController</span><span class="p">.</span><span class="n">ViewName</span><span class="p">.</span><span class="n">List</span><span class="p">,</span> <span class="s">"Index"</span> <span class="p">);</span>
<span class="n">ClientViews</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">EpController</span><span class="p">.</span><span class="n">ViewName</span><span class="p">.</span><span class="n">SuccessSave</span><span class="p">,</span> <span class="s">"Index"</span><span class="p">);</span>
<span class="n">ClientViews</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">EpController</span><span class="p">.</span><span class="n">ViewName</span><span class="p">.</span><span class="n">FailedSave</span><span class="p">,</span> <span class="s">"_ClientDetail"</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">public</span> <span class="k">class</span> <span class="nc">ClientController</span> <span class="p">:</span> <span class="n">EpController</span><span class="p">.</span><span class="n">EpController</span><span class="p"><</span><span class="n">Client</span><span class="p">,</span> <span class="n">ClientViewModel</span><span class="p">,</span> <span class="n">ClientListModel</span><span class="p">,</span> <span class="n">ClientContext</span><span class="p">></span>
<span class="p">{</span>
<span class="k">public</span> <span class="nf">ClientController</span><span class="p">()</span> <span class="p">:</span> <span class="k">base</span><span class="p">(</span><span class="n">Views</span><span class="p">.</span><span class="n">ClientViews</span><span class="p">)</span>
<span class="p">{</span>
<span class="p">}</span>
<span class="k">public</span> <span class="k">override</span> <span class="k">void</span> <span class="nf">InitializeViewBag</span><span class="p">()</span>
<span class="p">{</span>
<span class="n">ViewBag</span><span class="p">.</span><span class="n">SomeData</span> <span class="p">=</span> <span class="s">"Some data"</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
</td></tr></table></div>
<p>Merci d’avance pour vos commentaires <img alt=":)" src="/static/smileys/smile.png"></p>Problème d'entité avec EntityFramework et MySQL, message #1575092017-07-23T21:21:47+02:00artragis/@artragishttps://zestedesavoir.com/forums/sujet/9012/probleme-dentite-avec-entityframework-et-mysql/?page=1#p157509<p>Bien vu, en effet <img alt=":)" src="/static/smileys/smile.png"></p>Problème d'entité avec EntityFramework et MySQL, message #1575042017-07-23T20:43:12+02:00JordanSocyalize/@JordanSocyalizehttps://zestedesavoir.com/forums/sujet/9012/probleme-dentite-avec-entityframework-et-mysql/?page=1#p157504<p>Salut, je viens à l’instant de trouver le problème, la résolution du problème dans mon cas était de remplacer:</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="k">public</span> <span class="kt">uint</span> <span class="n">Id</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</pre></div>
</td></tr></table></div>
<p>par </p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="k">public</span> <span class="kt">int</span> <span class="n">Id</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</pre></div>
</td></tr></table></div>Problème d'entité avec EntityFramework et MySQL, message #1575022017-07-23T20:23:31+02:00artragis/@artragishttps://zestedesavoir.com/forums/sujet/9012/probleme-dentite-avec-entityframework-et-mysql/?page=1#p157502<p>Salut,</p>
<p>La première chose que je te conseille c’est d’ajouter l’annotation <code>[DatabaseGenerated(DatabaseGeneratedOption.IDENTITY)]</code> à ton champ ID pour t’assurer que ça soit bien pris en compte. </p>
<p>Ensuite, peux-tu vérifier que la classe <code>User</code> que tu utilises dans ton <code>ApplicationDbContext</code> est bien la classe perso que tu as créée et non une classe de C# que tu aurais importée par mégarde?</p>Problème d'entité avec EntityFramework et MySQL, message #1574982017-07-23T19:17:54+02:00JordanSocyalize/@JordanSocyalizehttps://zestedesavoir.com/forums/sujet/9012/probleme-dentite-avec-entityframework-et-mysql/?page=1#p157498<p>Bonjour,</p>
<p>J’ai un problème lors de la compilation de mon code, on me retourne une erreur:</p>
<blockquote>
<p>JabboCMS.Models.User: : EntityType ’User’ has no key defined. Define the key for this EntityType.</p>
<p>Users: EntityType: EntitySet ’Users’ is based on type ’User’ that has no keys defined.</p>
</blockquote>
<p>Sur cette ligne:</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="na"> [Authorize]</span>
<span class="k">public</span> <span class="k">class</span> <span class="nc">HomeController</span> <span class="p">:</span> <span class="n">Controller</span>
<span class="p">{</span>
<span class="k">private</span> <span class="n">ApplicationDbContext</span> <span class="n">database</span> <span class="p">=</span> <span class="n">ApplicationDbContext</span><span class="p">.</span><span class="n">Create</span><span class="p">();</span>
<span class="c1">// GET: Home/Index</span>
<span class="na"> [AllowAnonymous]</span>
<span class="k">public</span> <span class="n">ActionResult</span> <span class="nf">Index</span><span class="p">()</span>
<span class="p">{</span>
<span class="n">List</span><span class="p"><</span><span class="n">User</span><span class="p">></span> <span class="n">users</span> <span class="p">=</span> <span class="n">database</span><span class="p">.</span><span class="n">Users</span><span class="p">.</span><span class="n">ToList</span><span class="p">();</span> <span class="c1">// Erreur apparue ici</span>
<span class="k">return</span> <span class="nf">View</span><span class="p">();</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
</td></tr></table></div>
<p>Mon modèle ressemble à ceci:</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="na"> [Table("users")]</span>
<span class="k">public</span> <span class="k">class</span> <span class="nc">User</span>
<span class="p">{</span>
<span class="na"> [Column("id")]</span>
<span class="na"> [Key]</span>
<span class="k">public</span> <span class="kt">uint</span> <span class="n">Id</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
<span class="na"> [Column("username")]</span>
<span class="k">public</span> <span class="kt">string</span> <span class="n">Username</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
<span class="p">}</span>
</pre></div>
</td></tr></table></div>
<p>Et mon context à ceci:</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="na"> [DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]</span>
<span class="k">public</span> <span class="k">class</span> <span class="nc">ApplicationDbContext</span> <span class="p">:</span> <span class="n">DbContext</span>
<span class="p">{</span>
<span class="k">public</span> <span class="nf">ApplicationDbContext</span><span class="p">()</span> <span class="p">:</span> <span class="k">base</span><span class="p">(</span><span class="s">"MySQL"</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">this</span><span class="p">.</span><span class="n">Configuration</span><span class="p">.</span><span class="n">LazyLoadingEnabled</span> <span class="p">=</span> <span class="k">false</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">public</span> <span class="n">DbSet</span><span class="p"><</span><span class="n">User</span><span class="p">></span> <span class="n">Users</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
<span class="k">public</span> <span class="k">static</span> <span class="n">ApplicationDbContext</span> <span class="nf">Create</span><span class="p">()</span>
<span class="p">{</span>
<span class="k">return</span> <span class="k">new</span> <span class="nf">ApplicationDbContext</span><span class="p">();</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
</td></tr></table></div>
<p>Je vous avoue que pour le coup je suis totalement perdu, après de multiple recherches, j’ai l’impression d’avoir bien fait, mais apparemment visual studio ne l’entends pas de cette oreille.</p>Récupérer le nom de domaine/login de l'utilisateur, message #991152016-02-16T17:40:54+01:00Teillo/@Teillohttps://zestedesavoir.com/forums/sujet/5398/recuperer-le-nom-de-domainelogin-de-lutilisateur/?page=1#p99115<p>EDIT DE LA MORT : On peut utiliser firefox :DDDDDDD il suffit de faire ça :</p>
<p><a href="http://stackoverflow.com/questions/733237/integrated-windows-authentication-with-iis-firefox-and-sql-server">http://stackoverflow.com/questions/733237/integrated-windows-authentication-with-iis-firefox-and-sql-server</a></p>Récupérer le nom de domaine/login de l'utilisateur, message #991082016-02-16T17:17:20+01:00Teillo/@Teillohttps://zestedesavoir.com/forums/sujet/5398/recuperer-le-nom-de-domainelogin-de-lutilisateur/?page=1#p99108<p>Voilà comment on fait :</p>
<p>dans Web.config : </p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5
6
7</pre></div></td><td class="code"><div class="codehilite"><pre> <anonymousIdentification enabled="false"/>
<authentication mode="Windows" />
<identity impersonate ="true"/>
<authorization>
<allow users="*"/>
<deny users="?"/>
</authorization>
</pre></div>
</td></tr></table>
<p>et dans le code :</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="codehilite"><pre> <span class="kt">string</span> <span class="n">nom_createur</span> <span class="p">=</span> <span class="n">System</span><span class="p">.</span><span class="n">Security</span><span class="p">.</span><span class="n">Principal</span><span class="p">.</span><span class="n">WindowsIdentity</span><span class="p">.</span><span class="n">GetCurrent</span><span class="p">().</span><span class="n">Name</span><span class="p">;</span>
</pre></div>
</td></tr></table>
<p>ou, au choix :</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="codehilite"><pre>string nom_createur = Request.ServerVariables["LOGON_USER"];
</pre></div>
</td></tr></table>
<p>EVIDEMMENT "nom_createur" n'est pas nécessaire, c'est juste pour le mettre quelque part.</p>
<p>Simple vous dites ? oui c'est vrai. mais pour marcher, cette fonctionnalité implique un sacrifice : vous DEVEZ utiliser internet explorer (brrrrr :s)</p>Récupérer le nom de domaine/login de l'utilisateur, message #991022016-02-16T16:47:59+01:00Teillo/@Teillohttps://zestedesavoir.com/forums/sujet/5398/recuperer-le-nom-de-domainelogin-de-lutilisateur/?page=1#p99102<p>Pour mon projet, j'essaie maintenant de récupérer nom de domaine/login de l'utilisateur de façon… correcte; c'est à dire que jusqu'ici j'avais mis </p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="codehilite"><pre><span class="n">System</span><span class="p">.</span><span class="n">Security</span><span class="p">.</span><span class="n">Principal</span><span class="p">.</span><span class="n">WindowsIdentity</span><span class="p">.</span><span class="n">GetCurrent</span><span class="p">().</span><span class="n">Name</span>
</pre></div>
</td></tr></table>
<p>dans mon code, qui retourne effectivement domaine/user mais pas celui attendu <img alt=":D" src="/static/smileys/heureux.png"> </p>
<p>En l'état, je récupère NomDeLaMachine\CompteAdminLocal (?) qui ressemble à "UPWALAJAC\Admin" alors que j'attend "SI\Teillo" m'voyez ?</p>
<p>Naturellement, j'ai cherché et trouvé "WindowsAuthentication" mais après quand je le mets, il faut que j'utilise des logins et des mots de passe <img alt=":(" src="/static/smileys/triste.png"></p>
<p>j'ai voulu utiliser <a href="http://stackoverflow.com/questions/1267071/how-to-get-windows-user-name-when-identity-impersonate-true-in-asp-net">ce lien</a> mais même si mon WebConfig est le même, il faut que je renseigne username/mdp !</p>
<p>Quelqu'un a déjà fait ça ?</p>Déploiement d'une application avec WebDeploy, message #990872016-02-16T15:52:12+01:00Teillo/@Teillohttps://zestedesavoir.com/forums/sujet/5387/deploiement-dune-application-avec-webdeploy/?page=1#p99087<p>mais je t'en prie <img alt=":)" src="/static/smileys/smile.png"> </p>Déploiement d'une application avec WebDeploy, message #990772016-02-16T14:57:43+01:00artragis/@artragishttps://zestedesavoir.com/forums/sujet/5387/deploiement-dune-application-avec-webdeploy/?page=1#p99077<p>Désolé de ne pas avoir pu t'aider plus, je dois avouer que les erreurs de winserver sont parfois absconses.</p>Déploiement d'une application avec WebDeploy, message #990732016-02-16T14:30:02+01:00Teillo/@Teillohttps://zestedesavoir.com/forums/sujet/5387/deploiement-dune-application-avec-webdeploy/?page=1#p99073<p>Bon, j'ai réglé mon problème tout seul, apparement il fallait que je réactive les fonctionnalités iis et que je reboote</p>Déploiement d'une application avec WebDeploy, message #990512016-02-16T11:06:40+01:00Teillo/@Teillohttps://zestedesavoir.com/forums/sujet/5387/deploiement-dune-application-avec-webdeploy/?page=1#p99051<p>J'ai un peu fouillé, j'ai ça aussi :</p>
<p><figure><img alt="" src="http://image.noelshack.com/fichiers/2016/07/1455617183-stack-q2.png"><figcaption>Image utilisateur</figcaption></figure></p>Déploiement d'une application avec WebDeploy, message #989272016-02-15T14:56:26+01:00Teillo/@Teillohttps://zestedesavoir.com/forums/sujet/5387/deploiement-dune-application-avec-webdeploy/?page=1#p98927<p>Voilà, c'est pour ça que je pense qu'il faut que je définisse le document par défaut, et là je sais pas quoi faire, si j'essaie de mettre le fichier .cshtml ça me renvoie une erreur 500</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4</pre></div></td><td class="code"><div class="codehilite"><pre>HTTP Error 500.19 - Internal Server Error
Impossible d'accéder à la page que vous avez demandée, car les données de configuration
connexes relatives à la page ne sont pas valides.
</pre></div>
</td></tr></table>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4</pre></div></td><td class="code"><div class="codehilite"><pre>Cette section de configuration ne peut pas être utilisée au niveau de ce chemin d'accès.
Cela se produit lorsque la section est verrouillée à un niveau parent.
Le verrouillage est soit défini par défaut (overrideModeDefault="Deny"), soit défini
explicitement par une balise d'emplacement avec overrideMode="Deny" ou allowOverride="false" hérité.
</pre></div>
</td></tr></table>
<p>(en même je trouverais bizzare qu'on accède directement aux fichiers)</p>
<p>du coup je sais quoi mettre.</p>Déploiement d'une application avec WebDeploy, message #989242016-02-15T14:41:12+01:00Drulac/@Drulachttps://zestedesavoir.com/forums/sujet/5387/deploiement-dune-application-avec-webdeploy/?page=1#p98924<p>De ce que j'ai compris de tes messages d'erreurs :
le navigateur fait une requète sur l'index :</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="codehilite"><pre>::1 GET /Index - 80 - ::1 Mozilla/5.0+(infos sur le navigateur) - 404 0 2 0
</pre></div>
</td></tr></table>
<p>mais il ne trouve pas de page index -> 404. Il devrait afficher la liste des fichiers du répertoire, mais c'est bloqué -> 403.</p>Déploiement d'une application avec WebDeploy, message #989182016-02-15T14:32:22+01:00Teillo/@Teillohttps://zestedesavoir.com/forums/sujet/5387/deploiement-dune-application-avec-webdeploy/?page=1#p98918<p>Bon, quand je vais sur le site, j'ai cette erreur :</p>
<p>"Aucun document par défaut n'est configuré pour l'URL demandée et l'exploration de répertoires n'est pas activée sur le serveur."</p>
<p>et dans mes logs, quand j'essaie d'accéder au site, je trouve ça :</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2</pre></div></td><td class="code"><div class="codehilite"><pre>::1 GET /Index - 80 - ::1 Mozilla/5.0+(infos sur le navigateur) - 404 0 2 0
::1 GET / - 80 - ::1 Mozilla/5.0+(//) - 403 14 0 0
</pre></div>
</td></tr></table>Déploiement d'une application avec WebDeploy, message #988912016-02-15T13:15:19+01:00artragis/@artragishttps://zestedesavoir.com/forums/sujet/5387/deploiement-dune-application-avec-webdeploy/?page=1#p98891<p>Très souvent les logs sont d'un grand secours pour gérer ça.</p>Déploiement d'une application avec WebDeploy, message #988852016-02-15T12:45:51+01:00Teillo/@Teillohttps://zestedesavoir.com/forums/sujet/5387/deploiement-dune-application-avec-webdeploy/?page=1#p98885<p>j'utilise le compte admin sur le serveur, qui (devrait) avoir tous les droits, mais peut-être que tu as raison; comment je peux vérifier ?</p>Déploiement d'une application avec WebDeploy, message #988832016-02-15T12:31:49+01:00Drulac/@Drulachttps://zestedesavoir.com/forums/sujet/5387/deploiement-dune-application-avec-webdeploy/?page=1#p98883<p>Je pense que le serveur n'as pas les droits de lecture sur les fichiers concernés, c'est souvent la source d'erreur 403.</p>