<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>

<channel>
	<title>dervalp.com</title>
	<atom:link href="http://www.fr.dervalp.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.fr.dervalp.com</link>
	<description>Just another WordPress weblog</description>
	<pubDate>Tue, 08 Jun 2010 02:07:28 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>C# - Encore quelques questions</title>
		<link>http://www.fr.dervalp.com/?p=349</link>
		<comments>http://www.fr.dervalp.com/?p=349#comments</comments>
		<pubDate>Tue, 08 Jun 2010 00:37:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Rèussir son site web !]]></category>

		<guid isPermaLink="false">http://www.fr.dervalp.com/?p=349</guid>
		<description><![CDATA[Quelle est la différence entre un thread et un process ?
Un process peut avoir plusieurs thread qui partage les mêmes espaces d&#8217;adressage gloables et les mêmes espace d&#8217;adressage avec d&#8217;autres threads qui tournent sur ce même process. Ils peuvent donc intéragir sur les mêmes adressage de données en même temps. Les processes ne partagent pas [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Quelle est la différence entre un thread et un process ?</strong></p>
<p>Un process peut avoir plusieurs thread qui partage les mêmes espaces d&#8217;adressage gloables et les mêmes espace d&#8217;adressage avec d&#8217;autres threads qui tournent sur ce même process. Ils peuvent donc intéragir sur les mêmes adressage de données en même temps. Les processes ne partagent pas les mêmes espaces d&#8217;adressage et un mécanisme différent doit être utilisé si ils doivent partager les mêmes données. Un thread ne partage pas sa pile d&#8217;éxécution.</p>
<p>Si l&#8217;on considère une application &#8220;word&#8221; c&#8217;elle-ci est un process, le auto-save et autres features qui tournent en background sont elles des threads de ce process qui opère tous sur les mêmes données (le document).</p>
<p>1. Le process à son propre espace mémoire d&#8217;adressage. Les threads eux partagent le même espace mémoire d&#8217;adressage du process qui les a créés.</p>
<p>2. Un Thread a un accès direct à son segment de données de son process. Le process lui à sa propre copie du segment de données de son process parent.</p>
<p>3. Les threads peuvent communiques entre eux pour un même process. Les process doivent utiliser une communication interprocess afin de communique avec les process de sa famille.</p>
<p>4. Un thread est léger (pas d&#8217;overhead), un process est lourd (énormément d&#8217;overhead).</p>
<p>5. Des nouveaux threads sont faciles à créer, des nouveaus process ont besoin de la duplication d&#8217;un process parent.</p>
<p>6. Les threads peuvent exercer un contrôle quasi total sur d&#8217;autres thread du même process. Un process ne peut exercer son contrôle que sur ces process enfants.</p>
<p>7. Des changements sur le thread principal (priorité, annulation) peut affecter le comportement des autres threads de ce process. Un changement sur un process ne cause pas de changement sur ses process fils.<br />
<strong>Qu&#8217;est ce qu&#8217;un service windows et en quoi son temps de vie diffère d&#8217;un exécutable (EXE) ?</strong></p>
<p>Un service est démarrer avant que vous vous loggiez sur un système tandis qu&#8217;un exécutable a besoin que vous soyez logger pour fonctionner. Une service windows n&#8217;a pas d&#8217;interface d&#8217;utilisation, un exécutabel en possède générallement un. Les services windows sont générallement utilisés par des serveurs pour des applications qui ont une longue durée de vie.</p>
<p><strong>Quel est la valeur  maximal d&#8217;espace mémoire qu&#8217;un simple process sur Windows peut adresser et en quoi est-ce différent de la valeur maximal de mémoire virtuel pour le système ?</strong></p>
<p>Les process accèdent à des espaces mémoires virtuels, pas physiques. Les applications n&#8217;accèdent jamais à la RAM directement, elles utilisent l&#8217;inteface de gestion de mémoire du processeur.</p>
<p>Les valeurs d&#8217;adressage mémoire maximales dépendent des versions de windows utilisées et comment le programme a été compilé.</p>
<p>Tous les process 32bit sur Windows 32bit ont 4 gigas d&#8217;espace mémoire d&#8217;adressage. Les 2 gigas du dessus sont commun à tous les process et sont utilisés par le système. Les 2gb du dessous sont privée à chaque process et son inacesseble à tous les autres. A moins que le programme soit compilé pour utilisées un large espace mémoire, sa partie privée s&#8217;élève alors à 3gb.</p>
<p>Pour les processeurs 32bit sur Windows 64, chaque process à 2gb d&#8217;espace mémoire privé et 4gb si il est compilé en vue d&#8217;un large espase mémoire.</p>
<p>Pour les processeurs 64bits sur Windows 64, chaque process à 8TB d&#8217;espace mémoire privé si compilé pour utilisé un large espace mémoire. Les autres utilisent 2GB d&#8217;espace mémoire.</p>
<p>Ceci est complètement indépendant du nombre de RAM sur le système ou du Pagefile. Le system fait le lien entre l&#8217;espace mémoire physique et l&#8217;espace mémoire virtuel selon la disponibilité et ses besoins.</p>
<p>A chaque instant les données des l&#8217;espaces de mémoire virtuel pourrait être stoquée sur la RAM, sur le disque ou les deux. Tout ceci est totalement transparent à toutes applications. Les données souvent accédées seront stoquées dans la RAM, les autres sur le disque.</p>
<p><strong>Quel est la différence entre un exe et une dll ?</strong></p>
<p>Un exe est un programme exécutabel. Une dll peut être loader et utiliser par un programme dynamiquement. De manière simple c&#8217;est un répertoire de code pour des programmes. Plusieurs programmes vont utiliser les mêmes dll à la place d&#8217;avoir ce code dans leurs propres ficiers, cela permet de diminuer l&#8217;espace mémoire. Un synonyme est libraire de classe.</p>
<p>Un dll n&#8217;a pas de fonction principal, un ex en a un.</p>
<p>Une Dll est inprocess, composants et consomateurs de la dll partageront le mêmes espace mémoire. Un exe est outprocess, il fonctionnera avec son propre espace mémoire.</p>
<p><strong>Auel est la différence type entre fortement lié (strongly typing) et type faiblement lié (weak-typing), lequel préférer et pourquoi ?</strong></p>
<p>Le typage fort est préféré car il ne laisse pas la place à un typage ambigu ou incorrect. Les erreurs sur les typages fort seront intercepté à la compilation tandis que le typage faible sera intercepté lors de l&#8217;exécution (ce que vous ne voulez généralement pas). Par exemple un Array d&#8217;objet et un typage faible car il permet de lui ajouter un string ou int. Il y a un risque lors de l&#8217;éxécution que vous parcourez votre Array et que vous recevez un type qui vous n&#8217;aviez pas prévu.  Une List&lt;string&gt; est un objet à typage fort car il ne permet de jouer qu&#8217;avec une liste de string et rien d&#8217;autre. MaListString.Add(5) sera reconnu à la compilation, tandis que le monArray.add(&#8221;unstring&#8221;), si ce string ce trouve à la première possition de votre array et que vous écrivez, int unchiffre = Convert.ToInt32(array[0]); vous n&#8217;aurrez une erreur qu&#8217;à l&#8217;éxécution.</p>
<p><strong>Quel sont les components qui sont délivrés avec Windows Server Family ?</strong></p>
<p>System.WEB.UI.Page, Syste.Windows.Forms.Fom, System.ComponentModel.Container. L&#8217;essence du développement est de ne pas développer un composant qui existe déjà sur le marché pour peu d&#8217;argent et même parfois gratuitement. Il vaut générallement mieux utiliser un composant tier, testé plutôt que d&#8217;en créer un en entier. Presque toutes les classes de .NET sont des composants, ils peuvent être réutilisés, ils sont sous version et ils peuvent être compilé dans une dll. Une définition plus stricte d&#8217;un composant serait en gros, une &#8220;surface&#8221; dans laquelle vous déposeriez une instance d&#8217;un objet dans Visual Studio .NET, vous pourriez alors lui définir ses propriétés et des gestionnaires d&#8217;évênements sur ceux-ci visuellement. Ils sont des &#8220;designable component&#8221;, ceux-ci devront absolument implémenter l&#8217;interface IComponent. Ces objets de &#8220;design&#8221; n&#8217;ont pas forcément besoin d&#8217;une surface, les classes qui dériveront de System.Web.UI.Page et System.Windows.Forms.Form seront aussi bien des contrôlles que des composants. L&#8217;existence de component impute l&#8217;existence de conteneur. En .NET, ASP.NET Webforms et Windows Forms sont des composants conteneur visuel. Les conteneurs jouent un rôle important dans la gestion des components. En particulier tout conteneur implémente la méthode IDisposable, ce qui veut dire qu&#8217;ils ont la méthode dispose permettant de déliverer les ressources comme un fichier ouvert un gestionnaire d&#8217;évênement. Dans leurs méthodes dispose, ils devront appelers les méthodes Dispose de tous leurs compontents.</p>
<p>La suite un autre jour&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fr.dervalp.com/?feed=rss2&amp;p=349</wfw:commentRss>
		</item>
		<item>
		<title>Could not load file or assembly &#8216;Aspose.Pdf&#8217; or one of its dependencies. The parameter is incorrect. (Exception from HRESULT: 0&#215;80070057 (E_INVALIDARG))</title>
		<link>http://www.fr.dervalp.com/?p=347</link>
		<comments>http://www.fr.dervalp.com/?p=347#comments</comments>
		<pubDate>Tue, 27 Apr 2010 18:59:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Rèussir son site web !]]></category>

		<category><![CDATA[ASP.NET]]></category>

		<category><![CDATA[C#]]></category>

		<category><![CDATA[COULD NOT LOAD]]></category>

		<category><![CDATA[dll]]></category>

		<guid isPermaLink="false">http://www.fr.dervalp.com/?p=347</guid>
		<description><![CDATA[Erreur étrange aujourd&#8217;hui :
Après un ècran bleu et en redèmarrant mon ordi et ensuite ma solution, je recevais l&#8217;erreur suivante :
Could not load file or assembly &#8216;Aspose.Pdf&#8217; or one of its dependencies. The parameter is incorrect. (Exception from HRESULT: 0&#215;80070057 (E_INVALIDARG))
Manifestement un problème de cache vu que la solution n&#8217;avait pas changè. Si comme moi [...]]]></description>
			<content:encoded><![CDATA[<p>Erreur étrange aujourd&#8217;hui :</p>
<p>Après un ècran bleu et en redèmarrant mon ordi et ensuite ma solution, je recevais l&#8217;erreur suivante :</p>
<p><em>Could not load file or assembly &#8216;Aspose.Pdf&#8217; or one of its dependencies. The parameter is incorrect. (Exception from HRESULT: 0&#215;80070057 (E_INVALIDARG))</em></p>
<p>Manifestement un problème de cache vu que la solution n&#8217;avait pas changè. Si comme moi vous roulez sur Windows 7 sur un utilisateur normal mais avec visual studio qui tourne en administrateur, alors vous devrez supprimer tout ce qui se trouve dans le rèpertoire suivant :</p>
<p>C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET Files</p>
<p>Relancez votre solution et normalement l&#8217;erreur devrait partir.</p>
<p>J&#8217;espère que cela vous aidera&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fr.dervalp.com/?feed=rss2&amp;p=347</wfw:commentRss>
		</item>
		<item>
		<title>ASP.NET : Pour une meilleure compréhension du Viewstate</title>
		<link>http://www.fr.dervalp.com/?p=344</link>
		<comments>http://www.fr.dervalp.com/?p=344#comments</comments>
		<pubDate>Tue, 23 Mar 2010 14:45:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[ASP.NET]]></category>

		<category><![CDATA[ViewState]]></category>

		<guid isPermaLink="false">http://www.fr.dervalp.com/?p=344</guid>
		<description><![CDATA[Si comme moi, vos clients ne sont pas encore tous passés à l&#8217;ASP.NET MVC, vous devrez donc jouer avec l&#8217;ASP.NET classique et par conséquent, avec le Viewstate. Ayant travaillé ces derniers temps principalement en ASP.NET MVC et devant me remettre à l&#8217;ASP.NET simple, je me suis dit qu&#8217;une petite revue sur ce qu&#8217;est le ViewState [...]]]></description>
			<content:encoded><![CDATA[<p>Si comme moi, vos clients ne sont pas encore tous passés à l&#8217;ASP.NET MVC, vous devrez donc jouer avec l&#8217;ASP.NET classique et par conséquent, avec le Viewstate. Ayant travaillé ces derniers temps principalement en ASP.NET MVC et devant me remettre à l&#8217;ASP.NET simple, je me suis dit qu&#8217;une petite revue sur ce qu&#8217;est le ViewState ne me ferait pas de tort. Je me suis alors souvenu d&#8217;un très bon article paru sur dotnetguru écrit par  Frédéric De Lène Mirouze, le voici : <a href="http://www.dotnetguru.org/articles/dossiers/viewstate/viewstate.htm">http://www.dotnetguru.org/articles/dossiers/viewstate/viewstate.htm</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.fr.dervalp.com/?feed=rss2&amp;p=344</wfw:commentRss>
		</item>
		<item>
		<title>ASP.NET MVC2 - Le modèle et la vue fortement liée</title>
		<link>http://www.fr.dervalp.com/?p=301</link>
		<comments>http://www.fr.dervalp.com/?p=301#comments</comments>
		<pubDate>Mon, 22 Mar 2010 00:06:42 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[ASP.NET MVC]]></category>

		<category><![CDATA[ASP.NET]]></category>

		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://www.fr.dervalp.com/?p=301</guid>
		<description><![CDATA[Article prenant part à une série d&#8217;articles reliés à l&#8217;ASP.NET MVC :
ASP.NET MVC2 -  Introduction
ASP.NET MVC2 - Votre première application
ASP.NET MVC2 - Le modèle et la vue fortement liée
Le modèle :
Pour expliquer la notion de modèle, je reprendrai l’exemple de Mr Steven Sanderson.
Voici le contexte :
Votre amis organise une soirée et voudrait que vous [...]]]></description>
			<content:encoded><![CDATA[<p>Article prenant part à une série d&#8217;articles reliés à l&#8217;ASP.NET MVC :</p>
<p><a href="../?p=214">ASP.NET MVC2 -  Introduction</a></p>
<p><a href="http://www.fr.dervalp.com/?p=259">ASP.NET MVC2 - Votre première application</a></p>
<p>ASP.NET MVC2 - Le modèle et la vue fortement liée</p>
<p><strong>Le modèle :</strong></p>
<p>Pour expliquer la notion de modèle, je reprendrai l’exemple de Mr Steven Sanderson.</p>
<p>Voici le contexte :</p>
<p>Votre amis organise une soirée et voudrait que vous créiez un site qui permette aux invités de répondre via l&#8217;intermédiaire d&#8217;un formulaire envoyant un message électronique.</p>
<p>Cette application devra :</p>
<p>Afficher les informations concernant la soirée par une page Index.<br />
Posséder un formulaire où l’invité peut entrer ses coordonnées et prévenir si il s’y rend ou pas.<br />
Envoyer un email détaillé de ces invitations à l’organisateur.</p>
<p>Reprenons noter page créée précédemment (voir <a href="http://www.fr.dervalp.com/?p=259">ASP.NET MVC2 - Votre première  application</a>) dans la vue index et rajoutons-y quelques informations :</p>
<p style="text-align: center;"><img class="size-full wp-image-302  aligncenter" title="model3_01" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/model3_01.png" alt="model3_01" width="683" height="310" /></p>
<p>Voici le résultat :</p>
<p style="text-align: center;"><img class="size-full wp-image-303  aligncenter" title="model3_01bis" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/model3_01bis.png" alt="model3_01bis" width="579" height="177" /></p>
<p>Voici donc notre vue incluant un lien, si nous cliquons sur celui-ci, nous recevons une erreur 404. Ceci est tout à fait normal vu que nous n’avons pas d’action portant ce nom dans ce controller.</p>
<p>Vous remarquez que contrairement à l’ASP.NET classique, le lien ne correspond pas à un fichier se trouvant sur le serveur mais à une configuration de votre sytème de routing . Celui-ci vous aidera à vous diriger vers une action comprise dans un controller.</p>
<p>Chaque action aura automatiquement sa propre URL. Vous n’avez donc pas besoin de créer une page ou une classe pour chaque lien.</p>
<p>En faisant un view source du code générer par la méthode action link, vous voyez que le résultat est un html propre :</p>
<p>&lt;a href=&#8221;/Home/SEND&#8221;&gt;Inscris-toi maintenant&lt;/a&gt;</p>
<p>En effet, ActionLink est l’un des composants permettant la génération d&#8217;HTML à partir de la class « helper » html compris dans le framework ASP.NET MVC. C’est dans cette classe  que vous trouverez les méthodes pour générer vos textbox, textarea,  checkbox,…</p>
<p>NB : Vous remarquerez que la méthode ActionLink est surchargée et permet donc  des comportements différents, je vous laisse découvrir cela par  vous-même.</p>
<p>Nous verrons également que nous ne sommes pas obligé  d’utiliser ces méthodes et que nous pourrions tout aussi bien utiliser du html écrit &#8220;à  la main&#8221;. Afin d&#8217;avoir un apperçu des différents composants, je vous invite à explorer celui-ci via l&#8217;intellisense de Visual Studio. J&#8217;ai le présentement que vous allez vous servir de ce helper assez souvent dans les prochains mois.</p>
<p>Créons maintenant une action SEND dans notre controller et  ajoutons-lui une vue.</p>
<p><img class="aligncenter size-full wp-image-306" title="model3_02" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/model3_02.png" alt="model3_02" width="194" height="72" /></p>
<p>Ajoutez cette vue SEND de la même manière que dans notre dernière article, Bouton-droit ajouter une vue.</p>
<p>Lancez l’application et regarder si la page blanche créée s’affiche correctement.</p>
<p>À ce stade, vous seriez tenté de continuer comme dans une application ASP.NET classique et créer un formulaire dans cette page via des contrôles ASP.NET.</p>
<p>C’est ce que nous allons faire mais avant cela attardons nous sur notre modèle.</p>
<p>En effet, le modèle est l&#8217;une des parties les plus importantes de notre application. En effet, si on y réfléchit, c’est celui-ci qui renfermera la connaissance que nous avons sur notre domaine. Le reste n’étant que des outils facilitant l’affichage et/ou à la manipulation de données. C’est dans notre modèle que la logique de notre situation transparaîtra. C’est lui qui doit refléter le monde réel, il est entièrement créé par vous et peut donc correspondre de manière très proche à la réalité. que vous vous êtes faites de votre domaine</p>
<p>Dans notre cas, notre domaine n’est pas très compliqué, ce qui aura pour effet la création d&#8217;un modèle simple.</p>
<p>Un simple objet encapsulant les coordonnées et un paramètre nous permettant de savoir si la personne assistera ou non à la soirée sera un modèle valable pour cette application.</p>
<p>Ajoutez un fichier ReponseVisiteur.cs dans notre modèle et ajoutez à cette classe les paramètres souhaités.</p>
<p><img class="aligncenter size-full wp-image-308" title="model3_03" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/model3_03.png" alt="model3_03" width="352" height="186" /></p>
<p>Seul particularité de cette classe, le paramètre WillAttend est de type booléen nullable part l’ajout du caractère ‘?’ directement après la déclaration du type de la variable. Ce qui paramétra la création d&#8217;une variable à trois états, true, false ou null.</p>
<p>Créons maintenant le formulaire pour la vue.</p>
<p><img class="aligncenter size-full wp-image-309" title="model3_04" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/model3_04.png" alt="model3_04" width="894" height="355" /></p>
<p>Si vous lancez cette application, vous remarquerez que lorsque vous cliquez sur le bouton submit, la page se recharge en perdant les informations entrées dans le formulaire. Ce comportement est tout à fait normal. En effet, l&#8217;action SEND a pris en charge votre requête car vous n’avez pas d’autre action dans votre controller capable d’interpréter un post de manière correcte.</p>
<p>Nous remarquons que ce comportement n’est pas tout à fait normal, en effet, l’action SEND de votre controller ne devrait être utilisé que pour une méthode de type GET, c&#8217;est-à-dire seulement pour afficher la vue et non pas pour interpréter une requête de type post.<br />
Pour cela, ajoutons un attribut permettant à l’action de n’accepter que des requêtes de type GET. Faisons de même pour la méthode index de notre HomeController.</p>
<p><img class="aligncenter size-full wp-image-310" title="model3_05" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/model3_05.png" alt="model3_05" width="216" height="90" /></p>
<p>Relançons notre application et regardons ce qu’il se passe. Après avoir appuyé sur notre bouton submit. Nous recevons une page d’erreur 404.</p>
<p>Comportement normal, il n’y a maintenant plus d’action dans notre Controller capable de répondre à une requête de type &#8220;post&#8221; à l’url correspondante (Home/SEND).</p>
<p>Nous devons donc créer une nouvelle méthode afin de pourvoir interpréter cette requête. Celle-ci ne devra prendre en compte que des requêtes de type POST, elle devra prendre en paramètre un objet de type ReponseVisiteur (créé depuis notre formulaire de la page SEND) et à partir de ce même objet, devra exécuter de la logique et ensuite être retournée, par exemple, à une vue Thanks. Cette vue devra afficher un message différent suivant la réponse de l&#8217;invité.<br />
<strong></strong></p>
<p><strong>Le Model Binding :</strong></p>
<p>Grâce au Model Binding (composant d’ASP.NET MVC), les données entrantes sont automatiquement créées et utilisées en paramètre par les actions, ceci étant possible par une correspondance de paires clé/valeur entrantes avec le nom de la propriété du type désiré en NET.</p>
<p>Plus concrètement, ce binding, nous permettra d’éviter de devoir jouer avec des dictionnaires tels que Request.Form[] et Request.QueryString[]  aussi souvent qu’en webforms. En effet, comme les noms de nos contrôles se trouvant dans la page SEND.ASPX correspondent aux noms des propriétés de nos objets. Automatiquement, le framework nous fournira une instance de notre objet ResponseVisiteur avec n’importe quelle valeur entrée dans nos contrôles.</p>
<p>Revenons à nos moutons et retournons à nos deux actions afin d&#8217;illustrer ce comportement :</p>
<p><img class="aligncenter size-full  wp-image-313" title="model3_06" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/model3_06.png" alt="model3_06" width="573" height="265" /></p>
<p>Nous remarquons qu’il est donc possible de passer un objet à une vue.<br />
À noter que pour arriver à ce résultat, nous devons ajouter le namespace « using Kiwi.Web.Models » afin d’avoir un accès à nos modèles.</p>
<p><strong>Vue fortement typée :<br />
</strong><br />
Si vous regardez attentivement l&#8217;action SEND devant interprétée une requête de type POST, nous passons à la vue &#8220;Thanks&#8221; un objet de type ReponseVisiteur. Pour que cette vue puisse interpréter cette objet, il faudra donc créer une vue dite fortement typée. En faisant cela, nous définissons le modèle de la vue. Nous pourrons alors depuis celle-ci accéder aux propriétés de cette objet.</p>
<p>Créez cette vue fortement typée. Pour cela, cliquez-droit sur le nom de votre action &gt; add &gt; View.</p>
<p>Nous arrivons sur cet écran :</p>
<p><img class="aligncenter size-full wp-image-314" title="model3_07" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/model3_07.png" alt="model3_07" width="443" height="437" /></p>
<p>Nous définissons donc le type ReponseVisiteur comme mode pour notre vue. Cliquez sur Add et une vue Thanks sera ajoutée à notre site.</p>
<p>Voici notre vue :</p>
<p><img class="aligncenter size-full wp-image-315" title="model3_07bis" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/model3_07bis.png" alt="model3_07bis" width="580" height="151" /></p>
<p>La partie soulignée en rouge est importante, en effet, nous voyons que notre vue héritée de la classe MVC.Viewpage est typée fortement par ResponseVisiteur.</p>
<p>Le point fort de ce typage est l&#8217;accessibilité aux paramètres de l&#8217;objet depuis notre vue.</p>
<p><img class="aligncenter size-full wp-image-317" title="model3_07tris" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/model3_07tris.png" alt="model3_07tris" width="580" height="243" /></p>
<p>Comme vous le remarquez, nous avons accès au propriété de la classe par Intellisense.</p>
<p>Essayons de nouveau d&#8217;envoyer notre formulaire en introduisant quelques valeurs (attention pas de validation pour le moment).</p>
<p>Voilà le résultat.</p>
<p><img class="aligncenter size-full wp-image-318" title="model3_08" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/model3_08.png" alt="model3_08" width="376" height="117" /></p>
<p>Premier constat : html propre, pas de viewstate. N’est ce pas génial ?</p>
<p>Ajoutons maintenant de la Validation :</p>
<p>N’oublions pas que cette validation concerne le modèle et non pas la vue. En effet, les validations reflètent généralement des règles du business. Et il sera, pour vous, plus facile de maintenir vos règles si celle-ci se trouvent à un seul et même endroit dans votre application. Autre avantage, en intégrant les règles dans votre modèle, vous êtes certains que l’intégrité de votre système reste respecté et ce quelque soit la vue ou le Controller qui est connecté avec ce modèle. Ceci est, selon moi, une manière plus robuste que les contrôles de validation d&#8217;ASP.NET de type &lt;asp:XyzValidation&gt;.</p>
<p>La manière de valider qui va suivre n’est pas la plus puissante et nous verrons plus tard les autres techniques de validation qui existent en ASP.NET MVC.</p>
<p>Pour cela, rendez-vous dans votre objet ReponseVisiteur et implémentez l’interface IDataErrorInfo.</p>
<p><img class="aligncenter size-full wp-image-320" title="model3_09" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/model3_09.png" alt="model3_09" width="591" height="511" /><br />
Maintenant, retournons dans notre controller afin d’adapter notre action suivant le résultat de la validation.</p>
<p><img class="aligncenter size-full wp-image-321" title="model3_10" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/model3_10.png" alt="model3_10" width="573" height="218" /></p>
<p>Et pour la vue, nous rajoutons la méthode Helper HTML.ValidationSummary(), cette méthode permet d&#8217;afficher les messages d&#8217;erreurs contenu dans notre Modèle.</p>
<p><img class="aligncenter size-full wp-image-322" title="model3_11" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/model3_11.png" alt="model3_11" width="900" height="456" /> Grâce au binding du modèle qui « parse » les données entrantes, nous pouvons retournée la vue et si nous rencontrons une erreur, les contrôles seront réinitialisés avec les données qui avaient été introduites auparavant. Pourtant, nous sommes dans un contexte http « stateless ». Cela crée une apparence d’application « statfull », nous verrons ces mécanismes plus en profondeur plus tard.</p>
<p>Réessayons notre application :</p>
<p><img class="aligncenter size-full wp-image-323" title="model3_12" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/model3_12.png" alt="model3_12" width="433" height="294" /></p>
<p>Terminons l’application en rajoutant notre méthode permettant d’envoyer un mail :</p>
<p><img class="aligncenter size-full wp-image-324" title="model3_13" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/model3_13.png" alt="model3_13" width="585" height="450" /></p>
<p>Cette application utilise l’API SMTPCLient. Par défaut, SMTPClient cherche les paramètres concernant le serveur mail dans le Webconfig de votre site. Ajoutez ces lignes pour envoyer des mails :</p>
<p><img class="aligncenter size-full wp-image-325" title="model3_14" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/model3_14.png" alt="model3_14" width="603" height="205" /></p>
<p>Généralement, en développement, on préfère stocker les mails dans un répertoire plutôt que de polluer le destinataire, pour cela configurez votre webconfig de la manière suivante :</p>
<p><img class="aligncenter size-full wp-image-326" title="model3_15" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/model3_15.png" alt="model3_15" width="505" height="129" /></p>
<p>Je vous laisse le soin de configurer ceci et de tester cette application.</p>
<p>En conclusion :</p>
<p>Vous venez de créer une première vraie application ASP.NET MVC, vous avez maintenant appris à jongler avec les vues, le controller et le modèle. Vous savez maintenant lier une vue avec un modèle et vous avez également approché le concept de validation dans ASP.NET MVC.</p>
<p>Pour terminer regardons de plus prêt l&#8217;architecture ASP.NET MVC :</p>
<p><img class="aligncenter size-full wp-image-327" title="model3_16" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/model3_16.png" alt="model3_16" width="578" height="154" /></p>
<p>Dans cette architecture, les requêtes HTML de type request sont routées vers un controller, celui-ci travaille avec le modèle afin d’interpréter les données utilisateurs et mener à bien la requête. Le modèle représentant la logique du business et le Controller la logique de l’application (gestion de la session, authentification,…). Lorsqu’il faut retourner les données vers l’utilisateur, le controller prépare ces données pour la vue par l’entremise du « presentation model », le ViewData en ASP.NET MVC.</p>
<p>Le Controller n’étant pas lié à la vue, celui-ci est entièrement testable. Les vues, elles, sont de simples outils permettant d’afficher du HTML à partir de données se trouvant dans le viewdata. Elles permettent l’itération afin de générer des tableaux, des listes, elles ont la possibilité de cacher ou non une partie de page et bien d&#8217;autres comportements sont possibles. De manière générale, cette logique doit rester simple et ne peut avoir comme but que l’affichages de données et de formulaire. Vous ne penserez plus en terme de contrôle comme en ASP.NET classique mais en terme de requête request/response HTML.</p>
<p>Pour plus d’info concernant les différentes architectures du point de  vue théorique, je vous renvoie vers le site de Mr Fowler :  <a href="http://martinfowler.com/eaaDev/uiArchs.html">http://martinfowler.com/eaaDev/uiArchs.html</a></p>
<p>Au point de vue .NET :</p>
<p>Les controllers sont des classes ASP.NET MVC qui dérivent toutes de la classe Controller d’ASP.NET MVC. Chaque classe publique appelée « Action method » est automatiquement associée à une URL se trouvant dans le schéma d’URL que vous configurez. Ces actions exécutent les opérations et renvoient ensuite une réponse, par exemple, l&#8217;affichage d&#8217;une vue. Ce mécanisme d’entrée/sortie a été pensé dans le but d’être testable facilement, vous n’êtes donc pas couplé à un serveur Web en fonction.</p>
<p>Le framework supporte différent view engine. Par défaut, les vues sont de simple page webforms aspx,libérées du viewstate, du code-behind (pas de .cs) et du comportement des postbacks.</p>
<p>Concernant votre modèle, ASP.NET ne vous fournit pas de cannevas et vous êtes libre de créer vos objets dans la manière qui vous sierra le mieux. Concernant les aller/retour entre modèle et base de données, vous êtes encore une fois libre d’utiliser vos propres classes ou n’importe quel ORM fonctionnant en .NET. Par défaut, ASP.NET MVC créé un répertoire Model, vous pouvez l’utilisez mais libre à vous de créer une dll et d’utiliser celle-ci en modèle.</p>
<p>Vous remarquerez qu’ASP.NET MVC n’est pas tout à fait un MVC  classique mais adapté au web et à l’ASP.NET.</p>
<p>Je pense que vous êtes maintenant prêt à passer dans le vif du sujet et construire une application réelle en utilisant ASP.NET MVC. J’espère vous avoir donné une bonne introduction via ces trois premiers articles. Dans mes prochains articles, nous approfondirons certains composants d’ASP.NET MVC et j’espère que nous arriverons à construire cette application ensemble dans une philosophie agile. J’attends de vous un retour afin de discuter des choix architecturaux au cours de ce périple. À bientôt !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fr.dervalp.com/?feed=rss2&amp;p=301</wfw:commentRss>
		</item>
		<item>
		<title>ASP.NET MVC2 - Votre première application</title>
		<link>http://www.fr.dervalp.com/?p=259</link>
		<comments>http://www.fr.dervalp.com/?p=259#comments</comments>
		<pubDate>Tue, 16 Mar 2010 23:58:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[ASP.NET MVC]]></category>

		<category><![CDATA[ASP.NET]]></category>

		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://www.fr.dervalp.com/?p=259</guid>
		<description><![CDATA[suite de mon premier article :
ASP.NET MVC2 - Introduction
ASP.NET MVC2 - Votre première application
ASP.NET MVC2 - Le modèle et la vue fortement liée
Pré-requis :
Pour pouvoir utiliser ASP.NET MVC2, vous devez au moins utiliser les systèmes d’exploitation suivants :
- Window Xp, Vista, 7, server 2003, server 2008.
Pour ce qui est de l’IDE :
- Visual studio 2008 [...]]]></description>
			<content:encoded><![CDATA[<p>suite de mon premier article :</p>
<p><a href="http://www.fr.dervalp.com/?p=214">ASP.NET MVC2 - Introduction</a></p>
<p>ASP.NET MVC2 - Votre première application</p>
<p><a href="http://www.fr.dervalp.com/?p=301">ASP.NET MVC2 - Le modèle et la vue fortement liée</a></p>
<p><strong>Pré-requis :</strong></p>
<p>Pour pouvoir utiliser ASP.NET MVC2, vous devez au moins utiliser les systèmes d’exploitation suivants :</p>
<p>- Window Xp, Vista, 7, server 2003, server 2008.</p>
<p>Pour ce qui est de l’IDE :</p>
<p>- Visual studio 2008 (avec SP1) peu importe l’édition, Visual Studio 2010 (peu importe l’édition), Visual Web Developper 2008 Express (attention, avec cette version, vous n’aurez pas accès aux projets de test unitaire compris dans Visual Studio 2008).</p>
<p>Attention : Il n’est <strong>pas possible</strong> de construire des applications ASP.NET MVC <strong>avec Visual Studio 2005</strong>.</p>
<p>Si vous n’avez jamais installé de framework ASP.NET MVC sur votre machine, il suffit simplement de le télécharger ici : <a href="http://www.asp.net/mvc/">http://www.asp.net/mvc/</a>.</p>
<p>NB : Par contre si vous utilisez comme moi Visual Studio 2010 RC1, la version fournie est ASP.NET MVC 2 RC1, pour installer la dernière version c&#8217;est à dire ASP.NET MVC 2, vous devez tout d’abord désinstaller la version ASP.NET MVC 2 installée sur votre système et ensuite installer la dernière version téléchargée. Source de mon information : <a href="http://haacked.com/archive/2010/02/10/installing-asp-net-mvc-2-rc-2-on-visual-studio.aspx">http://haacked.com/archive/2010/02/10/installing-asp-net-mvc-2-rc-2-on-visual-studio.aspx</a></p>
<p><img class="aligncenter size-full wp-image-265" title="installation" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/intro_installation.png" alt="installation" width="689" height="482" /></p>
<p>Pour ma part, ma configuration dans cette série sera Visual Studio 2010 CTP avec la dernière version d’ASP.NET MVC 2 RTM.<br />
Concernant la base de données, j’utiliserai Sql Server 2008 Express edition que vous pouvez télécharger via ce lien : <a href="http://www.microsoft.com/express/database/">http://www.microsoft.com/express/database/</a>.</p>
<p>Maintenant que vous êtes en possession de tous les outils requis, je vous invite donc à créer une première application MVC.<br />
Pour cela, File &gt; New &gt; Project</p>
<p><img class="aligncenter size-full wp-image-268" title="creation_de_projet" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/intro_creation_projet_11.png" alt="creation_de_projet" width="800" height="609" /></p>
<p>Cliquez sur ok, nous avons alors une boîte de dialogue qui apparaît afin de savoir si nous voulons y accoler un projet de test.</p>
<p><img class="aligncenter size-full wp-image-269" title="pas de test unitaire cette fois" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/intro_creation_projet_2.png" alt="pas de test unitaire cette fois" width="558" height="352" /></p>
<p>Nous cliquerons sur « No, do not create a unit test project ». Nous reviendrons sur cette partie plus tard.</p>
<p>Vous voilà en face d’une nouvelle application MVC. Si vous naviguez dans le solution explorer de ce projet, vous remarquerez qu’il n’est pas vide.</p>
<p>Pressez CTRL+F5 afin de lancer l’application.</p>
<p><img class="aligncenter size-full wp-image-270" title="my first asp.net mvc application" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/intro_creation_projet_3.png" alt="my first asp.net mvc application" width="739" height="339" /></p>
<p>Si vous arrivez à cet écran, c’est que tout se passe bien et que votre installation s’est bien déroulée. En cas de problème, n’hésitez-pas à laisser un commentaire, je me ferai un plaisir de vous aider.</p>
<p>Fermez votre navigateur et assurez-vous que le débuggeur soit bien stoppé.</p>
<p>Retournons dans le &#8220;solution explorer&#8221; et supprimons les fichiers qui ne nous intéressent pas. En effet, ASP.NET MVC crée pour nous une application prête à l’emploi.</p>
<p>Nous aurions pu, au lieu de créer une ASP.NET MVC2 application, prendre le template vide que nous fournit Visual Studio mais je voulais m’assurer du bon fonctionnement de votre configuration.</p>
<p>Nettoyez les fichiers tels que montrez dans l’image ci-dessous :</p>
<p><img class="aligncenter size-full wp-image-272" title="supprimons ces  fichiers" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/intro_creation_projet_4.png" alt="supprimons ces fichiers" width="457" height="591" /></p>
<p>Rendez-vous dans le Controller HomeController. Il sera votre controller par défaut, si je puis dire, et nous verrons plus tard pourquoi. Supprimer les classes construites à l’intérieur de celui-ci et créez une méthode qui renvoie un string.</p>
<p><img class="aligncenter size-full wp-image-274" title="renvoyons un string" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/intro_creation_projet_5.png" alt="renvoyons un string" width="451" height="296" /></p>
<p>Lancez l’application et vous devriez avoir le résultat suivant :</p>
<p><img class="aligncenter size-full wp-image-275" title="intro_creation_projet_6png" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/intro_creation_projet_6png.png" alt="intro_creation_projet_6png" width="378" height="212" /></p>
<p>Wow, vous venez de créer votre première application ASP.NET MVC ! Félicitation, ce fût dur n’est-ce pas ?</p>
<p>Trêve de plaisanterie, que s’est t’il passé lors du lancement d’application :</p>
<p>Nous avons lancé l’application, celle-ci à envoyé une requête http de type GET, cette requête a, apparemment, été interceptée par notre HomeController etla méthode que nous avons écrite a été exécutée.</p>
<p>À l’aide de l’outil FireBug de Firefox, analysons les requêtes http, voici ce que nous dit FireBug concernant la requête envoyée :</p>
<p><img class="aligncenter size-full wp-image-277" title="get firebug" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/intro_creation_projet_7.png" alt="get firebug" width="752" height="293" /></p>
<p>Et voici ce que nous avons eu en retour :</p>
<p><img class="aligncenter size-full wp-image-278" title="intro_creation_projet_8" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/intro_creation_projet_8.png" alt="intro_creation_projet_8" width="752" height="301" /></p>
<p>Un string « Welcome to a my First MVC Application ». Vous noterez au passage la faute de frappe, j’aurais dû écrire « Welcome to my First MVC Application », je vous laisse corriger cette erreur.</p>
<p>Maintenant, regardons le code source de cette page, nous voyons que ce n’est pas du html mais un simple string renvoyé par le controller. Suis-je donc entièrement maître de ce que j’envoie comme réponse au client ? La réponse est oui.</p>
<p>En MVC, le controller est responsable d’intercepter les requêtes rentrantes. Dans ASP.NET MVC, le controller est une simple classe C# qui dérive de System.Web.MVC.Controller. Chaque méthode &#8220;public&#8221; d’un controller est appelé une action. Cette action pourra être atteindre par le web via l’URL.</p>
<p>Récapitulons, vous avez un controller HomeController et une méthode d’action Index. Comment l’application fait-elle le lien entre cette action et votre url. En effet, lorsque vous lancez l’application, l&#8217;url est « / ». En fait, Si vous vous rendez dans le global.asax, vous verrez ceci :</p>
<p><img class="aligncenter size-full wp-image-280" title="intro_creation_projet_9" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/intro_creation_projet_9.png" alt="intro_creation_projet_9" width="674" height="433" /></p>
<p>En fait, au commencement de l’application (Application_Start()), l’application charge toutes routes définies dans la méthode RegisterRoutes().</p>
<p>Dans celle-ci nous avons une route par défaut.</p>
<p><img class="aligncenter size-full wp-image-281" title="intro_creation_projet_10" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/intro_creation_projet_10.png" alt="intro_creation_projet_10" width="587" height="86" /></p>
<p>Si nous regardons cette route pas « Default », en dernier lieu, un objet anonyme qui donne en paramètre, le controller Home, l’action Index et un string vide en id. C’est cette ligne qui crée notre route par défaut.</p>
<p>L’action Index compris dans le controller Home sera donc exécuté lorsque l’url aura les valeurs suivantes :<br />
/<br />
/Home/<br />
/Home/Index</p>
<p>L’action Index étant l’action par défaut lorsque rien n’est renseigné après le nom du Controller dans l’url.</p>
<p>Par défaut également, si vous créez un controller nommer ProductControlller, automatiquement, sa route sera /Product et non /ProductController. Nous parlerons plus en détails de ce comportement au moment opportun.</p>
<p>Renvoyer de simples string n’étant pas très utile, nous allons maintenant tenter d’envoyer du beau html.</p>
<p><strong>Créer et afficher une vue :</strong></p>
<p>Pour cela retournons dans notre solution explorer et supprimons le fichier Index et About qui se trouve sous le répertoire Home.</p>
<p><img class="aligncenter size-full wp-image-282" title="intro_creation_projet_111" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/intro_creation_projet_111.png" alt="intro_creation_projet_111" width="285" height="64" /></p>
<p>Ensuite retournons dans notre controller et modifions l’action Index comme ci-dessous :</p>
<p><img class="aligncenter size-full wp-image-283" title="intro_creation_projet_12" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/intro_creation_projet_12.png" alt="intro_creation_projet_12" width="333" height="186" /></p>
<p>Action result est une classe abstraite, vous ne pourrez donc par retourner un new ActionResult. Vous devrez retourner un type qui dérive d’ActionResult, nous utilisons la méthode View qui retourne un ViewResult. Il existe plusieurs classes dérivant d’ActionResult, nous verrons cela prochainement.</p>
<p>Que fait cette méthode View() ? On sait qu’elle retourne un ViewResult mais ou va-t-il chercher sa vue ? Pour le savoir et à condition que vous ayez bien supprimé les fichiers About et Index en dessous de répertoire Home. Vous devriez avoir le comportement suivant :</p>
<p><img class="aligncenter size-full wp-image-284" title="intro_creation_projet_13" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/intro_creation_projet_13.png" alt="intro_creation_projet_13" width="743" height="396" /></p>
<p>En effet, il ne trouve aucune vue se nommant Index dans le répertoire HOME de votre solution. Ce qui est normal, nous les avons supprimés.<br />
Les vues sont associées avec une action par une convention. Lorsque le framework veut trouver une vue par défaut pour l’action index du controller HomeController, vous voyez sur l’image ci-dessus les endroits dans lesquelles le Framework cherche cette fameuse vue.</p>
<p>Pour créer une vue depuis votre controller, faites bouton-droit sur le nom de l’action, comme ci-dessous :</p>
<p><img class="aligncenter size-full wp-image-285" title="intro_creation_projet_14" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/intro_creation_projet_14.png" alt="intro_creation_projet_14" width="532" height="461" /></p>
<p>Vous avez alors la boîte de dialogue suivante :</p>
<p><img class="aligncenter size-full wp-image-286" title="intro_creation_projet_14bis" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/intro_creation_projet_14bis.png" alt="intro_creation_projet_14bis" width="443" height="437" /></p>
<p>Vous voyez que par défaut le nom de votre vue est Index, si vous changez celui-ci et laissez la méthode View() telle quelle, cette vue ne sera par trouvée. Elle ne respectera pas la convention utilisée par le framework. Vous devrez alors fournir des paramètres à la méthode View(), ce que nous verrons plus tard.</p>
<p>Vous remarquez également que ce dialogue nous permet de choisir si nous voulons utiliser une master page ou pas. Nous allons utiliser la master page par défaut et ajouter cette vue à notre application en appuyant sur le bouton Add.</p>
<p>Une page aspx s’ouvre alors, vous pouvez maintenant la remplir de HTML comme bon vous semble.</p>
<p>Un exemple :</p>
<p><img class="aligncenter size-full wp-image-287" title="intro_creation_projet_15" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/intro_creation_projet_15.png" alt="intro_creation_projet_15" width="813" height="279" /></p>
<p>CTRL+F5 pour lancer l’application et voici le résultat :</p>
<p><img class="aligncenter size-full wp-image-288" title="intro_creation_projet_16" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/intro_creation_projet_16.png" alt="intro_creation_projet_16" width="723" height="357" /></p>
<p>En premier lieu, on voit bien que le MasterPage a été chargé. Ce qui est normal vu que l’attribut MasterPageFile de notre Page renseigne bien notre MasterPage.</p>
<p>Analysons maintenant la réponse qui a été envoyée à notre client par la suite de notre méthode GET.</p>
<p>En réponse nous voyons bien, que la réponse est maintenant une page html et non plus un simple string :</p>
<p><img class="aligncenter size-full wp-image-290" title="intro_creation_projet_17" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/intro_creation_projet_17.png" alt="intro_creation_projet_17" width="798" height="383" /></p>
<p>Vous pourriez tout aussi bien retirer le lien vers le masterpage en supprimant en entier l’attribut MasterPageFile= « votre lient ». Attention dans ce cas, vous devez supprimer toutes les balises &lt;asp :content&gt; et  recréer une page html en entier avec son head, son body,…<br />
Voici notre nouvelle vue sans master page :</p>
<p><img class="aligncenter size-full wp-image-291" title="intro_creation_projet_18" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/intro_creation_projet_18.png" alt="intro_creation_projet_18" width="666" height="249" /></p>
<p>Et le résultat :</p>
<p><img class="aligncenter size-full wp-image-292" title="intro_creation_projet_19" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/intro_creation_projet_19.png" alt="intro_creation_projet_19" width="772" height="164" /></p>
<p>Le mécanisme des masterpages n’est pas une nouveauté en ASP.NET MVC mais on voit qu’il continue à fonctionner. À noter que le masterpage n’a pas de code-behind. Il est juste ce qu’il doit être, un squelette pour notre application. Nous y reviendrons plus tard et nous allons réutilisez cette vue (maintenant sans masterpage) afin d’afficher un contenu dynamique.</p>
<p>Modifions l’action comme tel :</p>
<p><img class="aligncenter size-full wp-image-293" title="intro_creation_projet_20" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/intro_creation_projet_20.png" alt="intro_creation_projet_20" width="391" height="364" /></p>
<p>Et notre vue de la manière suivante :</p>
<p><img class="aligncenter size-full wp-image-294" title="intro_creation_projet_21" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/intro_creation_projet_21.png" alt="intro_creation_projet_21" width="640" height="248" /></p>
<p>Et vous obtenez le résultat suivant :</p>
<p><img class="aligncenter size-full wp-image-295" title="intro_creation_projet_22" src="http://www.fr.dervalp.com/wp-content/uploads/2010/03/intro_creation_projet_22.png" alt="intro_creation_projet_22" width="725" height="183" /></p>
<p>Que s’est-il passé lors cette exécution ?</p>
<p>Le navigateur a envoyé une requête GET afin d’atteindre l’action lié à l’url « / », par l’entremise des Routes, cette méthode est envoyée vers l’action Index de l’objet HomeController. Cette index est interprété et retourne sa vue par défaut. Cette action Index passe des données à sa vue par l’intermédiaire de l’objet ViewData. Ces données sont interprétées par la vue à l’aide de la commande en ligne &lt;%=ViewData["message"] %&gt;. Cette vue maintenant interprétée est renvoyée au client par l’intermédiaire d’une requête HTTP de type réponse. Pour finir, votre navigateur affiche le résultat de cette requête.</p>
<p>Cette explication ne rentre bien évidemment pas, pour le moment, dans les détails. Nous nous y attarderons plus en profondeur bientôt.</p>
<p><strong>En conclusion :</strong></p>
<p>Vous venez donc de créer votre première application ASP.NET MVC2 ! Vous avez ajouté un peu de logique à votre action afin rendre le tout plus dynamique. Vous avez remarqué lors de cet exercice que l’objet ViewData permet de passer des valeurs à la vue et que grâce au commande en ligne d’ASP.NET et ces célèbres balises &lt;% %&gt;, vous avez affiché dans votre vue, des données se trouvant dans votre controller.</p>
<p>Avant ce dernier exercice, vous avez appris la notion de vue et celle de Controller, vous avez approché la notion des routes et la notion de requête http qui transite depuis votre navigateur jusqu’au server Web et vice-versa.</p>
<p>Nous arrivons donc à la fin de cette article, vous aurez certainement remarquez que nous n’avons pas parlé du M de MVC, le modèle. Nous approcherons ce principe plus en détail dans notre prochain article. Dans celui-ci nous verrons comment communiquer avec le Modèle par l’intermédiaire du controller. Nous terminerons alors avec une partie théorique avant de passer aux choses sérieuses. Le développement d’une application réelle.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fr.dervalp.com/?feed=rss2&amp;p=259</wfw:commentRss>
		</item>
		<item>
		<title>ASP.NET MVC2 - Introduction</title>
		<link>http://www.fr.dervalp.com/?p=214</link>
		<comments>http://www.fr.dervalp.com/?p=214#comments</comments>
		<pubDate>Tue, 16 Mar 2010 03:09:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[ASP.NET MVC]]></category>

		<category><![CDATA[ASP.NET]]></category>

		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://www.fr.dervalp.com/?p=214</guid>
		<description><![CDATA[ 

Introduction :
J’ai décidé de créer une petite série afin de vous montrer les nouveautés ASP.NET MVC2. De nombreux blogs fleurissent sur ASP.NET MVC ces temps-ci, principalement en anglais et il me semblait que la qualité d’information en langue française manquait quelque peu. J’aurais pu continuer mon blog en anglais comme j’avais d’ailleurs débuté à [...]]]></description>
			<content:encoded><![CDATA[<p><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves /> <w:TrackFormatting /> <w:HyphenationZone>21</w:HyphenationZone> <w:PunctuationKerning /> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF /> <w:LidThemeOther>FR-CA</w:LidThemeOther> <w:LidThemeAsian>X-NONE</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:BreakWrappedTables /> <w:SnapToGridInCell /> <w:WrapTextWithPunct /> <w:UseAsianBreakRules /> <w:DontGrowAutofit /> <w:SplitPgBreakAndParaMark /> <w:DontVertAlignCellWithSp /> <w:DontBreakConstrainedForcedTables /> <w:DontVertAlignInTxbx /> <w:Word11KerningPairs /> <w:CachedColBalance /> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> <m:mathPr> <m:mathFont m:val="Cambria Math" /> <m:brkBin m:val="before" /> <m:brkBinSub m:val="&#45;-" /> <m:smallFrac m:val="off" /> <m:dispDef /> <m:lMargin m:val="0" /> <m:rMargin m:val="0" /> <m:defJc m:val="centerGroup" /> <m:wrapIndent m:val="1440" /> <m:intLim m:val="subSup" /> <m:naryLim m:val="undOvr" /> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"   DefSemiHidden="true" DefQFormat="false" DefPriority="99"   LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Normal" /> <w:LsdException Locked="false" Priority="9" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="heading 1" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /> <w:LsdException Locked="false" Priority="39" Name="toc 1" /> <w:LsdException Locked="false" Priority="39" Name="toc 2" /> <w:LsdException Locked="false" Priority="39" Name="toc 3" /> <w:LsdException Locked="false" Priority="39" Name="toc 4" /> <w:LsdException Locked="false" Priority="39" Name="toc 5" /> <w:LsdException Locked="false" Priority="39" Name="toc 6" /> <w:LsdException Locked="false" Priority="39" Name="toc 7" /> <w:LsdException Locked="false" Priority="39" Name="toc 8" /> <w:LsdException Locked="false" Priority="39" Name="toc 9" /> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /> <w:LsdException Locked="false" Priority="10" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Title" /> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /> <w:LsdException Locked="false" Priority="11" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /> <w:LsdException Locked="false" Priority="22" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Strong" /> <w:LsdException Locked="false" Priority="20" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /> <w:LsdException Locked="false" Priority="59" SemiHidden="false"    UnhideWhenUsed="false" Name="Table Grid" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /> <w:LsdException Locked="false" Priority="1" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 1" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 1" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 1" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /> <w:LsdException Locked="false" Priority="34" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /> <w:LsdException Locked="false" Priority="29" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Quote" /> <w:LsdException Locked="false" Priority="30" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 1" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 1" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 2" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 2" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 2" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 2" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 2" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 3" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 3" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 3" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 3" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 3" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 4" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 4" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 4" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 4" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 4" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 5" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 5" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 5" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 5" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 5" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 6" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 6" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 6" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 6" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 6" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /> <w:LsdException Locked="false" Priority="19" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /> <w:LsdException Locked="false" Priority="21" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /> <w:LsdException Locked="false" Priority="31" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /> <w:LsdException Locked="false" Priority="32" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /> <w:LsdException Locked="false" Priority="33" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Book Title" /> <w:LsdException Locked="false" Priority="37" Name="Bibliography" /> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /> </w:LatentStyles> </xml><![endif]--> <!--[if gte mso 10]><br />
<mce:style><!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:"Tableau Normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin-top:0cm; 	mso-para-margin-right:0cm; 	mso-para-margin-bottom:10.0pt; 	mso-para-margin-left:0cm; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-fareast-language:EN-US;} --></p>
<p><!--[endif]--></p>
<p class="MsoNormal"><strong>Introduction</strong> :</p>
<p class="MsoNormal">J’ai décidé de créer une petite série afin de vous montrer les nouveautés ASP.NET MVC2. De nombreux blogs fleurissent sur ASP.NET MVC ces temps-ci, principalement en anglais et il me semblait que la qualité d’information en langue française manquait quelque peu. J’aurais pu continuer mon blog en anglais comme j’avais d’ailleurs débuté à le faire il y a quelques temps. Néanmoins, après avoir discuté avec certains collèges et amis, j’en suis venu à la conclusion qu’il était peut-être plus utile que je m’exprime dans ma langue maternelle. J’aurai, en effet, plus de facilité à vous expliquer les différents aspects de MVC2.</p>
<p class="MsoNormal">Nous sommes le 15 Mars 2010 et hier, ASP.NET MVC2 a été délivré et oui, bonne nouvelle, nous pouvons enfin l’utiliser en production. Dans cette série, je créerai un CMS, oui réinventer la roue, mais ce concept compris de tous sera donc plus facile pour vous d’assimiler les nouveautés que nous apportent ASP.NET MVC.</p>
<p class="MsoNormal"><strong>Qu’en est-il de ASP.NET Webform ?</strong></p>
<p class="MsoNormal">Rassurez-vous, ASP.NET MVC ne va pas remplacer les webforms, il est juste un autre type d’application que nous fournit Microsoft. Les améliorations pour les Webforms continueront. D’ailleurs, <span> </span>il y a pas mal de nouveauté très sympa avec le nouveau ASP.NET 4.0 (je pense au ClientMode ID, le routing, etc…).</p>
<p class="MsoNormal"><strong>Pourquoi donc apprendre ASP.NET MVC ? </strong></p>
<p class="MsoNormal">Oui vous pourriez bien continuer à utiliser les webforms classique mais vous rateriez quelque chose. Je m’explique, si vous êtes développeur ASP.NET, vous êtes donc, que vous le vouliez ou non, un développeur Web. Votre client est bien un site web. Dans ce cas, je pense que vous devez tenir compte d’une certaine philosophie web. Par exemple, respecter les standards du web, utiliser du Javascript, avoir connaissance des requêtes html envoyées au serveur, utilisez du CSS pour créer votre design,&#8230;</p>
<p class="MsoNormal">Les webforms nous fournissent un outil utile mais il a été pensé de la même manière que les winform. En effet, ASP.NET fournit une couche d’abstraction de la couche ui. Vous pourriez donc bien écrire une application ASP.NET sans écrire le moindre code HTML. Cette couche d’abstraction est peut-être utile. En effet, pas besoin de savoir ce qui se passe derrière, plus besoin de connaître les requêtes http que nous recevons du client, ni celle que nous envoyons au client, tout se passe comme par magie. Nous n’avons plus qu’à mettre notre code dans le codebehind de notre page. Mais cette abstraction a un prix. En effet, tenter de fonctionner dans un esprit « statefull » (comme winform) dans un environnement qui est stateless (le web, client/serveur web) nous coûte quelques contraintes.</p>
<p class="MsoNormal">Pour commencer le viewstate, il est l’un des mécanismes qui nous permet de faire le lien entre l’orienté objet et le html. Il va, par exemple, détecter les changements intervenus à la page. (plus d’information sur le viewstate, ici : <a href="http://www.dotnetguru.org/articles/dossiers/viewstate/viewstate.htm">http://www.dotnetguru.org/articles/dossiers/viewstate/viewstate.htm</a>). À chaque action, un postback sera exécuté et transférera l’entièreté du ViewState vers le serveur web. Il pourra atteindre quelques milliers de kylobytes et ainsi « alourdir » l’application. Utiliser l’Ajax par ce principe est aussi paradoxal, il n’est pas dans la philosophie ajax (optimiser les requêtes entre le client et serveur et ce, de manière asynchrone).</p>
<p class="MsoNormal">Un autre point qui permet la communication entre le client et le serveur est le « page life cycle ». Cette série d’événements clients, serveurs peut devenir très vite difficile à comprendre pour des applications complexes. Je suis certain que vous êtes un spécialiste du «page view cycle » mais, personnellement, j’ai déjà passé quelques heures à comprendre pourquoi un de mes «events handlers » ne s’étaient pas exécuté.</p>
<p class="MsoNormal">Déposer un gridview dans le designer et lui connecter un objectdatasource, rien de plus facile pour faire vite mais quel contrôle avons-nous sur le html généré? Ce html est parfois généré de manière douteuse et peu standard. Ne parlons pas des ID générés de parfois plus de 50 caractères qui ne seront pas facile à intercepter en utiliser javascript et encore moins pour le CSS.</p>
<p class="MsoNormal">Le code-behind de la page qui entraîne des applications fortement couplées entre la vue et la partie logique. En effet, il n’est pas rare d’avoir du code qui manipule des données depuis une base de données directement dans le load d’une page. Quelques patterns nous permettent de remédier à la situation mais ils sont, selon moi, non encouragés de part l’architecture des webforms. De plus, ASP.NET mène au mixte entre le code ASP compris directement dans la vue et nos objets se trouvant dans le code-behind de la page. Il en résulte un couplage fort entre vue et logique serveur. Cela nous donne des applications difficilement maintenables et fragiles à l’extension.</p>
<p class="MsoNormal">Un code difficilement testable. Avec l’émergence des méthodologies Agile, le pattern TDD devient peu à peu un standard dans le monde du développement. En effet, qui n’a jamais entendu parler de tests unitaires ou d’outils de mocking à l’heure d’aujourd’hui? Construire du code robuste et tester avant même sa mise en QA est devenu banal. Cette manière de faire nous est impossible (ou presque) en winforms. En effet, l’architecture n’a pas été pensée dans ce but.</p>
<p class="MsoNormal">Je suis certain qu’ASP.NET continuera à être amélioré au fur et à mesure des releases. Des progrès sont à noter avec le contrôle d’un HTML plus propre possible avec ASP.NET 4.0 mais son gros point faible restera toujours sa non-testabilité (pour le moment).</p>
<p class="MsoNormal">ASP.NET MVC, lui, plus nouveau, a été pensé dans une autre philosophie, celle des méthodologies Agile, du TDD, des IOC/Dependency Injection, du respect des standards web, du protocole REST,…</p>
<p class="MsoNormal">Microsoft a répondu à ses développeurs et à ses détracteurs en nous donnant le choix d’utiliser ASP.NET MVC.</p>
<p class="MsoNormal">Le succès connu ces derniers temps par Ruby on Rails (open source) ne doit pas être totalement anodin. <span> </span>En appliquant les dernières mouvances du développement <span> </span>web, une architecture MVC, en travaillant avec les requêtes http et non en les rendant abstraites et en intégrant un ORM en son cœur, Ruby on Rails est vite devenu une coqueluche auprès des développeurs web. Certains développeurs ASP.NET connus de la communauté comme Rob Connery se sont même converti vers cette technologie. Je vous conseille, d’ailleurs d’y jeter un œil.d Ruby on Rails est très intuitif et pour l’avoir essayé, c’est un framework agréable totalement dédié au web.</p>
<p class="MsoNormal"><strong>Les avantages du ASP.NET MVC :</strong></p>
<p class="MsoNormal"><strong>Justement le MVC :</strong></p>
<p class="MsoNormal">Le model-view-controller est un pattern connu depuis longtemps dans la communauté des développeurs orientés objets, il a été introduit en 1978 dans le projet SmallTalk et est maintenant très populaire dans le monde du développement web.</p>
<p class="MsoNormal">-Les interactions entre utilisateurs et serveurs prennent un cycle naturel. L’utilisateur émet une action, en réponse le serveur change sont modèle et retourne une vue mise à jour par l’utilisateur. Et le cycle se répète indéfiniment, très pratique pour les applications web qui ne sont finalement que des séries de requêtes http échangées entre client et serveur.</p>
<p>-Une application est un système complexe, il est la résultante de différentes technologies, en effet, en tant que développeur web .NET, vous devez maîtriser le HTML, le CSS, le javascript, l’ASP.NET, le C# (ou le VB.NET), des connaissances en orienté-objet et des connaissances en base de données. Une application en couche est donc la moindre des choses pour ce genre d’application et le pattern MVC se marie assez bien dans des architectures multicouches.</p>
<p class="MsoNormal"><!--[if !supportLists]--><strong>Un système extensible à souhait :</strong><span><strong> </strong> </span></p>
<p class="MsoNormal">ASP.NET MVC a été bâti dans une philosophie Agile, il est extensible. En effet, l’ASP.NET MVC est un ensemble de composant mis à votre disposition pour répondre à vos envies de développeurs web. En utilisant interfaces et classes abstraites, le framework nous donne donc la possibilité de remplacer facilement les composants que nous voulons changer pour x ou y raisons. Vous allez donc pouvoir changer le routing system, le view engine, le controller factory et ainsi de suite. Cela tout simplement en implémentant les interfaces et les classes abstraites adéquates. De manière générale, ASP.NET MVC nous donne ces solutions :</p>
<p class="MsoNormal">-Utilisez le fonctionnement par défaut.</p>
<p>-Dériver une sous-classe de l’implémentation par défaut en vue de changer légèrement le comportement de celui-ci.</p>
<p class="MsoNormal">-Remplacer entièrement un composant avec une nouvelle implémentation des interfaces et des classes abstraites fournies. Un peu comme le Provider modèle fourni en ASP.NET 2.0.</p>
<p class="MsoNormal"><strong>Un système testable:</strong></p>
<p class="MsoNormal">L’architecture MVC nous donne des applications qui seront facilement testables mais aussi facilement maintenables (par la séparation des différentes couches). De plus, il nous permet de facilement « mocker » chaque partie du framework. Nous verrons cela plus tard dans notre série.</p>
<p class="MsoNormal"><strong>Le contrôle du HTML généré:</strong></p>
<p class="MsoNormal">En fait, c’est assez simple, vous êtes maintenant maître du HTML produit. Plus d’id mirobolant, plus de viewstate, vous pouvez maintenant produire du code hautement standard et donc plus facilement maintenable. De part cette aspect, vous pourrez maintenant très facilement reprendre le HTML fourni par votre intégrateur (si ce n’est<span> </span>vous-même) dans vos vues. Vous allez pouvoir construire votre design sans vous souciez qu’il soit écrit en ASP.NET, en PHP, en Ruby ou que sais-je. Par ce contrôle sur le HTML, vous pourrez donc très facilement y intégrer des plugins javascript. Microsoft ne s’y est d’ailleurs pas privé en vous fournisseurs dès le départ Jquery. Vous allez vois, l’essayer, c’est l’adopter.</p>
<p class="MsoNormal"><strong>Des URL propres:</strong></p>
<p class="MsoNormal">De nos jours, les url propres sont devenues une demande classique dans les solutions web. Les <span> </span>searchengines donnent un poids conséquent aux mots clés compris dans les url, ce qui en fait un requis pour le recensement. Des urls propres donnent également la possibilité de naviguer directement depuis la barre d’adresse de votre navigateur. De même, ils entraînent plus de confiance envers votre site. La peur de partager des liens sans donnée personnelle deviendra inexistante. ASP.NET MVC, nous fournit un composant puissant et malléable afin de mettre en place ce système de liens propres. La classe system.web.routing, vous aurez un contrôle total de vos liens, il sera donc aisé de coller au protocole REST.</p>
<p class="MsoNormal"><strong>La puissance du framework .NET:</strong></p>
<p class="MsoNormal">ASP.NET MVC vous donne les mêmes droits sur le framework que l’ASP.NET. Aucune restriction concernant son utilisation. De plus, vos anciens contrôles développés en webform pourront continuer à coexister avec ASP.NET MVC. Le déploiement d’ASP.NET MVC se fera peu ou prou de la même manière qu’une application ASP.NET classique, il vous faudra juste installer la bonne version d&#8217;ASP.NET MVC sur votre serveur.</p>
<p class="MsoNormal">Open source :</p>
<p class="MsoNormal">Vous voulez aller plus loin et comprendre comment a été conçu le Framework ? Rien ne vous empêche de prendre le code source d’ASP.NET MVC et de référencer celui-ci dans votre solution. Vous êtes alors prêt à explorer les moindres recoins du Framework. En effet, ces sources sont publiées sous une licence Ms-PL, ce qui implique que vous pouvez changer le code source à votre grès et même le redistribuer comme projet dérivé. Par contre, Microsoft n’acceptera pas les patchs effectués par la communauté. En effet, Ms veut rester maître de son produit.</p>
<p class="MsoNormal">NB : si vous voulez le code source d&#8217;ASP .NET MVC2, veuillez vous rendre sur cette <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=c9ba1fe1-3ba8-439a-9e21-def90a8615a9&amp;displaylang=en">page</a>. Il vous suffit alors de télécharger le fichier mv2-ms-ps.zip.</p>
<p class="MsoNormal"><strong>En conclusion:</strong></p>
<p class="MsoNormal">J’ai voulu commencer cette série par une partie assez théorique, j’espère que cet article vous aura donné l’eau à la bouche. Je ne dirai pas que ASP.NET MVC est un Framework révolutionnaire. Microsoft n’a finalement fait que reprendre les principales mouvances actuelles du monde du développement web. Mais n’est-ce pas déjà là un grand pas ? En effet, il semblerait que le respect des standards, l’aspect testable et d’extensibilité aient gagné Microsoft. Après des évolutions majeures telles que Linq, Entity Framework, WCF, Silverlight, ASP.NET MVC est assurément une nouveauté d’un poids comparable aux précités.</p>
<p class="MsoNormal">Plus personnellement, développant des applications en ASP.NET MVC depuis bientôt plus d’un an, je suis toujours aussi conquis par ce framework. Je profite donc de la sortie du release 2 d’ASP.NET MVC pour vous faire partager mes connaissances acquises ses derniers temps. Le prochain article se concentrera sur l’installation de Visual Studio 2010, du framework ASP.NET MVC2 et d’une application de style « hello word » . Ceci afin de vous faire comprendre les principes de vue, de modèle et de controller. Ces bases acquises, je tenterai de continuer cette série par le développement d’un CMS en utilisant les dernières technologies de Microsoft tout en respectant une certaine philosophie agile (TDD, à l’écoute des changements). J’attendrai, bien évidement de votre part un retour constructif afin de me guider au mieux dans ce périple.</p>
<p class="MsoNormal">Références :</p>
<p class="MsoNormal" style="text-align: left;">Pro ASP.NET MVC Framework de Steven Sanderson, <a href="http://blog.wekeroad.com/">le bog de mr Rob Conery</a>, <a href="http://haacked.com/">le blog de mr Phil Haack</a>, <a href="http://weblogs.asp.net/scottgu/">le blog de mr Scott Guthrie</a> et <a href="http://www.asp.net/mvc/">ASP.NET</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fr.dervalp.com/?feed=rss2&amp;p=214</wfw:commentRss>
		</item>
		<item>
		<title>.NET 4.0 - Introduction VS2010</title>
		<link>http://www.fr.dervalp.com/?p=195</link>
		<comments>http://www.fr.dervalp.com/?p=195#comments</comments>
		<pubDate>Fri, 12 Feb 2010 22:32:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://www.fr.dervalp.com/?p=195</guid>
		<description><![CDATA[Voilà, VS2010 est en RC, je n&#8217;ai pas pu m&#8217;empêcher de l&#8217;installer sur ma nouvelle machine :p. je vais tenter d&#8217;écrire un ou deux postes sur .NET 4.0 dans les jours qui viennent. Je n&#8217;abandonne pas mon apprentissage de WPF mais j&#8217;ai dû récemment me reconcentrer sur ASP.NET pour une mission où je devais &#8220;jqueryser&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>Voilà, VS2010 est en RC, je n&#8217;ai pas pu m&#8217;empêcher de l&#8217;installer sur ma nouvelle machine :p. je vais tenter d&#8217;écrire un ou deux postes sur .NET 4.0 dans les jours qui viennent. Je n&#8217;abandonne pas mon apprentissage de WPF mais j&#8217;ai dû récemment me reconcentrer sur ASP.NET pour une mission où je devais &#8220;jqueryser&#8221; une appli web. Là, je me dis qu&#8217;il est tant de se tenir prêt pour le .NET 4.0, la date de sortie en boîte approchant.</p>
<p>Bon alors, pour commencer, on télécharge VS2010, cela se passe <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=457bab91-5eb2-4b36-b0f4-d6f34683c62a&amp;displaylang=en">ici</a>.</p>
<p>Qu&#8217;y a t&#8217;il de nouveau dans VS2010 ?  pas mal d&#8217;ajouts :</p>
<ul>
<li> l&#8217;éditeur de code qui devient vectoriel.</li>
<li>la refonte de la vue hiérarchique.</li>
<li>le sur-lignage automatique.</li>
<li>l&#8217;auto-génération d&#8217;objets.</li>
<li>la génération de nouveaux rapports de performance.</li>
<li>et bien d&#8217;autres fonctionnalités,&#8230;</li>
</ul>
<p>Avec .NET 4.0, arrive aussi ASP.NET 4.0, ASP.NET MVC 2, le très prometteur Windows Workflow 4.0,&#8230;</p>
<p>Pour commencer avec VS2010, un petit truc sympa, personnaliser la page d&#8217;accueil de votre VS2010. C&#8217;est très simple, vous vous rendez sur C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\StartPages\en, vous allez voir des fichiers XML, ainsi que l&#8217;image de présentation VS 2010, donc soit vous changez les fichiers XML, pour par exemple rajouter des liens utiles, une description sur un projet,&#8230; Ici, je vais simplement changer l&#8217;image et rajouter le logo de ma compagnie. N&#8217;oubliez-pas d&#8217;être administrateur sur le dossier pour pouvoir modifier à votre grè.</p>
<p>Après avoir modifié l&#8217;image et enregistré les modifications, vous relancez VS 2010 et *tadam* :</p>
<p><img class="alignleft size-full wp-image-198" title="vs2010homepage" src="http://www.fr.dervalp.com/wp-content/uploads/2010/02/vs2010homepage.png" alt="vs2010homepage" width="808" height="396" /><br />
Bon voilà, c&#8217;était l&#8217;apéritif avant les plats principaux&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fr.dervalp.com/?feed=rss2&amp;p=195</wfw:commentRss>
		</item>
		<item>
		<title>Composite Application Guidance WPF/Silverlight - Requis : le DataBinding - 3</title>
		<link>http://www.fr.dervalp.com/?p=36</link>
		<comments>http://www.fr.dervalp.com/?p=36#comments</comments>
		<pubDate>Sat, 12 Dec 2009 08:57:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Composite Application Guidance]]></category>

		<guid isPermaLink="false">http://www.fr.dervalp.com/?p=36</guid>
		<description><![CDATA[Comme je vous l&#8217;avez écrit dans mon précédent article, quelques prérequis doivent être connus afin de continuer à bien notre quête. En effet, le chemin sera long avant de maîtriser tous les tenants et aboutissants de cette matière vaste. Selon l&#8217;adage, &#8220;petit train ira loin&#8221;, je m&#8217;efforcerai le plus possible à rentrer dans les détails, [...]]]></description>
			<content:encoded><![CDATA[<p>Comme je vous l&#8217;avez écrit dans mon précédent article, quelques prérequis doivent être connus afin de continuer à bien notre quête. En effet, le chemin sera long avant de maîtriser tous les tenants et aboutissants de cette matière vaste. Selon l&#8217;adage, &#8220;petit train ira loin&#8221;, je m&#8217;efforcerai le plus possible à rentrer dans les détails, quitte parfois à sortir de notre but initial. Prenons par exemple cet article, il traîte du databinding, bien qu&#8217;il se détourne de notre but (Composite Application Guidance), il pourra néanmoins vous servir pour comprendre le principe du binding dans wpf et silverlight (ce qui pourra vous servir pour d&#8217;autres projets). Et finalement, ce n&#8217;est pas cela être Agile ?  Se développer de manière indépendante et ensuire recoller les morceaux (ici l&#8217;apprentissage) afin de former un tout (la connaissance).</p>
<p>Qu&#8217;est ce que le databinding ?</p>
<p>Selon Ms, c&#8217;est la méthode qui permet de lier les composants UI (textbox, listbox,&#8230;) à la couche métier. En effet, si les données changent dans la couche métier et que le binding est correctement configuré, les éléments UI se mettront à jour automatiquement. Mais l&#8217;inverse est également vrai, si l&#8217;utilisateur rentre une valuer dans un textbox, par le binding, le changement sera automatiquement reflété dans la couche métier.</p>
<p>Concept du databinding :</p>
<p><img class="alignnone size-full wp-image-40" title="ms752347_databindingmostbasicen-usvs_90" src="http://www.fr.dervalp.com/wp-content/uploads/2009/10/ms752347_databindingmostbasicen-usvs_90.png" alt="ms752347_databindingmostbasicen-usvs_90" width="438" height="127" />fig 1 (from MSDN)</p>
<ul>
<li>La databinding est le lien entre l&#8217;objet cible (target en anglais) et l&#8217;objet source. Chaque Binding possède quatre composants, un &#8220;binding target object&#8221; (l&#8217;objet cible), une &#8220;property target&#8221; (la propriété cible de l&#8217;ojet cible), un &#8220;binding source object&#8221; (la source de donnée), et un &#8220;path&#8221; c&#8217;est à dire un chemin vers la valeur se trouvant dans l&#8217;objet source.</li>
</ul>
<p>Par exemple, si vous vouler &#8220;binder&#8221; le contenu d&#8217;un Textbox à la propriété Nom d&#8217;un objet Humain, votre objet cible sera la TextBox,<br />
la propriété cible sera la propriété Text de l&#8217;object Textbox, la valeur à exploité (le &#8220;path&#8221;) est la propriété source Nom de l&#8217;objet source Humain.</p>
<ul>
<li>La propriété de l&#8217;objet cible que nous voulons manipuler est un &#8220;Dependency Property&#8221;  traduction une propriété dépendante. Ceci afin de pouvoir lier cette propriété par databinding. Presque toutes les propriétés des éléments UI (textbox, listbox) sont des &#8220;Dependence Property&#8221; sauf les &#8220;Read-Only&#8221;. En effet, ces classes dérivent tous du DependencyObject class (<a href="http://msdn.microsoft.com/en-us/library/system.windows.dependencyobject.aspx">voir ici</a> et <a href="http://msdn.microsoft.com/en-us/library/system.windows.dependencyproperty.aspx">ici</a>) qui permet de définir des DependencyProperty qui support le binding.</li>
<li>L&#8217;objet source n&#8217;est seulement un object CLR personnalisé (un object comme que vous avez créé comme, par exemple, humain), cela pourrait être tout aussi bien, des objets qui proviennet d&#8217;ADO.NET, de webservice ou encore, d&#8217;un noeud XML qui contient des données.</li>
</ul>
<p>A noter que pour créer ces liens (ce databind), vous utilisez des <a href="http://msdn.microsoft.com/en-us/library/system.windows.data.binding.aspx">BindingOjbects</a>, c&#8217;est grâce à ces objets que le lien peut se faire.</p>
<p>La direction du flux de donnée :</p>
<p><img class="alignnone size-full wp-image-44" title="dataflow" src="http://www.fr.dervalp.com/wp-content/uploads/2009/10/dataflow.png" alt="dataflow" width="438" height="127" />figure 2 (from MSDN)</p>
<p>En effet, le flux de données à un sens, comme l&#8217;on peut le voir dans la figure 2. Il y a un sens aux flèches. Le flux de donnée va d&#8217;un object source vers un objet cible. La propriété name du textbox pourrait être tout aussi bien être la cible que la source. Ce n&#8217;est plus la propriété text du TextBox qui se &#8220;remplit&#8221; de la proriété Nom de l&#8217;objet Humain mais c&#8217;est maintenant la propriété text du TextBox qui &#8220;remplit&#8221; la propriété Nom de l&#8217;objet Humain. Ceci implique donc trois sens pour les flux de données (noms donnés en anglais).</p>
<ul>
<li><span style="text-decoration: underline;">One Way:</span> la propriété cible change selon les données de la propriété source mais l&#8217;inverse n&#8217;est pas vrai. Ceci convient pour les contrôles de type Read-Only.</li>
<li><span style="text-decoration: underline;">Two Way:</span> le flux de données se propagent dans les deux sens, la propriété est tantôt une propriété source, tantôt une propriété cible. Générallement, nous utiliserons Two Way pour les objets de type formulaire. Par exemple, la propriété Text du TextBox et la propriété IsChecked de l&#8217;objet CheckBox est par défaut Two Way.</li>
<li><span style="text-decoration: underline;">OneWayToSource:</span> il est l&#8217;inverse de OneWay, il met à jour la propriété source lorsqu&#8217;il y a un changement dans la propriété cible.</li>
<li><span style="text-decoration: underline;">One Time</span> (ne se trouve pas dans la figure 2): Initialise la propriété source mais les changements futures ne seront pas propagés. Ce type de &#8220;binding&#8221; (de lien) est utilisé si vous voulez prendre un instantané de l&#8217;état de votre couche métier. Il est plus ou moins équivalent au OneWay mais est plus performant, il est donc à utiliser lorsque les valeurs sont statiques.</li>
</ul>
<p>Comment détecter des changements dans l&#8217;objet source (ceci uniquement pour OneWay et TwoWay) ?</p>
<p>L&#8217;objet doit implémenter un méchanisme de notification, en implémentant l&#8217;interface INotifyPropertyChange (nous verrons pourquoi plus tard).</p>
<p>Que déclenche un changement dans la source ?</p>
<p>Les databindings qui sont TwoWay et OneWayToSource doivent être attentif aux changements de la propriété cible afin de les propagers vers l&#8217;objet source. Le sens du flux de données est assuré par la propriété <a href="http://msdn.microsoft.com/en-us/library/system.windows.data.binding.mode.aspx">Mode </a>de l&#8217;objet Binding.</p>
<p>Cependant, est-ce que la valeur de votre objet source (par exemple la propriété Nom de l&#8217;objet Humain) change t&#8217;elle lorsque vous être entrain de changer cette valeur (lors de la saisie dans le TextBox) ou après que vous ayez fini (de changer la valeur du TextBox) ?</p>
<p>En fait, c&#8217;est la propriété UpdateSourceTrigger qui détermine ce qui va déclencher la mise à jour de l&#8217;objet source.</p>
<p><img class="alignnone size-full wp-image-47" title="dataflowupdatesourcetrigger" src="http://www.fr.dervalp.com/wp-content/uploads/2009/10/dataflowupdatesourcetrigger.png" alt="dataflowupdatesourcetrigger" width="438" height="157" />figure 3 (from MSDN)</p>
<p>Si nous regardons la figure 3, les points représentés aux extrémités des flèches illustrent le rôle de l&#8217;UpdateSourceTrigger.</p>
<p>Si l&#8217;UpdateSourceTrigger à la valeur &#8220;PropertyChanged&#8221;, dès que la valeur dans le textbox changera, la valeur de l&#8217;object source changera également. Par contre, si l&#8217;UpdateSourceTrigger à comme valeur &#8220;LostFocus&#8221;, la valeur de l&#8217;objet source sera propagée lorsque nous nous retirerons du TextBox (passer à un autre textbox par ex.). La valeur par défaut de UpdateSourceTrigger dépend de l&#8217;objet. Pour un TextBox cette valeur est, par défaut, LostFocus. En effet, si nous devrions propager la valeur à chaque fois que nous entrons une lettre dans le textbox, les performances diminueraient, c&#8217;est pour cette raison que la valeur par défaut de UpdateSourceTrigger est LostFocus et non pas PorpertyChanged.</p>
<p>Il existe également pour le textbox une troisième valeur pour UpdateSourceTrigger, Explicit, utilisée par exemple pour mettre à jour la valeur seulement lors d&#8217;un clique de bouton par l&#8217;utilisateur (plus d&#8217;info sur l&#8217;UpdateSourceTrigger : <a href="http://msdn.microsoft.com/en-us/library/system.windows.data.binding.updatesourcetrigger.aspx">ici </a>).</p>
<p>Créer un Binding :</p>
<p>Passons au pratique, nous allons établir un lien à l&#8217;aide de l&#8217;objet binding. Je ne vais pas vous le cacher, pour commencer je vais prendre un exemple MSDN.</p>
<p>Nous avons un object source qui est une classe MyData, elle a une propriété string ColorName dont la valeur est rouge. Nous voulons lier la couleur du background à la valeur ColorName de MyData.</p>
<p>Voici le code en XAML : pour plus d&#8217;info sur la syntaxt du binding (<a href="http://msdn.microsoft.com/en-us/library/ms752300.aspx">ici</a>)</p>
<p><img class="alignnone size-full wp-image-55" title="xaml_exemple11" src="http://www.fr.dervalp.com/wp-content/uploads/2009/10/xaml_exemple11.jpg" alt="xaml_exemple11" width="702" height="207" /></p>
<p>Et voici le code C# :</p>
<p><img class="alignnone size-full wp-image-53" title="cexmple1" src="http://www.fr.dervalp.com/wp-content/uploads/2009/10/cexmple1.jpg" alt="cexmple1" width="493" height="243" /></p>
<p>Ce binding est un binding OneWay en effet, la propriété background du TextBox est par défaut OneWay.</p>
<p><img class="alignnone size-full wp-image-54" title="databinding_backgroundtextboxt" src="http://www.fr.dervalp.com/wp-content/uploads/2009/10/databinding_backgroundtextboxt.png" alt="databinding_backgroundtextboxt" width="440" height="131" />figure 4</p>
<p>Le background property de l&#8217;object textbox est de type brush, néanmoins nous lui passons un string, ceci fonctionne par une conversion implicite (<a href="http://msdn.microsoft.com/en-us/library/ms752347.aspx#data_conversion">plus d&#8217;info ici</a>).</p>
<p>Spécifier le Binding Source :</p>
<p>Ici le binding source est défini spécifiant une valeur au <a href="http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.datacontext.aspx">DataContext</a>. Le DataContext du Window1 est l&#8217;objet MyData. TextBoxt hérite de ce datacontext par l&#8217;objet Window1 (son parent). En donnant le chemin vers la propriété qui doit être lié dans le background du textblock. Celui-ci sera où prendre ces données. Si nous ne définissons aucune valeur pour le datacontext, le background du textbox ne prendrait pas la couleur rouge.</p>
<p>Nous obtenons alors le résultat suivant :</p>
<p><img class="alignnone size-full wp-image-56" title="appli1" src="http://www.fr.dervalp.com/wp-content/uploads/2009/10/appli1.jpg" alt="appli1" width="300" height="300" /></p>
<p>Il est intéressant de définir le datacontext dans un niveau parent lorsque vous voulez utilisez ce contexte pour plusieurs enfants. Dans le cas contraire, vous pouvez définir ce contexte rien que pour l&#8217;élément que vous voulez lier.</p>
<p>La Classe BindingExpression :</p>
<p>Comme défini plus haut, Binding class est la classe haut niveau pour définir un Binding. Le BindingExpression qui est une sous-jacente de l&#8217;objet Binding, cet objet permet de maintenir la connexion entre l&#8217;objet source et l&#8217;objet target. Un objet Binding contient toute l&#8217;information et peut être partagée par plusieurs BindingExpression. Une BindingExpression est une expression d&#8217;instance qui ne peut partager ses informations, elle contient toute l&#8217;information de l&#8217;instance du Binding.</p>
<p><img class="alignnone size-full wp-image-59" title="bindingexpression" src="http://www.fr.dervalp.com/wp-content/uploads/2009/10/bindingexpression.jpg" alt="bindingexpression" width="445" height="106" /></p>
<p>myDataObject est une instance de la classe MyData, myBinding est la source de l&#8217;objet Binding, MyData est une classe qui contient la propriété string MyDataProperty. Cet exemple lie le contenu text d&#8217;une instance de TextBLock myText vers MyDataProperty.</p>
<p>Dans ce cas, vous pouvez réutiliser l&#8217;objet myBinding, par exemple, en liant à un propriété d&#8217;un TextBlock. A ce moment, il n&#8217;y aura qu&#8217;un objet Binding mais deux instances de BindingExpression qui se partage l&#8217;objet Binding.</p>
<p>DataConversion :</p>
<p style="margin: 0cm 0cm 10pt;">Dans l’exemple précédent, la propriété background du Texbox est lié à une propriété string avec la valeur « Red ». Cela fonctionne car le type Brush est capable de convertir un string en un objet Brush .</p>
<p style="margin: 0cm 0cm 10pt;"><a href="http://msdn.microsoft.com/en-us/library/ms752347.aspx#specifying_the_binding_source"><img class="alignnone size-full wp-image-62" title="dataconversion" src="http://www.fr.dervalp.com/wp-content/uploads/2009/10/dataconversion.png" alt="dataconversion" width="438" height="127" /></a>figure 5</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt;"><span style="font-size: small; font-family: Calibri;">Comme l’on peut remarquer sur la figure 5, le Type Brush à une conversion par défaut qui permet de convertir un objet de type string en objet de type Brush. </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt;"><span style="font-size: small; font-family: Calibri;">Que se passerait t&#8217;il si notre objet source avait un type Color pour la propriété ColorName. Nous devrions implémenter l’interface IValueConverter (pour plus d&#8217;info sur IValueConverter, cela se passe <a href="http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx">ici</a>). De cette manière l&#8217;objet binding sait comment convertir un objet Color en objet de type SolidColorBrush.</span></p>
<p style="margin: 0cm 0cm 10pt;"><img class="alignnone size-full wp-image-63" title="ivalueconverter" src="http://www.fr.dervalp.com/wp-content/uploads/2009/10/ivalueconverter.jpg" alt="ivalueconverter" width="1016" height="250" /></p>
<p style="margin: 0cm 0cm 10pt;">Par l&#8217;implémentation de cette inferface, notre schéma devient alors :</p>
<p style="margin: 0cm 0cm 10pt;"><img class="alignnone size-full wp-image-64" title="dataconversionwithivalueconverter" src="http://www.fr.dervalp.com/wp-content/uploads/2009/10/dataconversionwithivalueconverter.jpg" alt="dataconversionwithivalueconverter" width="438" height="127" />figure 6</p>
<p style="margin: 0cm 0cm 10pt;">Généralement, pour les types cible connus, la conversion par défaut devrait fonctionner. En cas de doute, vous devriez implémenter l&#8217;interface IValueConverter.</p>
<p style="margin: 0cm 0cm 10pt;">Voici une liste de cas où l&#8217;utilisation de cette interface est préconisée :</p>
<ul>
<li>
<div style="margin: 0cm 0cm 10pt;">Vos données devront être affichées différement suivant la culture que vous utilisez. Vous pourriez implémenter un convertisseur de change et/ou un convertisseur de date utilisée par une certaine culture.</div>
</li>
<li>
<div style="margin: 0cm 0cm 10pt;">La valeur qui est manipulée ne servira pas à changer la propriété Text du Textbox mais d&#8217;autres valeurs comme une source d&#8217;image, la couleur ou le style de text affiché. Les convertisseurs peuvent alors être utilisés en convertissant des propriétés qui ne semblerait pas lié entres-elles. Comme par exemple, lier la valeur d&#8217;un textbox à une couleur de fond pour une cellule d&#8217;un tableau.</div>
</li>
<li>
<div style="margin: 0cm 0cm 10pt;">Plus d&#8217;un contrôle ou même plusieurs propriétés d&#8217;un contrôle peuvent être liées à une même source. Générallement, le &#8220;Binding&#8221; primaire affichera le texte et d&#8217;autres types de &#8220;Binding&#8221; posséderont certaines particularités sur la manière de relier les éléments entre eux, ceci tout en continuant à utiliser la même source d&#8217;information.</div>
</li>
<li>
<div style="margin: 0cm 0cm 10pt;">Dans le cas où nous utiliserons des <a href="http://msdn.microsoft.com/en-us/library/system.windows.data.multibinding.aspx">MultiBinding </a>, dans ce cas un propriété cible sera lié à une collection de Binding. Dans le cas d&#8217;un multibinding vous utiliserez l&#8217;interface <a href="http://msdn.microsoft.com/en-us/library/system.windows.data.imultivalueconverter.aspx">IMultiValueConverter</a> afin de produire une valeur finale à partir des valeurs contenues dans votre collection de Binding.</div>
</li>
</ul>
<p style="margin: 0cm 0cm 10pt;">Binding to Collection :</p>
<p style="margin: 0cm 0cm 10pt;"><span style="font-size: 10pt; color: black; font-family: &quot;Georgia&quot;,&quot;serif&quot;; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: FR-BE;">Dans un Binding, un objet source peut être soit traité comme un simple objet dans lequel ses propriétés contiennent des données soit comme une collection de données d’objets polymorphiques groupés ensembles (comme le résultat d’une query provenant d’une base de données). Ici nous avons toujours utilisés des objets simples mais nous aurions pu utiliser des ItemsControl comme des ListBox, des ListView, des TreeView afin d’afficher des collections d’objets. </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;"><span style="font-size: 10pt; color: black; font-family: &quot;Georgia&quot;,&quot;serif&quot;; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: FR-BE;"><span style="mso-spacerun: yes;"> <img class="alignnone size-full wp-image-66" title="databindincollectionobjet" src="http://www.fr.dervalp.com/wp-content/uploads/2009/10/databindincollectionobjet.png" alt="databindincollectionobjet" width="438" height="127" />figure 6</span></span></p>
<p>Comme l’on peut remarquer dans le diagramme précédent, pour lié un ItemsControl à une collection d’objet, nous devons utiliser la propriété ItemsSource. ItemsSource est en quelque sorte le contenu du ItemsControl. Par défaut la direction du flux de donnée pour un ItemsControl sera OneWay.</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">Comment implémenter les collections ?</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">Vous pouvez utiliser n’importe quelles collections qui utilisent l’interface IEnumerable. Pour gérer un binding qui permettrait l&#8217;insertion, la suppression ou l&#8217;update de donnée automatiquement retranscrite dans l&#8217;UI, la collection doit implémenter l&#8217;interface <a href="http://msdn.microsoft.com/en-us/library/system.collections.specialized.inotifycollectionchanged.aspx">INotifyCollectionChange</a>. Cette interface permet d&#8217;exposer un évênement qui sera déclenché à chaque changement dans la collection.</p>
<p>WPF founit la classe ObservableCollection(T) qui est une implémentation d&#8217;une collection de donnée qui comprend l&#8217;interface INotifyCollectionChange. A noter que pour supporter le transfert de données entre l&#8217;objet cible et l&#8217;objet source, chaque objet dans la collection doit implémenter l&#8217;interface <a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx">INotifyPropertyChange</a>.</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">Avant d&#8217;utiliser votre propre collection, tentez d&#8217;utiliser ObservableCollection(T) ou l&#8217;une des classes de collection existante comme List(T), Collection(T), BindingList(T), parmis d&#8217;autres.</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">Collection Views</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">Une fois que votre ItemsControl est lié à un collection de données, vous pourriez vouloir trier, filtrer ou grouper les données. Pour faire cela, vous utilisez les collection views, qui sont des classes qui implémente l&#8217;interface <a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.icollectionview.aspx">ICollectionView</a>.</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">Que sont les Collection Views ?</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">Une collection est une couche supérrieur par rapport à une &#8220;binding source collection&#8221; ce qui vous permet de naviguer et d&#8217;afficher la collection source triée, flitrée et groupée en queries, ceci sans changer la source sous-jacente elle même. Une &#8220;collection view&#8221; maintient également un pointeur vers l&#8217;item courant dans la collection. Si la collection source implémente l&#8217;interface INotifyCollectionChange, les changements seront déclenchés par l&#8217;évênement CollectionChanged  qui sera propagé aux vues.</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">Parce ques les vues ne changent pas la collection source adjacente, chaque collection source peut avoir plusieurs vues associées à elle. Par exemple, vous pourriez avoir une collection d&#8217;objets Task. Avec l&#8217;utilisation de vues, vous pourriez afficher la même donnée sous différentes vues. Par exemple, à gauche vous afficheriez les Tasks triées par priorité et de l&#8217;autre triée par date.</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">Commen créer une vue ?</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">Une façon de créer et utiliser une vue est d&#8217;instancier les objets vues directement et les utiliser comme source pour le binding.</p>
<p><a href="http://msdn.microsoft.com/en-us/library/ms752347.aspx#specifying_the_binding_source"><img class="alignnone size-full wp-image-69" title="collectionviewsource" src="http://www.fr.dervalp.com/wp-content/uploads/2009/10/collectionviewsource.jpg" alt="collectionviewsource" width="653" height="267" /></a>figure 7</p>
<p><a href="http://msdn.microsoft.com/en-us/library/ms752347.aspx#specifying_the_binding_source"><img class="alignnone size-full wp-image-70" title="listboxwithcollectionview" src="http://www.fr.dervalp.com/wp-content/uploads/2009/10/listboxwithcollectionview.jpg" alt="listboxwithcollectionview" width="610" height="84" /></a>figure8</p>
<p>Comme nous voyons dans l&#8217;exmple ci-dessus qui provient de MSDN, nous pouvons voir que le ListBox à pour Object source un CollectionViewSource lui-même lié à une liste d&#8217;objet AuctionItems . Vous pourriez réutililiser ce CollectionViewSource pour un autre type de contrôle, ce qui est important ici est de ne pas oublié de définir le x:Key dans la CollectionViewSource afin de que le contrôle puisse savoir où il va chercher ses données.</p>
<p>Le tableau suivant nous montre quels types de données (vue) sont crées comme CollectionView par défaut (IList -&gt; ListCollectionView). Le résultat serait le même si nous utiliserions un CollectionViewSource afin de créer les CollectionViews.</p>
<p><img class="alignnone size-full wp-image-71" title="sourcecollectiontypetocollectionviewtype" src="http://www.fr.dervalp.com/wp-content/uploads/2009/10/sourcecollectiontypetocollectionviewtype.jpg" alt="sourcecollectiontypetocollectionviewtype" width="983" height="138" /></p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">Utiliser une Default View</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">Spécifier une collection view comme un &#8220;binding&#8221; source est une des solutions pour créer et utiliser des collection view. WPF crée également une default collection view pour chaque collection utilisée comme source du binding. Is vous liez directement un contrôle, WPF la lie à sa vue par défaut. Cette vue par défaut est partagée par tout les &#8220;bindings&#8221; de la même collection, donc un changement fait à la vue par défaut par un contrôle lié ou du code (trier, filtrer,&#8230;) est reflétée dans tous les autres bindings de la même collection.</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">Collection Views avec ADO.NET DataTables</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">En vue d&#8217;améliorer les performances, les collection views pour ADO.NET DataTable ou les DataView délèguent le tri, les filtres au DataView. En conséquent, le tri et le filtrage sera partagé à travers toutes les collections du datasource. Afin de mettre en place le tri et le filtrage sur chaque collection view, vous devez initialiser chaque collection view avec son propre DataView object.</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">Sorting</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">Comme mentioné ci-dessus, les vues peuvent trier un collection. Comme il existe dans la collection adjacente, vos données pourraient ne pas être dans un ordre pertinant. La vue au dessous de cette collection adjacente vous permet d&#8217;imposer un ordre et de changer l&#8217;ordre par défaut, basé sur des critères de comparaison que vous définissez. Parceque c&#8217;est un client-based view des données, un scénario commun pourrait être un utisateur qui veut trier les colonnes d&#8217;un tableau suivant ses valeurs correspondantes. En utilisant les vues, ce tri personnalisé pourrait être appliqué, et ce, sans faire de changement dans la collection de la couche adjacente et sans devoir faire de query dans cette couche adjacente (plus d&#8217;info <a href="http://msdn.microsoft.com/en-us/library/ms745786.aspx">ici</a>).</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">Voici un exemple de tri qui trie par Catégorie et par StartDate :</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;"><img class="alignnone size-full wp-image-73" title="databindingsorting" src="http://www.fr.dervalp.com/wp-content/uploads/2009/10/databindingsorting.jpg" alt="databindingsorting" width="620" height="181" /></p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">Vous pouvez trouver un exmple de binding intéressant sur MSDN, <a href="http://msdn.microsoft.com/en-us/library/ms771319.aspx">ici</a>.</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">Filtering :</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">Une vue peut également appliquer un filtre à une collection. Cela ne permet d&#8217;afficher qu&#8217;un sous-esemble d&#8217;une collection. Vous pouvez également trier sous des conditions personnalisées.</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">Voici un exemple de filtre qui provient de la démo fournie par MSDN.</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;"><img class="alignnone size-full wp-image-74" title="filtering" src="http://www.fr.dervalp.com/wp-content/uploads/2009/10/filtering.jpg" alt="filtering" width="634" height="83" /></p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">The ShowOnlyBargainsFilter event handler</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;"><img class="alignnone size-full wp-image-75" title="filtering2" src="http://www.fr.dervalp.com/wp-content/uploads/2009/10/filtering2.jpg" alt="filtering2" width="567" height="274" /></p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">Grouping :</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">Exepté pour les classe internal qui sont retranscrite en IEnumerable collection, toutes les collections views supporte la fonctionnalité de grouping. Ceci permets aux utilisateurs de subdiviser la collection dans la collection view dans un groupe logique. Les groupes peuvent être explicite, l&#8217;utilisateur fournit une liste de groups ou implitcit, les groups sont générés dynamiquement dépendamment des données.</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">Voici un exemple de fonction de grouping :</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;"><img class="alignnone size-full wp-image-76" title="addgrouping" src="http://www.fr.dervalp.com/wp-content/uploads/2009/10/addgrouping.jpg" alt="addgrouping" width="650" height="128" /></p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">Pointer sur l&#8217;item actuel:</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">Les vues supportent également la notion d&#8217;item actuel. Vous pourriez naviguer à travers les objets dans une collection view. Pendant que vous naviguer, vous passez d&#8217;un item à un autre et un pointeur d&#8217;item vous permet de retirer les informations de l&#8217;item actuel.</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">Comme WPF est lié à une collection uniquement en utilisant une vue, toutes les liaisons vers les collections possèdent ce pointeur d&#8217;item. Quand vous liez à une vue le caractère &#8220;/&#8221; désigne le chemin vers la valeur actuel. Dans l&#8217;exemple suivant, le data context est une collection view, le premier binding est lié à la collection, le second binding est lié à l&#8217;item actuel de la collection et le troisième est lié à la propriété Description de l&#8217;item actuel.</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">Ex :</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;"><a href="http://msdn.microsoft.com/en-us/library/ms752347.aspx#specifying_the_binding_source"><img class="alignnone size-full wp-image-78" title="bindingpath" src="http://www.fr.dervalp.com/wp-content/uploads/2009/10/bindingpath.jpg" alt="bindingpath" width="390" height="72" /></a></p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">Le Master Detail Binding Scenario</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">La notion d&#8217;item actuel est utile pour le Master Detail Binding Scenario. Si nous regardons dans l&#8217;exemple ci-dessous où le contenu du ListBox détermine le contenu affiché dans le ContentControl. Vous pouvez déterminer le Master Detail Binding scenario en liant deux ou plus contrôle à une même vue.</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;"><img class="alignnone size-full wp-image-80" title="masterdetailscenario" src="http://www.fr.dervalp.com/wp-content/uploads/2009/10/masterdetailscenario.jpg" alt="masterdetailscenario" width="596" height="300" /></p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">Ces deux contrôles sont liés à une même vue (listingDataView). Cette exemple marchera car lorsque un objet singleton (ici ContentControl) est lié à une collection view, il est automatiquement à l&#8217;item actuel (CurrentItem) de la vue. Si le list control n&#8217;est pas lié à un objet CollectionViewSource comme dans l&#8217;exemple, alors, vous devriez définir la propriété <a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.selector.issynchronizedwithcurrentitem.aspx">IsSynchronizedWithCurrentItem </a>à &#8220;true&#8221; pour que cela fonctionne. L&#8217;exemple ci-dessous ne fonctionnerait pas si il n&#8217;utiliserait pas un template (voir prochain article).</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">DataTemplate :</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">Je reviendrai dans un prochaine sur l&#8217;utilisation de DataTemplate.</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">En attendant, voici une série de lien qui pourra vous être utiles :</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">
<p><a href="http://msdn.microsoft.com/en-us/library/ms752347.aspx#specifying_the_binding_source">http://msdn.microsoft.com/en-us/library/ms752347.aspx#specifying_the_binding_source</a></p>
<p><a href="http://msdn.microsoft.com/en-us/library/ms752347.aspx#data_conversion">http://msdn.microsoft.com/en-us/library/ms752347.aspx#data_conversion</a></p>
<p><span style="text-decoration: underline;"><span style="color: #0066cc;"><a href="http://msdn.microsoft.com/en-us/library/ms752347.aspx#data_conversion">http://msdn.microsoft.com/en-us/library/ms752347.aspx#data_conversion</a></span></span></p>
<p><a href="http://msdn.microsoft.com/en-us/library/dd458894.aspx">http://msdn.microsoft.com/en-us/library/dd458894.aspx</a></p>
<p><a href="http://msdn.microsoft.com/en-us/magazine/cc163299.aspx">http://msdn.microsoft.com/en-us/magazine/cc163299.aspx</a></p>
<p><a href="http://odetocode.com/articles/740.aspx">http://odetocode.com/articles/740.aspx</a></p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt; line-height: 14.25pt;">
]]></content:encoded>
			<wfw:commentRss>http://www.fr.dervalp.com/?feed=rss2&amp;p=36</wfw:commentRss>
		</item>
		<item>
		<title>Questions d&#8217;interview pour C#</title>
		<link>http://www.fr.dervalp.com/?p=171</link>
		<comments>http://www.fr.dervalp.com/?p=171#comments</comments>
		<pubDate>Mon, 23 Nov 2009 12:44:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://www.fr.dervalp.com/?p=171</guid>
		<description><![CDATA[Questions générales :
1) C# supporte t&#8217;il l&#8217;héritage multiple ?
non

2) Pour qui sont disponibles les variables de type Protected comprises dans une classe ?
Pour toutes les sous-classes de la classe comprenant ces variables de type protected.
3) Est-ce que les variables de type privées sont héritées ?
Oui, mais elles ne sont pas accessibles. Bien qu&#8217;elles ne soient [...]]]></description>
			<content:encoded><![CDATA[<h2>Questions générales :</h2>
<p><strong>1) C# supporte t&#8217;il l&#8217;héritage multiple ?</strong></p>
<p>non<a href="plugins.php"><br />
</a></p>
<p><strong>2) Pour qui sont disponibles les variables de type Protected comprises dans une classe ?</strong></p>
<p>Pour toutes les sous-classes de la classe comprenant ces variables de type protected.</p>
<p><strong>3) Est-ce que les variables de type privées sont héritées ?</strong></p>
<p>Oui, mais elles ne sont pas accessibles. Bien qu&#8217;elles ne soient ni visibles et ni accessibles, elles sont héritées. Si vous voulez la rendre accessible aux sous-classes, vous devez utilisez une variable protected.</p>
<p><strong>4) Décrire l&#8217;accessibilité du &#8220;protected internal&#8221; ?</strong></p>
<p>Sera disponbile pour les classes qui se trouvent dans le même assembly et qui sont dérivés de cette classe de base.</p>
<p><strong>5) De quelle classe sont dérivés tous les objets en .NET  ?</strong></p>
<p>System.Object.</p>
<p><strong>6) Que veut dire le terme &#8220;immutable&#8221; (immuable en Français) ?</strong></p>
<p>Que la valeur de donnée (datavalue) ne peut-être changée. La valeur d&#8217;une variable peut être changée mais on est alors débarrasé de la valeur de données immuable et une nouvelle valeur de données a été créée.</p>
<p><strong>7) Quelle est la différence entre les classes System.String et System.Text.StringBuilder ?</strong></p>
<p>System.String est immuable. Stringbuilder a été créé pour manipuler des strings muables où des opérations sur ceux-ci peuvent être réalisées.</p>
<p><strong>8 ) Quelle est l&#8217;avantage d&#8217;utiliser StringBuilder plutôt que String ?</strong></p>
<p>Stringbuilder est plus performant si il faut manipuler un grand montant de string. String est immuable, c&#8217;est à dire qu&#8217;il recrée une nouvelle instance en mémoire à chaque fois que sa valeur change.</p>
<p><strong>9) Pouvez-vous utiliser plusieurs types dans un System.Array ?</strong></p>
<p>non</p>
<p><strong>10) Quelle est la différence entre System.Array.CopyTo() et System.Array.Clone() ?</strong></p>
<p>La méthode copy retourne un nouvel array (shallow copy (copie peu profonde, frivole)) d&#8217;objets contenant tous les éléments de l&#8217;array original. La méthode CopyTo() copie les éléments de l&#8217;array original dans un array existant. Les deux réalisent une copie peu profonde. Une copie peu profonde est le fait que le contenu (chaque élément d&#8217;un array) contiennent les références des mêmes objets que les éléments de l&#8217;array orginel. Une copie profonde (deep copy) aurait crée une nouvelle instance de chaque élément de l&#8217;objet orignal.</p>
<p><strong>11) Comment trier un array dans le sens décroissant ?</strong></p>
<p>On utilise la méthode Sort() et ensuite la méthode Reverse().</p>
<p><strong>12) Quelle classe de collection peut-on utiliser pour accéder un de ses éléments par une clé d&#8217;accès ?</strong></p>
<p>HashTable</p>
<p><strong>13) Quelle classe se trouve à un niveau plus bas de Sorted List ?</strong></p>
<p>Sorted HashTable</p>
<p><strong>14) Dans un try catch, est-ce que le block &#8220;finally&#8221; sera exécuté si une exeption ne se produit  pas?</strong></p>
<p>oui</p>
<p><strong>15) Quelle est la syntaxe qui permet de saisir toutes les exeptions possibles ?</strong></p>
<p>Un catch qui intercepterait les exeptions de type System.Exception. Si vous utilisez le catch par défaut (catch{}), cela aura le même effet.</p>
<p><strong>16) Peut-on avoir plusieurs catch exécutés lors d&#8217;un même try ?</strong></p>
<p>non, le contrôle sera exécuté dans la partie finally du try.</p>
<p><strong>17) Quels sont les 3 parties d&#8217;une 3-tiers application ?</strong></p>
<p>Presentation (UI), Business , Data</p>
<h2>Question sur les classes :</h2>
<p><strong>1) Quelle est la syntaxe pour hériter d&#8217;un classe en C# ?</strong></p>
<p>NomdelaClasseEnfant : NomdelaClasseParent</p>
<p><strong>2) Pouvez-vous empêcher une classe d&#8217;être hériter par une autre classe ?</strong></p>
<p>Oui en utilisant le keyword &#8220;sealed&#8221;.</p>
<p><strong>3) Pouvez-vous permettre à une classe d&#8217;être héritable mais empêcher qu&#8217;une de ses méthodes soit &#8220;overrider&#8221; ?</strong></p>
<p>Oui, il faut rendre la classe public et la méthode &#8220;sealed&#8221;.</p>
<p><strong>4) Qu&#8217;est-ce qu&#8217;une classe abstraite ?</strong></p>
<p>C&#8217;est une classe qui ne peut-être instanciée, c&#8217;est une classe qui peut être héritée et qui peut posséder des méthodes qui peuvent-être spécialisée  (&#8221;overrider&#8221;). Une classe abstaite est générallement une emprunte pour d&#8217;autres classes.</p>
<p><strong>5) Quand devez-vous absolument définir une classe abstaite ?</strong></p>
<p>- lorsqu&#8217;au moins une des méthodes est abstraite</p>
<p>- lorsq&#8217;une classe est elle-même héritée d&#8217;une classe abstraite et que toute ses méthodes abstraites héritées n&#8217;ont pas été redéfinir (&#8221;overrider&#8221;).</p>
<p><strong>6) Qu&#8217;est-ce qu&#8217;une interface ?</strong></p>
<p>Les interfaces, comme les classes définissent une série de propriété, méthodes, évênements. Mais contrairement au classe, les intefaces ne fournissent pas d&#8217;implémentation. Elles sont implémentées par des classes</p>
<p><strong>7) Pourquoi ne pouvez-vous pas définir d&#8217;accesseur pour une méthode à l&#8217;intérieur d&#8217;une interface ?</strong></p>
<p>Elles doivent toutes être publique, elles sont donc public par défaut.</p>
<p><strong>8 ) Pouvez-vous hériter de plusieurs interfaces ?</strong></p>
<p>oui, .NET supporter le multi-héritage d&#8217;interface</p>
<p><strong>9) Pouvez-vous hériter de plusieurs interfaces qui ont des méthodes de même nom et même signature ?</strong></p>
<p>Oui vous pouvez, mais il risque d&#8217;y avoir quelques problèmes. Si le compilateur est ok, cela devrait passer. PS : En testant, j&#8217;ai remarqué vous pouviez, en effet, hériter de plusieurs interfaces qui ont des méthodes de même nom, mais alors nous devons en choisir une qui sera public, les autres seront marquées privées. Enfin, je déconseillerais de réaliser ce genre de chose.</p>
<p><strong>10) Quel est la différence entre une classe abstraite et une interface ?</strong></p>
<p>Dans une inteface, toutes les méthodes sont abstraites, il n&#8217;y pas d&#8217;implémentation. Dans une classe abstraite, les méthodes peuvent-être non abstraite mais il n&#8217;y a pas d&#8217;implémentation. On peut, également, hériter de plusieurs interfaces alors qu&#8217;on ne peut hériter que d&#8217;une classe abstraite.</p>
<p><strong>11) Quel est la différence entre une struct et une classe ?</strong></p>
<p>Les Strucs sont des variables &#8220;value type&#8221; et sont donc sauvés dans la stack, ils augmentent la taille en mémoire mais augmentent les performances d&#8217;accès. Les structs ne peuvent pas être héritées.</p>
<h2>Questions sur les méthodes et les propriétés :</h2>
<p><strong>1) Quel est le nom implicite du paramètre qui est passé à l&#8217;intérieur de la méthode/propriété set d&#8217;une classe?</strong></p>
<p>La réponse est Value. Le type de la donnée value est définie par le type de la propriété qui est déclarée.</p>
<p><strong>2) Que veut dire le keyword &#8220;vitrual&#8221; devant une propriété et/ou une méthode ?</strong></p>
<p>Que la méthode et/ou propriété peut être redéfinie (&#8221;overrider&#8221;)?</p>
<p><strong>3) En quoi la redifinission (&#8221;overrider&#8221;) d&#8217;une méthode est telle différente de la surchage d&#8217;une méthode (overload) ?</strong></p>
<p>Quand vous redéfinissez une méthode, vous changer le comportement de la classe dérivée (vous spécialisez la méthode à sa classe concrète). La surchage d&#8217;une méthode entraîne juste le fait d&#8217;avoir plusieurs méthodes avec le même nom dans une classe. Ces méthodes ne possèderont pas la même signature.</p>
<p><strong>4) Pouvez-vous redéfinir (&#8221;override&#8221;) une méthode et la rendre statique, si celle-ci ne l&#8217;était pas dans sa classe de base ?</strong></p>
<p>Non, la signature de la méthode doit rester la même (on ne peut changer override que par virtual).</p>
<p><strong>5) Quelles sont les différentes manières de surcharger une méthode ?</strong></p>
<p>Différents paramètres (data type), nombre de paramètres différents, ordre dont les parramètres sont passés.</p>
<p><strong>6) Si une classe de base à un nombre certain de constructeurs surchargés, et la classe héritée a un certain nombre de constructeurs surchargés également, pouvez-vous forcer l&#8217;appel du constructeur de la classe de base depuis la classe spécifique?</strong></p>
<p>oui, ajouter &#8220;:base()&#8221; et entre les parenthèses, les paramètres que vous voulez réutiliser de votre classe de base.</p>
<h2>Events and delegates :</h2>
<p><strong>1) Qu&#8217;est qu&#8217;un delegates ?</strong></p>
<p>Un delegate encapsule un référencement vers une méthode.</p>
<p><strong>2) Qu&#8217;est ce qu&#8217;un multicast delegates ?</strong></p>
<p>Un délégate qui a plusieurs méthodes référencées (handler), toutes ces méthodes seront appelées.</p>
<h2>XML - Documentation :</h2>
<p><strong>1) XML est-il sensible à la case ?</strong></p>
<p>oui</p>
<p><strong>2) Quelles sont les différences entre // , /// ,/* */ ?</strong></p>
<p>// =&gt; commentaire sur une ligne</p>
<p>/// =&gt; commentaire en XML</p>
<p>/* */ =&gt; commentaire multi-ligne</p>
<p><strong>3) Comment générer de la documentation depuis des commentaires appartenant à un fichier C# avec un compiler en ligne de commande ?</strong></p>
<p>Compilez le avec la balise /doc</p>
<h2>Debugging et questions sur les tests :</h2>
<p><strong>1) Quel(s) outil(s) de debugging est fourni avec le sdk .NET ?</strong></p>
<p>- CorDBG : command line debugger. Pour utiliser le CordDBG vous devez compiler en ligne de commande avec l&#8217;attribu /debug.</p>
<p>- DbgCLR : le debugger en mode graphique, utilisé par Visual Studio.</p>
<p><strong>2) Que fait la méthode Assert() ?</strong></p>
<p>En debug, assert prend une condition booléene comme paramètre et montre la boîte de dialog error si la condition est fausse. Le programme s&#8217;exécutera si la condition est vrai.</p>
<p><strong>3) Quelle est la différence entre la classe debug et la classe trace ?</strong></p>
<p>La documentation semble la même, utilisez la classe debug pour debulg build, utilisez la classe Trace pour les builds debug et release.</p>
<p><strong>4) Où la sortie de TextWriterTraceListener est-il redirigé ?</strong></p>
<p>Soit dans une console, soit dans un fichier, dépendant des paramètres qui lui sont passés.</p>
<p><strong>5) Comment débugger une application ASP.NET </strong>?</p>
<p>Attachez le process aspnet_wp.exe au débugger dbgclr;</p>
<p><strong>6) Quels sont les trois types de test vous devriez tester dans vos tests unitaires ?</strong></p>
<p>- Un cas de test positif : donnée correcte, sortie correcte.</p>
<p>- Un cas de test négatif : donnée incorrecte ou manquante et exécution propre.</p>
<p>- Un cas d&#8217;exeption : vérifier si les exceptions sont gérer correctement.</p>
<p><strong>7) Pouvez-vous changer la valeur d&#8217;une variable pendant que vous debugger une application C# ?</strong></p>
<p>Oui, si nous débuggons via Visual Studio .NET, se rendre sur Immediate Window.</p>
<h2>ADO.NET et Database :</h2>
<p>1) Quel est le rôle de la classe DataReader dans ADO.NET ?</p>
<p>Un DataReader retourne un ensemble de row, read-only et forward-only à partir d&#8217;un datasource.</p>
<p><strong>2) Quels sont les avantages et les inconvénients des data provider fourni par Microsoft dans ADO.NET ?</strong></p>
<p>SqlServer.NET data provider une solution performante et robuste pour accéder à un serveur SQL. Cependant microsoft fournit une classe OLE-DB.NET qui permet d&#8217;accéder aussi-bien des base de données Oracle, DB2,&#8230; Cependant, cette couche n&#8217;est pas aussi performante et efficace que la couche d&#8217;accès pour Sql Server.</p>
<p><strong>3) Quel est le caractère de remplacement (wild card) en SQL ?</strong></p>
<p>Réponse : %, utiliser avec LIKE dans les query SQL.</p>
<p><strong>4) Expliquez les règles d&#8217;or ACID pour les transactions ?</strong></p>
<p>Une transaction doit être:</p>
<p>- Atomic : cette unité de travail ne doit pas dépendre des transactions précédentes ou futures.</p>
<p>- Consistent : Les données doivent être conformes et un système de roll-back doit être mis en place. Il ne dois pas y avoir de valeur &#8220;in-between&#8221;, le cas ou une partie a été mise à jour et pas l&#8217;autre.</p>
<p>- Isolated : aucune transaction ne voit le résultat intermédiare de la transaction actuelle.</p>
<p>- Durable :  La donnée doit persistée si elle est conforme même si par après le système plante.</p>
<p><strong>5) Quels types de connections supportent SQL Server ?</strong></p>
<p>Windows Authentication (via Active Directory) et SQL authentication (via SQL Server avec un login et un mot de passe).</p>
<p><strong>6) Entre windows authentication et sql server authentication, lequel est &#8220;trusted&#8221;, lequel ne l&#8217;est pas ?</strong></p>
<p>Windows authentication est trusted car le usernam et le password est vérifié par Active Directory, Sql server est untrusted car il est le seul à participer</p>
<p><strong>7) Qu&#8217;est ce que définit le &#8220;initial catalog&#8221; dans le connexion string ?</strong></p>
<p>le nom de la database</p>
<p><strong> <img src='http://www.fr.dervalp.com/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> Que fait la méthode Dispose avec l&#8217;objet Connection ?</strong></p>
<p>il le supprime de la mémoire.</p>
<p><strong>9) Quel est le prérequis pour un connection pooling ?</strong></p>
<p>La procédures multiples doivent accepter de partarger la même connection, tout les paramètres doivent être les mêmes (paramètres de sécurité inclus). Le connection string doit être identique.</p>
<h2>Assembly :</h2>
<p><strong>1) Quels sont les possibilités pour déployer un assembly ?</strong></p>
<p>un MSI Installer, une archive CAB, la commande XCOPY</p>
<p><strong>2) Qu&#8217;est ce qu&#8217;un assembly satellite ?</strong></p>
<p>Lorsque vous écrivez une application multi-lingue et/ou multi-cultures en .NET, vous voulez distribuer le core de l&#8217;application séparrément de ces modules localisés. Les assembly localisées sont alors des assembly satellite.</p>
<p><strong>3) Quels sont les namespace à incorporer pour une application localisée ?</strong></p>
<p>System.Globalization et System.Ressources</p>
<p><strong>4) Quelle est la plus petite unité d&#8217;exécution en .NET ?</strong></p>
<p>un assembly</p>
<p><strong>5) Quand devez-vous appeler le Garbage Collector en .NET ?</strong></p>
<p>Normalement jamais. Néanmoins, vous pouvez appeler le Garbage collector lorsque vous vous débarasser d&#8217; objets conséquents en mémoire dont vous n&#8217;avez plus l&#8217;utilité.</p>
<p><strong>6) Quel nom porte l&#8217;action de convertir un value-type en reference-type?</strong></p>
<p>Boxing</p>
<p><strong>7) Que se passe t&#8217;il en mémoire lorsque vous &#8220;boxez&#8221; une valute-type en reference type ?</strong></p>
<p>L&#8217;objet créé par boxing se mémorisera dans le heap (passage du stack au heap). Unboxing est l&#8217;opération inverse, il convertit un type référence en un value-type, c&#8217;est à dire passage du heap au stack.</p>
<h2>Conclusion :</h2>
<p>Je rajouterai au fur et à mesure de nouvelles questions, mon but étant de faire une sorte de FAQ sur le C# à connaître avant de passer une interview.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fr.dervalp.com/?feed=rss2&amp;p=171</wfw:commentRss>
		</item>
		<item>
		<title>Conversions entre nombres et chaînes de caractères en C#</title>
		<link>http://www.fr.dervalp.com/?p=149</link>
		<comments>http://www.fr.dervalp.com/?p=149#comments</comments>
		<pubDate>Thu, 19 Nov 2009 15:17:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://www.fr.dervalp.com/?p=149</guid>
		<description><![CDATA[Pour commencer, précisons que C# ne permet pas (contrairement à VB) des conversions implicites avec perte de précision. Par contre, C# autorise les conversions implicites si le type destinataire peut s&#8217;accomodé de toutes les valeurs du type source. Ceci est appelé une &#8220;widening conversion&#8221;.
Voici un exemple de &#8220;widening conversion&#8221; :
int i = 1;
double d = [...]]]></description>
			<content:encoded><![CDATA[<p>Pour commencer, précisons que C# ne permet pas (contrairement à VB) des conversions implicites avec perte de précision. Par contre, C# autorise les conversions implicites si le type destinataire peut s&#8217;accomodé de toutes les valeurs du type source. Ceci est appelé une &#8220;widening conversion&#8221;.</p>
<p>Voici un exemple de &#8220;widening conversion&#8221; :</p>
<p>int i = 1;</p>
<p>double d = 1.000001;</p>
<p>d = i ; // convertion OK</p>
<p>Si le type source à un range et une précision plus grande que celle du destinataire on parle alors de &#8220;norrowing conversion&#8221;. Ceci requiert une conversion explicite. Ce type de conversion est source d&#8217;erreur si la valeur source dépasse le range du type destinataire. Dans ce cas, si la conversion entre ces types n&#8217;est pas définie, vous recevrez une erreur de compilation.</p>
<p>Autre type de casting donc, le norrowing conversion :</p>
<p>double d = 1.000001;</p>
<p>int i = 1;</p>
<p>i = int (d);</p>
<p><span style="text-decoration: underline;"><strong>Boxing :</strong></span> C&#8217;est convertir un type valeur (int, double, float,&#8230;) en un type référence. Ci-dessous nous convertissons un int (type valeur) en un objet (type référence).</p>
<p>int i = 124;</p>
<p>object o = (object) i ;</p>
<p><span style="text-decoration: underline;"><strong>UnBoxing :</strong></span> C&#8217;est convertir un type objet en un type valeur. Convertir un objet en int.</p>
<p>object o = 123;</p>
<p>int i = (int)o;</p>
<p>La pratique du Boxing et de l&#8217;Unboxing est assez coûteux en performance et vous devriez éviter de l&#8217;utiliser trop souvent à l&#8217;intérieur de tâches répétitives. Le boxing intervient également lorsque l&#8217;on appele une méthode virtuel d&#8217;une structure ou d&#8217;un type valeur qui hérite de System.Objet, comme ToString(). Les conseils suivant évitent les boxing non-nécessaires</p>
<ul>
<li>Implémenter des méthodes spécifiques par type que nous voulons utiliser. Ceci est utile lorsque cette méthode doit être capable d&#8217;interpréter plusieurs types de valeurs.</li>
<li>Utiliser les génériques plutôt que de coder à partir du system.object.</li>
<li>Override les méthodes ToString, Equals, GetHash virtual lorsque l&#8217;on définit une structure.</li>
</ul>
<p><strong>Comment implémenter la conversion pour un type personnalisé ?</strong></p>
<ul>
<li>Définir les opérateurs de convesion pour simplifier le narrowing  (perte de taille et précision) et le widening (augmentation de la taille et de la précision) entre les types numériques.</li>
<li>Override la méthode ToString pour définir les conversions vers le type string. Override la méthode Parse pour les conversions depuis string.</li>
<li>Implémentez System.IConvertible pour permettre la conversion à travers System.Convert. Utilisez cette technique pour définir la conversion spécique aux cultures.</li>
<li>Implémentez une classe TypeConverter qui permet la conversion lors du design-time pour utiliser les propriétés window de Visual Studio.</li>
</ul>
<p>Vous pouvez également définir les opérations implicit et explicit pour vos classes personnalisées, de cette manière vous autoriserez le casting (widening et narrowing) pour vos classes.</p>
<p>Voici un exemple d&#8217;implémentation de casting pour une classe personnalisée :</p>
<p><img class="alignnone size-full wp-image-158" title="customstruccasting" src="http://www.fr.dervalp.com/wp-content/uploads/2009/11/customstruccasting.png" alt="customstruccasting" width="442" height="440" /></p>
<p>Et l&#8217;implémentation :</p>
<p><img class="alignnone size-full wp-image-159" title="customstruccastingapp" src="http://www.fr.dervalp.com/wp-content/uploads/2009/11/customstruccastingapp.png" alt="customstruccastingapp" width="565" height="155" /></p>
<p>J&#8217;espère que ses explications vous serviront à mieux comprendre les conversions en C#. Si vous avez des remarques, n&#8217;hésitez-pas à m&#8217;en faire part.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fr.dervalp.com/?feed=rss2&amp;p=149</wfw:commentRss>
		</item>
	</channel>
</rss>
