<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-111658602890372617</id><updated>2011-12-19T19:35:25.479+01:00</updated><category term='mvc'/><category term='Politique'/><category term='ERP 360'/><category term='Architecture'/><category term='sql'/><category term='WCF'/><category term='Article'/><category term='Troll'/><category term='Astuce'/><category term='asp.net'/><category term='Outils'/><category term='Société'/><category term='Winforms'/><category term='Clickonce'/><category term='Silverlight'/><title type='text'>Marc Chouteau</title><subtitle type='html'>La bonne humeur est l'essence des braves.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default?start-index=101&amp;max-results=100'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>134</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-1988978559749583808</id><published>2011-02-23T16:29:00.001+01:00</published><updated>2011-02-23T16:33:51.726+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Astuce'/><category scheme='http://www.blogger.com/atom/ns#' term='mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><title type='text'>Comment masquer un referer sur un lien sortant avec asp.net mv3</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Pour diverses raisons il est indispensable de masquer le referer d’un lien sortant dans un site, par exemple lors d’un click dans un extranet ou certains paramètres de l’url peuvent apparaitre et devenir un point d’entrée pour une tentative d’intrusion.&lt;/p&gt;  &lt;p&gt;Pour eviter de montrer des informations aux sites distants voici un exemple ce que 'qu’il est possible de faire :&lt;/p&gt;    &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:819d38f5-7032-4671-9684-d79557b66d0b" class="wlWriterEditableSmartContent"&gt;&lt;img style="border:0; width: 900px; height: 229px;" src="http://lh3.ggpht.com/_vatZwuxxe78/TWUnvCnp5zI/AAAAAAAAA7s/_6EvobdfLIc/transformedimage%5B3%5D.png?imgmax=800" /&gt;&lt;/div&gt;      &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" class="wlWriterSmartContent"&gt;on peut voir ligne 11 ce qu’il faut obtenir , une nouvelle methode d’extension de UrlHelper dans la responsabilité sera d’encoder le lien &lt;a href="http://www.google.fr"&gt;http://www.google.fr&lt;/a&gt;&lt;/div&gt;      &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" class="wlWriterSmartContent"&gt;voici le détail de la methode :&lt;/div&gt;      &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:284b529b-4cb2-42e7-83fc-5b9f6d7c9e82" class="wlWriterEditableSmartContent"&gt;&lt;img style="border:0; width: 900px; height: 247px;" src="http://lh6.ggpht.com/_vatZwuxxe78/TWUnv78pUAI/AAAAAAAAA7w/2P3h2VhsAuo/transformedimage%5B8%5D.png?imgmax=800" /&gt;&lt;/div&gt;      &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" class="wlWriterSmartContent"&gt;L’idée est de récuperer l’url “http://www.google.fr” et d’encoder la chaine de caractère en base 64 pour qu’elle passe correctement en paramètre meme si elle a elle meme des paramètres, on peut voir que l’url de redirection sera redirect?url=XXX&lt;/div&gt;      &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" class="wlWriterSmartContent"&gt;dans global.asax on va indiquer au gestionnaire de routes comment il doit traiter cette url :&lt;/div&gt;      &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:cfbbdd37-0ff7-4aa1-8132-a9a259ff847e" class="wlWriterEditableSmartContent"&gt;&lt;img style="border:0; width: 900px; height: 307px;" src="http://lh3.ggpht.com/_vatZwuxxe78/TWUnw13edoI/AAAAAAAAA70/NEeJSgtA0os/transformedimage%5B12%5D.png?imgmax=800" /&gt;&lt;/div&gt;    &lt;p&gt;Ligne 5 on indique l’action que doit effectuer le controller home dont voici le code :&lt;/p&gt;    &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:dc86dcdc-0c13-41d9-97df-6efc647a358b" class="wlWriterEditableSmartContent"&gt;&lt;img style="border:0; width: 900px; height: 423px;" src="http://lh3.ggpht.com/_vatZwuxxe78/TWUnxgUL3YI/AAAAAAAAA74/zv8HqJr8toI/transformedimage%5B17%5D.png?imgmax=800" /&gt;&lt;/div&gt;      &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" class="wlWriterSmartContent"&gt;&lt;/div&gt;      &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" class="wlWriterSmartContent"&gt;on recupere le parametre url encodé en base64, on le décode et on retourne du code html généré dont le but sera d’utiliser la balise meta refresh pour justement masquer la precedente url, voici le resultat :&lt;/div&gt;      &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" class="wlWriterSmartContent"&gt;&lt;/div&gt;    &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_vatZwuxxe78/TWUnyCfm1lI/AAAAAAAAA78/H25QWWerQiM/s1600-h/image%5B3%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_vatZwuxxe78/TWUny-7rxGI/AAAAAAAAA8A/6T3Ltel3l6I/image_thumb%5B1%5D.png?imgmax=800" width="833" height="633" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" class="wlWriterSmartContent"&gt;&lt;/div&gt;      &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" class="wlWriterSmartContent"&gt;un click sur le lien google.fr, produit ceci :&lt;/div&gt;    &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_vatZwuxxe78/TWUnze1ZTTI/AAAAAAAAA8E/S79HtlPOl7Y/s1600-h/image%5B8%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_vatZwuxxe78/TWUn0OGNc5I/AAAAAAAAA8I/RKkq8Zh1bqw/image_thumb%5B4%5D.png?imgmax=800" width="717" height="419" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Certe il y a un referer mais il est encodé, le site distant ne peut dont pas voir la page ou etait présent le lien.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" class="wlWriterSmartContent"&gt;&lt;/div&gt; Code source de la solution :         &lt;iframe style="padding-bottom: 0px; background-color: #fcfcfc; padding-left: 0px; width: 98px; padding-right: 0px; height: 115px; padding-top: 0px" title="Preview" marginheight="0" src="http://cid-a458279ec363307a.office.live.com/embedicon.aspx/Public/HideReferer.zip" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-1988978559749583808?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/1988978559749583808/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=1988978559749583808' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/1988978559749583808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/1988978559749583808'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2011/02/comment-masquer-un-referer-sur-un-lien.html' title='Comment masquer un referer sur un lien sortant avec asp.net mv3'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_vatZwuxxe78/TWUnvCnp5zI/AAAAAAAAA7s/_6EvobdfLIc/s72-c/transformedimage%5B3%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-5908871613235301918</id><published>2011-02-19T15:46:00.001+01:00</published><updated>2011-02-19T15:46:23.953+01:00</updated><title type='text'>Comment soumettre un formulaire sans recharger la page avec asp.net ,mvc3, jquery et razor</title><content type='html'>&lt;p&gt;Je vais expliquer dans ce billet comment faire pour soumettre très simplement un formulaire dans une page web sans avoir a rechercher celle-ci et afficher le résultat de la soumission en lieu et place du formulaire, mais aussi comment valider et afficher les erreurs éventuelles de validation coté client et serveur toujours sans recharger la page.&lt;/p&gt;  &lt;p&gt;Le scénario sera l’insertion d’un contact dans une base de donnée, le modèle de données est le suivant :&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:a2ffbc22-3339-4a17-ab01-28943b10b461" class="wlWriterEditableSmartContent"&gt;&lt;img style="border:0; width: 423px; height: 142px;" src="http://lh5.ggpht.com/_vatZwuxxe78/TV_XduxzL6I/AAAAAAAAA6I/TzVcAnxRjA8/transformedimage%5B8%5D.png?imgmax=800" /&gt;&lt;/div&gt;  &lt;p&gt;il faut maintenant creer le formulaire Html suivant :&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:56a74df2-6adc-46f6-ad83-4591d149a5ed" class="wlWriterEditableSmartContent"&gt;&lt;img style="border:0; width: 900px; height: 653px;" src="http://lh3.ggpht.com/_vatZwuxxe78/TV_Xezh45tI/AAAAAAAAA6M/SRIXReYu2W4/transformedimage%5B57%5D.png?imgmax=800" /&gt;&lt;/div&gt;  &lt;p&gt;Jusque la du “classique” si ce n’est la nouvelle syntaxe &lt;strong&gt;Razor&lt;/strong&gt; , ce qu’il faut noter c’est la mise en place de la ligne 5 dans laquel il est fait appel à un formulaire Ajax&lt;/p&gt;  &lt;p&gt;voici comment le fomulaire est appelé dans la page hote :&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:0c194c74-be85-4c60-a6b0-cb3d9900796d" class="wlWriterEditableSmartContent"&gt;&lt;img style="border:0; width: 788px; height: 241px;" src="http://lh6.ggpht.com/_vatZwuxxe78/TV_XfkxMA0I/AAAAAAAAA6Q/JEdWAlAJfbQ/transformedimage%5B18%5D.png?imgmax=800" /&gt;&lt;/div&gt;  &lt;p&gt;on peut voir la l’appel ligne 12, il s’agit d’une méthode d’extension que j’ai créé pour rendre le code un peu plus propre, le détail est le suivant :&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:494157b1-df3b-43dd-ae42-9ba35d939394" class="wlWriterEditableSmartContent"&gt;&lt;img style="border:0; width: 788px; height: 333px;" src="http://lh4.ggpht.com/_vatZwuxxe78/TV_XgWV3l5I/AAAAAAAAA6U/Ucd3wMtFqGA/transformedimage%5B22%5D.png?imgmax=800" /&gt;&lt;/div&gt;  &lt;p&gt;Le rendu final du formulaire est le suivant :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_vatZwuxxe78/TV_XhK_-BpI/AAAAAAAAA6Y/8gqJCbdJZ6c/s1600-h/image%5B8%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_vatZwuxxe78/TV_Xhi22RGI/AAAAAAAAA6c/UiwNYqgtm_Q/image_thumb%5B4%5D.png?imgmax=800" width="499" height="512" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Maintenant il faut&amp;#160; coder l’Action AddCustomer, c’est cette action qui est appelée dans le formulaire Ajax.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:d37798e9-3cce-4242-b72f-64122dc8f411" class="wlWriterEditableSmartContent"&gt;&lt;img style="border:0; width: 900px; height: 176px;" src="http://lh4.ggpht.com/_vatZwuxxe78/TV_Xid3rhKI/AAAAAAAAA6g/llT5srKNR8U/transformedimage%5B61%5D.png?imgmax=800" /&gt;&lt;/div&gt;  &lt;p&gt;Dans un premier temps, il faut verifier si le model est valide si ce n’est pas le cas , on retourne sur la vue en cours , grace au controle ValidationSummary les erreurs eventuelles seront affichées et l’utilisateur pourra savoir pourquoi l’insertion est un echec. Dans le cas contraire nous afficherons en lieu et place du formulaire, une vue partielle indiquant à l’utilisateur que l’insertion est un succès.&amp;#160; Un click sur le bouton inserer affiche la page suivante :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_vatZwuxxe78/TV_Xi1LC9wI/AAAAAAAAA6k/6wiORSSbOvM/s1600-h/image%5B13%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_vatZwuxxe78/TV_Xjsxe1SI/AAAAAAAAA6o/fT5qJ8T3gbE/image_thumb%5B7%5D.png?imgmax=800" width="470" height="507" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;L’insertion est un succès mais nous avons changé de page, pour passer sur /Home/AddCustomer, pour rester sur la page d’accueil nous allons mettre en place les points suivants :&lt;/p&gt;  &lt;p&gt;1 – Il faut s’assurer dans le fichier web.config que la validation coté client est activée&lt;/p&gt;  &lt;p&gt;   &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:ef30abbf-77b7-4079-8f99-d8eef800ce57" class="wlWriterEditableSmartContent"&gt;&lt;img style="border:0; width: 788px; height: 77px;" src="http://lh6.ggpht.com/_vatZwuxxe78/TV_XjxAbYRI/AAAAAAAAA6s/VSeKZzrioZY/transformedimage%5B30%5D.png?imgmax=800" /&gt;&lt;/div&gt; &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;2 -    &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" class="wlWriterSmartContent"&gt;Dans la page master _Layout, il faut s’assurer que les javascripts suivants sont appelés :&lt;/div&gt; &lt;/p&gt;  &lt;p&gt;   &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:6fb1ff31-fe7a-499d-a655-8ac6a0e2edba" class="wlWriterEditableSmartContent"&gt;&lt;img style="border:0; width: 900px; height: 132px;" src="http://lh6.ggpht.com/_vatZwuxxe78/TV_XkkEgGpI/AAAAAAAAA6w/q4cwP45eCSo/transformedimage%5B42%5D.png?imgmax=800" /&gt;&lt;/div&gt; &lt;/p&gt;  &lt;p&gt;Ligne 5, il s’agit d’une librairie de fonctions javascript pour la gestion de la validation coté client.&lt;/p&gt;  &lt;p&gt;3 - Dans le formulaire d’ajout , j’ajoute les lignes de code javascript suivantes&amp;#160; :&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:b6c46fe1-8f8f-4c8c-8c3b-3c22ab129d77" class="wlWriterEditableSmartContent"&gt;&lt;img style="border:0; width: 900px; height: 209px;" src="http://lh5.ggpht.com/_vatZwuxxe78/TV_XlHjF2uI/AAAAAAAAA60/VIlndBZ_gMw/transformedimage%5B46%5D.png?imgmax=800" /&gt;&lt;/div&gt;  &lt;p&gt;Le but de ce code est d’intercepter justement l’action submit et d’injecter les resultat retourné par l’Action AddCustomer du controller HomeController, maintenant voici ce qui est affiché lors d’un submit :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_vatZwuxxe78/TV_XlusKbOI/AAAAAAAAA64/2MojMeAPhN8/s1600-h/image%5B18%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_vatZwuxxe78/TV_Xmd6rutI/AAAAAAAAA68/YXyid1iEmCM/image_thumb%5B10%5D.png?imgmax=800" width="608" height="475" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;la vue partielle&amp;#160; “_Success.cshtml” à bien été injectée sans rechargement de la page, voici son contenu :&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:297fe01a-af6c-4bf4-bae6-20bb7e0f19a9" class="wlWriterEditableSmartContent"&gt;&lt;img style="border:0; width: 900px; height: 56px;" src="http://lh4.ggpht.com/_vatZwuxxe78/TV_XneYfiDI/AAAAAAAAA7A/W-QJHzBYwak/transformedimage%5B66%5D.png?imgmax=800" /&gt;&lt;/div&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" class="wlWriterSmartContent"&gt;Pour l’instant aucune validation du model n’a été effectuée, pour la mise en place des validators, en standard avec MVC3 nous avons la possibilité d’annoter le model avec des attributs spécialisés dans la validation des données, voici le nouveau model avec les attributs de validation :&lt;/div&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:0c779ed1-c031-4eab-a1cc-a7e3ce832202" class="wlWriterEditableSmartContent"&gt;&lt;img style="border:0; width: 900px; height: 299px;" src="http://lh6.ggpht.com/_vatZwuxxe78/TV_XoXwRYLI/AAAAAAAAA7E/NINqQy79r-g/transformedimage%5B71%5D.png?imgmax=800" /&gt;&lt;/div&gt;  &lt;p&gt;Le renseignement de toutes les propriétés du model sont devenues obligatoire, de plus j’ai ajouté un validateur spécialisé dans la verification de la forme de l’email, si l’on clique maintenant sur le bouton submit sans rien renseigner dans le formulaire, voici le résultat affiché :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_vatZwuxxe78/TV_Xo35b1XI/AAAAAAAAA7I/eDVuURtwJC4/s1600-h/image%5B23%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_vatZwuxxe78/TV_XpwgrYOI/AAAAAAAAA7M/UisJE_gOekk/image_thumb%5B13%5D.png?imgmax=800" width="578" height="525" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;La “magie” d’asp.net MVC3 c’est qu’en l’occurence la validation s’est effectuée coté client pour l’instant sans ecrire une seule ligne de code javascript, on peut remarquer au passage que les message de validation sont en Anglais par defaut, ceci vient du fait que l’attribut “Required” ne contient pas le message d’erreur, ceci va etre corrigé, et nous allons faire une verfication coté serveur pour verifier son restons bien sur la meme page, pour ce faire je vais modifier l’action AddCustomer dans le controller Home de la manière suivante :&lt;/p&gt;  &lt;p&gt;   &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:73045a2c-3702-41e1-80fe-9be9e45dbbd9" class="wlWriterEditableSmartContent"&gt;&lt;img style="border:0; width: 900px; height: 280px;" src="http://lh3.ggpht.com/_vatZwuxxe78/TV_XrH9vWbI/AAAAAAAAA7Q/Mf0_Z0t5IHs/transformedimage%5B75%5D.png?imgmax=800" /&gt;&lt;/div&gt; &lt;/p&gt;  &lt;p&gt;   &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" class="wlWriterSmartContent"&gt;Je valide de nouveau le formulaire en indiquant “marc” comme pseudo :&lt;/div&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_vatZwuxxe78/TV_Xr_M-RqI/AAAAAAAAA7U/XjYwv4P-Crg/s1600-h/image%5B28%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_vatZwuxxe78/TV_XsaeILXI/AAAAAAAAA7Y/1JF46cBEoiE/image_thumb%5B16%5D.png?imgmax=800" width="582" height="539" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;On peut voir que le formulaire à bien été posté sur le serveur et que le message d’erreur retourné est bien placé au bon endroit &lt;/p&gt;  &lt;p&gt;Dernier point avant de conclure cet article, il est possible de verifier un champs de saisie particulier à la volée directement sur le serveur grace au nouvel attribut “Remote”, nous allons verifier si le pseudo est déja pris pendant la saisie du formulaire avant meme de cliquer sur le bouton submit voici comment proceder :&lt;/p&gt;    &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:a1c957e6-c37e-47b1-a79a-0c6cc01589bb" class="wlWriterEditableSmartContent"&gt;&lt;img style="border:0; width: 900px; height: 311px;" src="http://lh3.ggpht.com/_vatZwuxxe78/TV_XtRO-25I/AAAAAAAAA7c/bO89UEDoK9M/transformedimage%5B79%5D.png?imgmax=800" /&gt;&lt;/div&gt;      &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" class="wlWriterSmartContent"&gt;Nous modifions le model pour ajouter la ligne 12, le premier paramètre est l’action du controller et la 2eme methode est le nom du controller utilisé pour la validation de la propriété :&lt;/div&gt;      &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:7dee14f0-cba7-47df-8b79-a4c7cec367fe" class="wlWriterEditableSmartContent"&gt;&lt;img style="border:0; width: 900px; height: 161px;" src="http://lh5.ggpht.com/_vatZwuxxe78/TV_XuFlJ98I/AAAAAAAAA7g/hqvlbj7j66s/transformedimage%5B83%5D.png?imgmax=800" /&gt;&lt;/div&gt;      &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" class="wlWriterSmartContent"&gt;lors de la saisie du pseudo dans le formulaire une verfication sera effectuée coté serveur, attention ! a chaque caractère saisie dans la texbox nickname (a mon sens , ceci peut vite devenir abusif)&lt;/div&gt;      &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" class="wlWriterSmartContent"&gt;&lt;/div&gt; &lt;a href="http://lh3.ggpht.com/_vatZwuxxe78/TV_Xu8akSRI/AAAAAAAAA7k/p1__32WECbA/s1600-h/image%5B32%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_vatZwuxxe78/TV_XvtnGwOI/AAAAAAAAA7o/GQN1k79oYco/image_thumb%5B18%5D.png?imgmax=800" width="643" height="590" /&gt;&lt;/a&gt;      &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" class="wlWriterSmartContent"&gt;&lt;/div&gt; on peut voir que le validator en remoting fonctionne car le message d’erreur est affiché seul alors que les autres champs requis ne sont pas renseignés.    &lt;p&gt;ci-dessous le code source utilisé pour la solution :&lt;/p&gt; &lt;iframe style="padding-bottom: 0px; background-color: #fcfcfc; padding-left: 0px; width: 98px; padding-right: 0px; height: 115px; padding-top: 0px" title="Preview" marginheight="0" src="http://cid-a458279ec363307a.office.live.com/embedicon.aspx/Public/MyFormMvcApplication.zip" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;  &lt;p&gt;Pour conclure, avec MVC3 il devient très facile de produire des formulaires très puissants, avec des validations temps réel coté client pour toujours obtenir une experience utilisateur de plus en plus riche sans nuire à la productivité du développeur.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-5908871613235301918?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/5908871613235301918/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=5908871613235301918' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/5908871613235301918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/5908871613235301918'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2011/02/comment-soumettre-un-formulaire-sans.html' title='Comment soumettre un formulaire sans recharger la page avec asp.net ,mvc3, jquery et razor'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_vatZwuxxe78/TV_XduxzL6I/AAAAAAAAA6I/TzVcAnxRjA8/s72-c/transformedimage%5B8%5D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-387850168417842652</id><published>2011-02-05T22:20:00.001+01:00</published><updated>2011-02-05T22:20:24.585+01:00</updated><title type='text'>Test android</title><content type='html'>&lt;div&gt;&lt;p&gt;Publication de test avec blogger pour andro&amp;#239;de via mon HTC &lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-387850168417842652?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/387850168417842652/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=387850168417842652' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/387850168417842652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/387850168417842652'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2011/02/test-android.html' title='Test android'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-8651977036282545307</id><published>2010-11-17T11:34:00.001+01:00</published><updated>2010-11-17T11:34:06.693+01:00</updated><title type='text'>Présentation de Windows Azure à Toulouse (compte rendu)</title><content type='html'>&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_vatZwuxxe78/TOOvm2eCS6I/AAAAAAAAA4s/zSDMLXZ_RQc/s1600-h/windows-azure-platform-headline%5B5%5D.gif"&gt;&lt;img style="border-bottom: ; border-left: ; margin: ; padding-left: ; padding-right: ; display: inline; border-top: ; border-right: ; padding-top: " title="windows-azure-platform-headline" alt="windows-azure-platform-headline" src="http://lh6.ggpht.com/_vatZwuxxe78/TOOvnbkBP1I/AAAAAAAAA4w/HSWpuDUt7cY/windows-azure-platform-headline_thumb%5B2%5D.gif?imgmax=800" width="393" height="39" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;J’ai pu assister le Mardi 16 novembre 2010 à la présentation conjointe de Microsoft Azure Platform faite par d’une part Microsoft pour la partie “Marketing” et d’autre part pour la partie technique par la société &lt;a href="http://www.bewise.fr/fr-FR/Pages/default.aspx" target="_blank"&gt;Bewise&lt;/a&gt; (expert sur toutes les technologies Microsoft).&lt;/p&gt;  &lt;p&gt;Cette journée m’a été bénéfique, ce que je pensais de Windows Azure n’était pas très clair, à l’issue de cette journée “nécessaire” je dois dire que toutes mes interrogations ont été levées, donc je recommande à ceux qui veulent se faire une idée très précise de cette plateforme (possibilité et couts) d’aller écouter les speakers. La journée s’est très bien passée, très pro, merci pour la qualité des intervenants.&lt;/p&gt;  &lt;p&gt;A titre personnel j’aurais plus apprécié d’avoir la session technique avant le marketing car les termes utilisés dans le calcul des couts Worker Role , Web Role, etc… n’étaient pas clairs dans mon esprit au moment de leur présentation.&lt;/p&gt;  &lt;p&gt;Concernant la plateforme intrinsèquement, je dois dire que je suis assez convaincu par Sql Azure meme si le prix me parait encore un peu trop élevé (même s’il est justifié par l’uptime),&amp;#160; J’attends avec impatience qu’Analysis Services puisse être proposé.&lt;/p&gt;  &lt;p&gt;Windows Azure dans sa forme actuelle ne peut (a mon sens) pas rivaliser avec un hosting “classique” , déploiement mode rouleau compresseur (tous les fichiers ou rien), le tuning IIS inaccessible pour l’instant et l’impossibilité de “capper” le nombre de serveurs en cas de forte charge me laisse dubitatif.&lt;/p&gt;  &lt;p&gt;Au global connaissant Microsoft, ceci est une première étape avec déjà un haut niveau de service, je pense qu’en écoutant leurs clients comme ils ont l’habitude de faire ils seront capable de proposer des services de plus en plus adaptés.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-8651977036282545307?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/8651977036282545307/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=8651977036282545307' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/8651977036282545307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/8651977036282545307'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2010/11/presentation-de-windows-azure-toulouse.html' title='Présentation de Windows Azure à Toulouse (compte rendu)'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_vatZwuxxe78/TOOvnbkBP1I/AAAAAAAAA4w/HSWpuDUt7cY/s72-c/windows-azure-platform-headline_thumb%5B2%5D.gif?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-2738474492100087790</id><published>2010-11-09T23:13:00.001+01:00</published><updated>2010-11-09T23:13:18.248+01:00</updated><title type='text'>Utiliser Unity 2 avec asp.net mvc 3 comme inverseur de dépendance</title><content type='html'>&lt;p&gt;La version RC d’ASP.Net MVC 3 vient de sortir aujourd’hui comme l’annonce sur son blog Scott Guthrie &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/11/09/announcing-the-asp-net-mvc-3-release-candidate.aspx" target="_blank"&gt;http://weblogs.asp.net/scottgu/archive/2010/11/09/announcing-the-asp-net-mvc-3-release-candidate.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Cette nouvelle mise à jour de MVC3 introduit un nouveau système d’inversion de dépendance basé sur le nouveau type System.Web.Mvc.DependencyResolver.&lt;/p&gt;  &lt;p&gt;Je vais expliquer ici comment continuer à utiliser Unity comme DI et il y a un certain nombre de changement par rapport à MVC2.&lt;/p&gt;  &lt;p&gt;Il n’y a plus l’obligation de passer par la méthode Start de global.asax, en effet MVC3 introduit un nouvel attribut “PreApplicationStartMethod” de niveau Assembly, avec celui ci il suffit d’indiquer le type dans lequel se trouve la méthode à exécuter avant de lancer l’application web, exemple :&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:2da0339c-ec96-4cef-b16a-b0787c5080f1" class="wlWriterEditableSmartContent"&gt;&lt;pre style=" width: 756px; height: 24px;background-color:White;overflow: auto;"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000;"&gt;[assembly: PreApplicationStartMethod(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(Mvc3Application4.UnityStarter), &lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000;"&gt;Start&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:9aa4506f-8b8a-4678-a113-07d7b2ffad18" class="wlWriterEditableSmartContent"&gt;&lt;pre style=" width: 732px; height: 330px;background-color:White;overflow: auto;"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; UnityStarter&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Start()&lt;br /&gt;        {&lt;br /&gt;            var container &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Microsoft.Practices.Unity.UnityContainer();&lt;br /&gt;            container.RegisterInstance&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;IControllerFactory&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(System.Web.Mvc.ControllerBuilder.Current.GetControllerFactory());&lt;br /&gt;            container.RegisterType&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;IControllerActivator, UnityControllerActivator&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();&lt;br /&gt;            container.RegisterType&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;IViewPageActivator, UnityViewPageActivator&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();&lt;br /&gt;            var resolver &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; UnityDependencyResolver(container);&lt;br /&gt;            System.Web.Mvc.DependencyResolver.SetResolver(resolver);&lt;br /&gt;        }&lt;br /&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Il n’y a plus besoin de créer sa propre fabrique de controllers il suffit d’indiquer au container d’utiliser celle par défaut pour la création des controllers&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;une nouvelle interface fait son apparition, IControllerActivator, c’est ici que l’injection de dépendance pour les controllers va s’opérer, pour intercepter l’injection via unity nous allons créer notre propre ConrollerActivator de la manières suivante :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:3bc6a5ce-cf0f-450f-ba9b-566b072d888d" class="wlWriterEditableSmartContent"&gt;&lt;pre style=" width: 732px; height: 211px;background-color:White;overflow: auto;"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; UnityControllerActivator : IControllerActivator&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; IController Create(System.Web.Routing.RequestContext requestContext, Type controllerType)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; DependencyResolver.Current.GetService(controllerType) &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;as&lt;/span&gt;&lt;span style="color: #000000;"&gt; IController;&lt;br /&gt;        }&lt;br /&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;une nouvelle interface fait également son apparition, sa responsabilité est la gestion de la création des vues IViewPageActivator, nous allons aussi intercepter la création de celles-ci pour injecter les dépendances nécessaires avec la classe suivante :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:9fff97bb-ad15-4450-b501-7d9851cf959f" class="wlWriterEditableSmartContent"&gt;&lt;pre style=" width: 732px; height: 211px;background-color:White;overflow: auto;"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; UnityViewPageActivator : IViewPageActivator&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; Create(ControllerContext controllerContext, Type type)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; DependencyResolver.Current.GetService(type);&lt;br /&gt;        }&lt;br /&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;pour finir nous allons indiquer au moteur asp.net qui s’occupe de la résolution des dépendance de manière concrète avec le code suivant :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:b66cf9f2-db2e-449e-8f44-0c65dd6c325c" class="wlWriterEditableSmartContent"&gt;&lt;pre style=" width: 732px; height: 465px;background-color:White;overflow: auto;"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; UnityDependencyResolver : System.Web.Mvc.IDependencyResolver&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; UnityDependencyResolver(Microsoft.Practices.Unity.IUnityContainer container)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Container &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; container;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; Microsoft.Practices.Unity.IUnityContainer Container { &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; GetService(Type serviceType)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; Container.Resolve(serviceType);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; IEnumerable&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; GetServices(Type serviceType)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; Container.ResolveAll(serviceType);&lt;br /&gt;        }&lt;br /&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;il ne reste plus qu’a déclarer au système que l’instance du resolver via la ligne de code suivante System.Web.Mvc.DependencyResolver.SetResolver(resolver);&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Je trouve cette nouvelle architecture beaucoup plus simple qu’avec MVC2 ou il fallait pas mal bricoler pour arriver au même résultat, j’avais déjà fait un article sur la configuration de unity 2 avec MVC2 &lt;a href="http://marc-chouteau.blogspot.com/2010/05/utiliser-unity-2-avec-aspnet-mvc-2.html" target="_blank"&gt;asp.net mvc 2 unity 2&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Bon maintenant je m’attaque à la migration d’&lt;a href="http://erpstore.codeplex.com/" target="_blank"&gt;ERPStore&lt;/a&gt; de MVC2 vers MVC3 &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-2738474492100087790?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/2738474492100087790/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=2738474492100087790' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/2738474492100087790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/2738474492100087790'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2010/11/utiliser-unity-2-avec-aspnet-mvc-3.html' title='Utiliser Unity 2 avec asp.net mvc 3 comme inverseur de dépendance'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-7516185009019964804</id><published>2010-09-15T14:39:00.001+02:00</published><updated>2010-09-15T14:39:36.993+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='Astuce'/><title type='text'>Sql longueur d’une chaine et espaces</title><content type='html'>&lt;p&gt;On vient de me soumettre cette remarque :&lt;/p&gt;  &lt;p&gt;select LEN(' ')&lt;/p&gt;  &lt;p&gt;attention retourne 0&lt;/p&gt;  &lt;p&gt;En effet il est écrit dans la doc (&lt;a href="http://msdn.microsoft.com/fr-fr/library/ms190329.aspx" target="_blank"&gt;http://msdn.microsoft.com/fr-fr/library/ms190329.aspx&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;“Retourne le nombre de caractères de l'expression de type chaine spécifiée, à l'exception des espaces de droite.”, ne respecte pas vraiment un des principe SOLID le SRP&lt;/p&gt;  &lt;p&gt;pour avoir la vraie longueur utiliser plutôt &lt;/p&gt;  &lt;p&gt;select DATALENGTH(' ')&lt;/p&gt;  &lt;p&gt;retourne 1&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-7516185009019964804?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/7516185009019964804/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=7516185009019964804' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/7516185009019964804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/7516185009019964804'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2010/09/sql-longueur-dune-chaine-et-espaces.html' title='Sql longueur d’une chaine et espaces'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-3419344117091379952</id><published>2010-09-13T15:07:00.001+02:00</published><updated>2010-09-13T15:07:41.364+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Astuce'/><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><title type='text'>IIS Multi host header et service WCF</title><content type='html'>&lt;p&gt;Si plusieurs host headers sont déclarés dans une application web au niveau IIS et si l’on veut accéder à un service wcf voici l’erreur que l’on reçoit :&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;This collection already contains an address with scheme http.&amp;#160; There can be at most one address per scheme in this collection.      &lt;br /&gt;Parameter name: item&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Une erreur pas très explicite, j’ai passé une bonne heure la dessus, pour faire fonctionner le service on peut soit declarer le host “principal” dans la section service dans web.config soit utiliser cette autre méthode que je préfere :&lt;/p&gt;  &lt;p&gt;Au niveau du fichier svc, faire la déclaration suivante :&lt;/p&gt;  &lt;p&gt;&amp;lt;%@ ServiceHost Service=&amp;quot;MyService&amp;quot; &lt;strong&gt;Factory=&amp;quot;MyServiceHostFactory&amp;quot;&lt;/strong&gt; %&amp;gt;&lt;/p&gt;  &lt;p&gt;puis créer une classe MyServiceHostFactory dont le but sera d’intercepter la requête et de filtrer les différents hosts pour n’en renvoyer qu’un seul.&lt;/p&gt;  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; MyServiceHostFactory : ServiceHostFactory&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;{&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    {&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        var addresses = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Uri[] { baseAddresses[0] };&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        var serviceHost = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ServiceHost(serviceType, addresses);&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; serviceHost;&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-3419344117091379952?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/3419344117091379952/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=3419344117091379952' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/3419344117091379952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/3419344117091379952'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2010/09/iis-multi-host-header-et-service-wcf.html' title='IIS Multi host header et service WCF'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-1650967137841169172</id><published>2010-08-31T13:13:00.001+02:00</published><updated>2010-08-31T13:13:20.347+02:00</updated><title type='text'>Email et environnement de développement</title><content type='html'>&lt;p&gt;Voici une petite astuce lorsque l’on travaille sur un site web ou une application et qu’il faut envoyer un email, il est souvent compliqué de trouver un serveur smtp, et quand on arrive a en trouver un , on surcharge très vite sa boite email. &lt;/p&gt;  &lt;p&gt;Pour eviter ça il suffit de placer les lignes suivantes dans le fichier de config du site web (web.config) ou de l’application (app.config) sur laquelle on travaille :&lt;/p&gt;  &lt;p&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;lt;configuration&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;system.net&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;smtp deliveryMethod=&amp;quot;SpecifiedPickupDirectory&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;specifiedPickupDirectory pickupDirectoryLocation=&amp;quot;c:\temp&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/smtp&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/system.net&amp;gt;     &lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;/p&gt;  &lt;p&gt;ceci aura pour effet d’ecrire les emails dans un repertoire “temporaire” ici c:\temp , ils sont sauvegardés au format eml&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-1650967137841169172?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/1650967137841169172/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=1650967137841169172' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/1650967137841169172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/1650967137841169172'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2010/08/email-et-environnement-de-developpement.html' title='Email et environnement de développement'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-7000127342256492769</id><published>2010-06-08T09:27:00.001+02:00</published><updated>2010-10-27T17:24:35.966+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Astuce'/><category scheme='http://www.blogger.com/atom/ns#' term='mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><title type='text'>Asp.net mvc 2 et RenderAction&lt;&gt; générique</title><content type='html'>&lt;p&gt;J’ai déjà expliqué ici le peu d’interet que j’accorde aux “magic strings” qui sont souvent sources de bugs, depuis la nouvelle version d’asp.net mvc 2 pour faire du rendu partiel, il n’y à plus besoin d’utiliser les excellentes méthodes de MVCContrib car une nouvelle méthode permet le rendu&lt;/p&gt;  &lt;p&gt;Html.RenderAction(ActionName, ControllerName, routeValues);&lt;/p&gt;  &lt;p&gt;mais les paramètres ActionName et ControllerName sont de type string , dans le cas d’une refactorisation du nom d’une action ou d’un controlleur , il y a danger. pour éviter ça voici une méthode générique qui permet d’appeler les méthodes du controlleur choisi pour le rendu partiel :&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:97ca57e0-22af-4beb-a2b4-7a80d893021d" class="wlWriterEditableSmartContent"&gt;&lt;pre style=" width: 656px; height: 357px;background-color:White;overflow: auto;"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; RenderAction&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt; HtmlHelper helper, Expression&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Action&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; expression)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;where&lt;/span&gt;&lt;span style="color: #000000;"&gt; T : Controller&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #000000;"&gt;            var call &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; expression.Body &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;as&lt;/span&gt;&lt;span style="color: #000000;"&gt; MethodCallExpression;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #000000;"&gt;            var controllerName &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(T).Name.Replace(&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000;"&gt;Controller&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Empty);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #000000;"&gt;            var actionName &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; call.Method.Name;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;            var parameters &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; call.Method.GetParameters();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;            var routeValues &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; RouteValueDictionary();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (parameters.Length &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;span style="color: #000000;"&gt;            {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; &lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; parameters.Length; i&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt; &lt;span style="color: #000000;"&gt;                {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    var parameter &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; call.Arguments[i];&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; value &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    var constantExpression &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; parameter &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;as&lt;/span&gt;&lt;span style="color: #000000;"&gt; ConstantExpression;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (constantExpression &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt; &lt;span style="color: #000000;"&gt;                        value &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; constantExpression.Value;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt; &lt;span style="color: #000000;"&gt;                        var body &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; Expression.Convert(parameter, &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt; &lt;span style="color: #000000;"&gt;                        var exp &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; Expression.Lambda&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Func&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(body, &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ParameterExpression[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;]);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt; &lt;span style="color: #000000;"&gt;                        value &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; exp.Compile()();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    routeValues.Add(parameters[i].Name, value);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;28&lt;/span&gt; &lt;span style="color: #000000;"&gt;                }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;29&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;30&lt;/span&gt; &lt;span style="color: #000000;"&gt;            helper.RenderAction(actionName, controllerName, routeValues);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;31&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;exemple :&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Html.RenderAction&amp;lt;AccountController&amp;gt;(c =&amp;gt; c.PartialLoginBox(“login.ascx”));&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Bien sur ceci est au détriment de la performance, mais on gagne en robustesse de code.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-7000127342256492769?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/7000127342256492769/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=7000127342256492769' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/7000127342256492769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/7000127342256492769'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2010/06/aspnet-mvc-2-et-renderaction-generique.html' title='Asp.net mvc 2 et RenderAction&amp;lt;&amp;gt; générique'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-5893338735728463147</id><published>2010-05-29T00:45:00.001+02:00</published><updated>2010-05-29T00:45:19.730+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='Article'/><title type='text'>Validation Asp.Net MVC 2.0 avec Entlib 5.0</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:none; margin:0px; padding:4px 0px 4px 0px;"&gt;&lt;iframe src="http://www.facebook.com/widgets/like.php?href=http://marc-chouteau.blogspot.com/2010/05/validation-aspnet-mvc-20-avec-entlib-50.html" scrolling="no" frameborder="0" style="border:none; width:450px; height:80px"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;&lt;img style="margin: 0px 5px 5px 0px; display: inline" align="left" src="http://entlib.codeplex.com/Images/pnp_logo.png" /&gt;&lt;/p&gt;  &lt;p&gt;Asp.Net 2.0 est maintenant pourvu d’un système de validation des entités du modèle très puissant basé sur des attributs qu’il faut placer sur les propriétés d’une classe pour valider celle-ci.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Voir sur le site de Scott Guthrie : &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx" target="_blank"&gt;http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;A priori ce dispositif est très pratique, mais à la moindre modification de règle de validation il faut recompiler le projet et mettre à jour l’application web pour que celle-ci soit prise en compte.&lt;/p&gt;  &lt;p&gt;Les “géniaux” développeurs d’Asp.Net MVC 2.0 ont mis en place un Fournisseur de validation d’entité qu’il est possible d’étendre.&lt;/p&gt;  &lt;p&gt;Je vais montrer ici comment utiliser le Validation Application Block d’Entlib 5.0 pour valider les entités du modèle et stocker les règles de validation dans un fichier de configuration xml a part.&lt;/p&gt;  &lt;p&gt;Dans un premier temps il va falloir indiquer que l’on veut utiliser le Validation Application Block d’Entlib&lt;/p&gt;  &lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;	public class MvcApplication : System.Web.HttpApplication&lt;br /&gt;	{&lt;br /&gt;		public static void RegisterRoutes(RouteCollection routes)&lt;br /&gt;		{&lt;br /&gt;			routes.IgnoreRoute(&amp;quot;{resource}.axd/{*pathInfo}&amp;quot;);&lt;br /&gt;&lt;br /&gt;			routes.MapRoute(&lt;br /&gt;				&amp;quot;Default&amp;quot;, // Route name&lt;br /&gt;				&amp;quot;{controller}/{action}/{id}&amp;quot;, // URL with parameters&lt;br /&gt;				new { controller = &amp;quot;Home&amp;quot;, action = &amp;quot;Index&amp;quot;, id = UrlParameter.Optional } // Parameter defaults&lt;br /&gt;			);&lt;br /&gt;&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		protected void Application_Start()&lt;br /&gt;		{&lt;br /&gt;			AreaRegistration.RegisterAllAreas();&lt;br /&gt;&lt;br /&gt;			RegisterRoutes(RouteTable.Routes);&lt;br /&gt;&lt;br /&gt;			var validationFile = Context.Server.MapPath(&amp;quot;/validations.config&amp;quot;);&lt;br /&gt;&lt;br /&gt;			&lt;strong&gt;ModelValidatorProviders.Providers.Clear();&lt;/strong&gt;&lt;br /&gt;			&lt;strong&gt;ModelValidatorProviders.Providers.Add(new EntLibValidatorProvider(validationFile));&lt;/strong&gt;&lt;br /&gt;		}&lt;br /&gt;	}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;Il faut donc effacer les validateurs standards, puis ajouter celui d’enlib, j’ai récupéré ce code sur le blog de &lt;strong&gt;Brad Wilson&lt;/strong&gt; à l’adresse suivante :&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;&lt;a href="http://bradwilson.typepad.com/blog/2009/10/enterprise-library-validation-example-for-aspnet-mvc-2.html" target="_blank"&gt;http://bradwilson.typepad.com/blog/2009/10/enterprise-library-validation-example-for-aspnet-mvc-2.html&lt;/a&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;	public class EntLibValidatorProvider : ModelValidatorProvider&lt;br /&gt;	{&lt;br /&gt;		private string m_ConfigFileName;&lt;br /&gt;&lt;br /&gt;		public EntLibValidatorProvider(string configFileName)&lt;br /&gt;		{&lt;br /&gt;			m_ConfigFileName = configFileName;&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		public override IEnumerable&amp;lt;ModelValidator&amp;gt; GetValidators(ModelMetadata metadata, ControllerContext context)&lt;br /&gt;		{&lt;br /&gt;			var configSource = new Microsoft.Practices.EnterpriseLibrary.Common.Configuration.FileConfigurationSource(m_ConfigFileName);&lt;br /&gt;			var validator = ValidationFactory.CreateValidatorFromConfiguration(metadata.ModelType, &amp;quot;defaultRuleSets&amp;quot;, configSource);&lt;br /&gt;&lt;br /&gt;			if (validator != null)&lt;br /&gt;			{&lt;br /&gt;				yield return new EntLibValidatorWrapper(metadata, context, validator);&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;	}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;a noter, la fabrique de validator possède une methode qui permet de charger les règles a partir d’un fichier (le chemin de celui-ci est passé en paramètre du constructeur)&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;voici le code du wrapper EntLibValidatorWrapper&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;	public class EntLibValidatorWrapper : ModelValidator&lt;br /&gt;	{&lt;br /&gt;		private Validator _validator;&lt;br /&gt;&lt;br /&gt;		public EntLibValidatorWrapper(ModelMetadata metadata, ControllerContext context, Validator validator)&lt;br /&gt;			: base(metadata, context)&lt;br /&gt;		{&lt;br /&gt;			_validator = validator;&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		public override IEnumerable&amp;lt;ModelValidationResult&amp;gt; Validate(object container)&lt;br /&gt;		{&lt;br /&gt;			return ConvertResults(_validator.Validate(Metadata.Model));&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		private IEnumerable&amp;lt;ModelValidationResult&amp;gt; ConvertResults(IEnumerable&amp;lt;ValidationResult&amp;gt; validationResults)&lt;br /&gt;		{&lt;br /&gt;			if (validationResults != null)&lt;br /&gt;			{&lt;br /&gt;				foreach (var validationResult in validationResults)&lt;br /&gt;				{&lt;br /&gt;					if (validationResult.NestedValidationResults != null)&lt;br /&gt;					{&lt;br /&gt;						foreach (var result in ConvertResults(validationResult.NestedValidationResults))&lt;br /&gt;						{&lt;br /&gt;							yield return result;&lt;br /&gt;						}&lt;br /&gt;					}&lt;br /&gt;&lt;br /&gt;					yield return new ModelValidationResult&lt;br /&gt;					{&lt;br /&gt;						Message = validationResult.Message,&lt;br /&gt;						MemberName = validationResult.Key&lt;br /&gt;					};&lt;br /&gt;				}&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;	}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;font face="Georgia"&gt;&lt;/font&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Pour l’exemple l’idée sera de valider une classe très simple Person&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;	public class Person&lt;br /&gt;	{&lt;br /&gt;		public string FirstName { get; set; }&lt;br /&gt;		public string LastName { get; set; }&lt;br /&gt;	}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;On peut voir qu’elle ne possède aucun attribut (pure classe poco).&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;J’ajoute une règle qui interdit que le nom puisse être vide dans un fichier en racine du site web nommé “validations.config”&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;	&amp;lt;configSections&amp;gt;&lt;br /&gt;		&amp;lt;section name=&amp;quot;validation&amp;quot; type=&amp;quot;Microsoft.Practices.EnterpriseLibrary.Validation.Configuration.ValidationSettings, Microsoft.Practices.EnterpriseLibrary.Validation, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35&amp;quot; requirePermission=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;	&amp;lt;/configSections&amp;gt;&lt;br /&gt;		&amp;lt;validation&amp;gt;&lt;br /&gt;		&amp;lt;type name=&amp;quot;MvcEntlibValidation.Models.Person&amp;quot; defaultRuleset=&amp;quot;defaultRuleSets&amp;quot;&lt;br /&gt;		 assemblyName=&amp;quot;MvcEntlibValidation, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null&amp;quot;&amp;gt;&lt;br /&gt;			&amp;lt;ruleset name=&amp;quot;defaultRuleSets&amp;quot;&amp;gt;&lt;br /&gt;				&amp;lt;properties&amp;gt;&lt;br /&gt;					&amp;lt;property name=&amp;quot;LastName&amp;quot;&amp;gt;&lt;br /&gt;						&amp;lt;validator type=&amp;quot;Microsoft.Practices.EnterpriseLibrary.Validation.Validators.NotNullValidator, Microsoft.Practices.EnterpriseLibrary.Validation, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35&amp;quot;&lt;br /&gt;						 messageTemplate=&amp;quot;Vous devez indiquer un nom&amp;quot; name=&amp;quot;Not Null Validator&amp;quot; /&amp;gt;&lt;br /&gt;					&amp;lt;/property&amp;gt;&lt;br /&gt;				&amp;lt;/properties&amp;gt;&lt;br /&gt;			&amp;lt;/ruleset&amp;gt;&lt;br /&gt;		&amp;lt;/type&amp;gt;&lt;br /&gt;	&amp;lt;/validation&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;Entlib 5.0 possède un editeur de configuration assez sympa, voici ce que ça donne :&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;  &lt;pre class="brush: xml; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;&lt;a href="http://lh5.ggpht.com/_vatZwuxxe78/TABHbxA9_yI/AAAAAAAAA4Q/Io66SeGVzhQ/s1600-h/image%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_vatZwuxxe78/TABHdGRlCrI/AAAAAAAAA4Y/vXy20UdN5SI/image_thumb%5B1%5D.png?imgmax=800" width="752" height="312" /&gt;&lt;/a&gt; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="brush: xml; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;il ne reste plus qu’a mettre en place l’action d’edition d’une personne dans le controller :&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;		public ActionResult EditPerson()&lt;br /&gt;		{&lt;br /&gt;			ViewData.Model = new Models.Person();&lt;br /&gt;			return View();&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		[HttpPost]&lt;br /&gt;		public ActionResult EditPerson(Models.Person person)&lt;br /&gt;		{&lt;br /&gt;			ViewData.Model = person;&lt;br /&gt;&lt;br /&gt;			if (!ModelState.IsValid)&lt;br /&gt;			{&lt;br /&gt;				return View();&lt;br /&gt;			}&lt;br /&gt;&lt;br /&gt;			return View();&lt;br /&gt;		}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;L’appel de la propriété ModelState.IsValid a pour effet de valider l’instance de la classe Person.&lt;/font&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_vatZwuxxe78/TABHd4MLrII/AAAAAAAAA4c/RV0FdgBf46k/s1600-h/image%5B7%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_vatZwuxxe78/TABHepIqqpI/AAAAAAAAA4g/OzILiSpAFHA/image_thumb%5B3%5D.png?imgmax=800" width="511" height="466" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;Voici le contenu de la vue :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="brush: xml; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;    &amp;lt;h2&amp;gt;EditPerson&amp;lt;/h2&amp;gt;&lt;br /&gt;    &lt;br /&gt;    &amp;lt;% =Html.ValidationSummary() %&amp;gt;&lt;br /&gt;    &amp;lt;% Html.BeginForm(); %&amp;gt;&lt;br /&gt;&lt;br /&gt;    Nom : &amp;lt;%=Html.EditorFor(m =&amp;gt; m.LastName) %&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;    &amp;lt;%=Html.ValidationMessageFor(m =&amp;gt; m.LastName) %&amp;gt;&lt;br /&gt;    &amp;lt;br /&amp;gt;&lt;br /&gt;    &lt;br /&gt;    Prénom : &amp;lt;%=Html.EditorFor(m =&amp;gt; m.FirstName) %&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;    &amp;lt;%=Html.ValidationMessageFor(m =&amp;gt; m.FirstName) %&amp;gt;&lt;br /&gt;&lt;br /&gt;	&amp;lt;br /&amp;gt;&lt;br /&gt;    &lt;br /&gt;    &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;Valider&amp;quot; /&amp;gt;&lt;br /&gt;    &lt;br /&gt;    &amp;lt;% Html.EndForm(); %&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Il ne manque plus que la mise en place de la validation client à la volée pour que ce soit parfait, voici le code source de l’exemple :&lt;/p&gt;&lt;br /&gt;&lt;iframe style="padding-bottom: 0px; background-color: #fcfcfc; padding-left: 0px; width: 98px; padding-right: 0px; height: 115px; padding-top: 0px" title="Preview" marginheight="0" src="http://cid-a458279ec363307a.skydrive.live.com/embedicon.aspx/Public/MvcEntlibValidation.zip" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-5893338735728463147?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/5893338735728463147/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=5893338735728463147' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/5893338735728463147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/5893338735728463147'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2010/05/validation-aspnet-mvc-20-avec-entlib-50.html' title='Validation Asp.Net MVC 2.0 avec Entlib 5.0'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_vatZwuxxe78/TABHdGRlCrI/AAAAAAAAA4Y/vXy20UdN5SI/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-7380370763799006175</id><published>2010-05-14T15:03:00.001+02:00</published><updated>2010-05-14T15:03:47.513+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='Article'/><title type='text'>Utiliser Unity 2 avec Asp.net MVC 2</title><content type='html'>&lt;p&gt;&lt;img style="margin: 0px 5px 5px 0px; display: inline" align="left" src="http://pages.univ-nc.nc/~touraivane/Java/dessin/swing/images/FIG1.gif" /&gt;&lt;/p&gt;  &lt;p&gt;Le principe MVC pour Asp.Net est un vraie révolution dans le monde Microsoft par rapport aux WebForms, j’ai vraiment été surpris du virage à 180° qui a été initié par les architectes MS, notamment sur l’abandon total du ViewState et du systeme evenementiel&amp;#160; (pas de regret pour moi ;)),&amp;#160; elle l’est encore plus lorsque l’on peut conjuguer ce systeme avec un inverseur de controle type Unity. &lt;/p&gt;  &lt;p&gt;J’ai déjà expliqué sur ce blog qu’est que &lt;a href="http://marc-chouteau.blogspot.com/2009/01/demistifions-unity-application-block.html" target="_blank"&gt;Unity application block&lt;/a&gt; et fait une introduction sur la façon de l’utiliser.&lt;/p&gt;  &lt;p&gt;Je vais expliquer ici comment se servir de Unity pour faire de l’injection dans les controllers MVC.&lt;/p&gt;  &lt;p&gt;Dans un premier temps il faut mettre en place un container Unity et le configurer, le meilleur endroit pour faire ça est de placer dans l’evenement Application Start dans Global.asax par exemple.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;	public class MvcApplication : System.Web.HttpApplication&lt;br /&gt;	{&lt;br /&gt;		public static IUnityContainer IoC { get; private set; }&lt;br /&gt;&lt;br /&gt;		protected void Application_Start()&lt;br /&gt;		{&lt;br /&gt;			IoC = new UnityContainer();&lt;br /&gt;		}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Il existe différentes techniques pour “stocker” l’instance du container , dans cet exemple pour simplifier, je l’ai placé dans une variable statique de la classe MvcApplication, il sera possible de la retrouver facilement via une appel MvcApplication.IoC.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Asp.Net utilise une Factory pour charger les controlleurs qui “matchent” les routes configurées dans un site MVC, il s’agit de System.Web.Mvc.DefaultControllerFactory, il faut dans un premier temps creer un nouveau Type qui hérite de la fabrique de controlleurs par defaut.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;	internal class UnityControllerFactory : DefaultControllerFactory&lt;br /&gt;	{&lt;br /&gt;		public UnityControllerFactory(IUnityContainer container)&lt;br /&gt;		{&lt;br /&gt;			this.Container = container;&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		protected IUnityContainer Container { get; private set; }&lt;br /&gt;&lt;br /&gt;		protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)&lt;br /&gt;		{&lt;br /&gt;			if (controllerType == null)&lt;br /&gt;			{&lt;br /&gt;				throw new HttpException(404, String.Format(&amp;quot;The controller for path '{0}' could not be found or it does not implement IController.&amp;quot;,&lt;br /&gt;									requestContext.HttpContext.Request.Path));&lt;br /&gt;			}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;			var controller = Container.Resolve(controllerType) as Controller;&lt;br /&gt;			controller.ActionInvoker = new UnityActionInvoker(Container);&lt;br /&gt;&lt;br /&gt;			return controller;&lt;br /&gt;		}&lt;br /&gt;	}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;Il faut passer le container IoC dans le constructeur de la fabrique, et overrider la methode GetControllerType pour que IoC s’occupe de charger les bons controllers en fonction des routes via :&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt; var controller = Container.Resolve(controllerType) as Controller; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;la ligne juste en dessous nous permet aussi, si une action d’un controller est marquée par un attribut de type ActionFilterAttribute de pouvoir y injecter aussi des services référencés dans le container, voici le code de l’action Invoker&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;	public class UnityActionInvoker : ControllerActionInvoker&lt;br /&gt;	{&lt;br /&gt;		public UnityActionInvoker(IUnityContainer container)&lt;br /&gt;		{&lt;br /&gt;			this.Container = container;&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		protected IUnityContainer Container { get; private set; }&lt;br /&gt;&lt;br /&gt;		protected override ActionExecutedContext InvokeActionMethodWithFilters(ControllerContext controllerContext, IList&amp;lt;IActionFilter&amp;gt; filters, ActionDescriptor actionDescriptor, IDictionary&amp;lt;string, object&amp;gt; parameters)&lt;br /&gt;		{&lt;br /&gt;			foreach (var filter in filters)&lt;br /&gt;			{&lt;br /&gt;				Container.BuildUp(filter.GetType(), filter);&lt;br /&gt;			}&lt;br /&gt;&lt;br /&gt;			return base.InvokeActionMethodWithFilters(controllerContext, filters, actionDescriptor, parameters);&lt;br /&gt;		}&lt;br /&gt;	}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;De retour dans notre Application_Start, il suffit alors d’indiquer notre nouvelle fabrique de controller au systeme de la manière suivante :&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;&amp;#160;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;		protected void Application_Start() &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;  &lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;              { &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;                   IoC = new UnityContainer(); &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;	           var cfactory = new UnityControllerFactory(IoC);&lt;br /&gt;		   ControllerBuilder.Current.SetControllerFactory(cfactory);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;              }&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;&amp;#160;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;Unity prendra alors le control sur l’application web et permettra l’injection, l’interception, ect...&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;Exemple d’injection d’un service de log pour toutes les actions d’un controller marqué par un Attribut.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;voici l’interface du logger :&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;	public interface ILogger&lt;br /&gt;	{&lt;br /&gt;		void Write(string message);&lt;br /&gt;	}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;font face="Courier New"&gt;Dans un deuxieme temps nous allons creer un Attribut de log pour marquer les actions du controller :&lt;/font&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;	public class LoggerActionFilterAttribute : ActionFilterAttribute&lt;br /&gt;	{&lt;br /&gt;		[Dependency]&lt;br /&gt;		public Services.ILogger Logger { get; set; }&lt;br /&gt;&lt;br /&gt;		public override void OnResultExecuted(ResultExecutedContext filterContext)&lt;br /&gt;		{&lt;br /&gt;			base.OnResultExecuted(filterContext);&lt;br /&gt;			var viewResult = filterContext.Result as ViewResult;&lt;br /&gt;			Logger.Write(viewResult.ViewName);&lt;br /&gt;		}&lt;br /&gt;	}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Il faut remarquer l’attribut [Dependency] qui marque la propriété Logger de type ILogger, comme évoqué plus haut nous avons également dans la fabrique de controller intercepté la configuration des ActionInvoker via la ligne suivante &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;controller.ActionInvoker = new UnityActionInvoker(Container); &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Grace au mécanisme d’injection de Unity, il affecte la propriété Logger sans qui soit nécéssaire de chercher ou d’instancier son type .&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Dans le controller Home par exemple , il faut alors marquer une action pour pouvoir la logger&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;		[ActionFilters.LoggerActionFilter]&lt;br /&gt;		public ActionResult Index()&lt;br /&gt;		{&lt;br /&gt;			ViewData[&amp;quot;Message&amp;quot;] = &amp;quot;Welcome to ASP.NET MVC!&amp;quot;;&lt;br /&gt;&lt;br /&gt;			return View();&lt;br /&gt;		}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Bien sur il est aussi possible d’injecter l’instance du logger dans le controller toujours en utilisant Unity , une technique serait par exemple d’ajouter un paramètre dans le constructeur.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;	[HandleError]&lt;br /&gt;	public class HomeController : Controller&lt;br /&gt;	{&lt;br /&gt;		public HomeController(Services.ILogger logger)&lt;br /&gt;		{&lt;br /&gt;			this.Logger = logger;&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		protected Services.ILogger Logger { get; private set; }&lt;br /&gt;&lt;br /&gt;		[ActionFilters.LoggerActionFilter]&lt;br /&gt;		public ActionResult Index()&lt;br /&gt;		{&lt;br /&gt;			ViewData[&amp;quot;Message&amp;quot;] = &amp;quot;Welcome to ASP.NET MVC!&amp;quot;;&lt;br /&gt;&lt;br /&gt;			return View();&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		public ActionResult About()&lt;br /&gt;		{&lt;br /&gt;			return View();&lt;br /&gt;		}&lt;br /&gt;	}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;Et la il n’y a pas besoin de marquer la propriété via un attribut [Dependency] car Unity sait résoudre le paramètre du constructeur s’il a été défini au préalable de la manière suivante :&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;		protected void Application_Start()&lt;br /&gt;		{&lt;br /&gt;			AreaRegistration.RegisterAllAreas();&lt;br /&gt;&lt;br /&gt;			RegisterRoutes(RouteTable.Routes);&lt;br /&gt;&lt;br /&gt;			var container = new UnityContainer();&lt;br /&gt;&lt;br /&gt;			&lt;strong&gt;container.RegisterType&amp;lt;Services.ILogger, Services.ConcreteLogger&amp;gt;(new ContainerControlledLifetimeManager());&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;			var cfactory = new UnityControllerFactory(container);&lt;br /&gt;			ControllerBuilder.Current.SetControllerFactory(cfactory);&lt;br /&gt;		}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;Voila, avec le couple Asp.Net MVC + Unity il devient vraiment possible de créer de très grandes applications web très agiles, dans un prochain billet, j’expliquerai comment mettre en place un dispositif de plugins toujours basé sur Unity pour asp.net MVC&lt;/pre&gt;&lt;br /&gt;&lt;iframe style="padding-bottom: 0px; background-color: #fcfcfc; padding-left: 0px; width: 98px; padding-right: 0px; height: 115px; padding-top: 0px" title="Preview" marginheight="0" src="http://cid-a458279ec363307a.skydrive.live.com/embedicon.aspx/Public/Mvc2ApplicationWithUnity.zip" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-7380370763799006175?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/7380370763799006175/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=7380370763799006175' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/7380370763799006175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/7380370763799006175'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2010/05/utiliser-unity-2-avec-aspnet-mvc-2.html' title='Utiliser Unity 2 avec Asp.net MVC 2'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-2603553705209778340</id><published>2010-05-10T22:52:00.001+02:00</published><updated>2010-05-10T22:52:50.296+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Astuce'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><title type='text'>Utiliser Atos SIPS sur windows 2008 R2 64 bits</title><content type='html'>&lt;p&gt;&lt;img style="margin: 0px 5px 5px 0px; display: inline" align="left" src="http://img.neteco.com/photo/00C8000000625694.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;J’ai eu à mettre en place le systeme de paiement par carte bleue basé sur Atos SIPS de la société générale pour ERPStore sur un serveur Microsoft Windows 2008 R2 en 64 bits.&lt;/p&gt;  &lt;p&gt;Autant dire tout suite que le setup téléchargeable sur le site de la banque est ecrit en 16bits et donc ne peut pas se lancer sur une machine recente en 64 bits, j’ai donc téléchargé uniquement les binaires et installé ceux-ci dans un répertoire dedié comme préconisé par la documentation.&lt;/p&gt;  &lt;p&gt;La documentation préconise d’installer le composant COM “SIPSExec.dll” via regsvr32.exe , comme indiqué plus haut, le setup ne fonctionnant pas sur une machine 64bits.&lt;/p&gt;  &lt;p&gt;L’installation se deroule sans pb j’ai un message d’installation positif, mais lors du test de la sandbox j’ai un message plutot succinct ou je deduis via quelques requetes google que j’ai un pb de securité ou autre. (Au passage la meme procedure sur mon serveur de préprod en 32bits ne m’a posé aucun pb).&lt;/p&gt;  &lt;p&gt;En regardant bien ce composant COM, j’en deduit qu’il s’agit finalement d’un wrapper qui permet de lancer les 2 executables founis avec l’API SIPS request.exe et response.exe.&lt;/p&gt;  &lt;p&gt;Voici comment j’ai procedé pour me passer du composant COM et lancer directement les executables.&lt;/p&gt;  &lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;		public string ExecuteSips(string path, string parameters)&lt;br /&gt;		{&lt;br /&gt;			var psi = new System.Diagnostics.ProcessStartInfo(path, parameters);&lt;br /&gt;			psi.RedirectStandardOutput = true;&lt;br /&gt;			psi.ErrorDialog = false;&lt;br /&gt;			psi.UseShellExecute = false;&lt;br /&gt;			psi.CreateNoWindow = true;&lt;br /&gt;			psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;&lt;br /&gt;			string result = null;&lt;br /&gt;			try&lt;br /&gt;			{&lt;br /&gt;				var p = System.Diagnostics.Process.Start(psi);&lt;br /&gt;				var reader = p.StandardOutput;&lt;br /&gt;				result = reader.ReadToEnd();&lt;br /&gt;				reader.Close();&lt;br /&gt;			}&lt;br /&gt;			catch (Exception ex)&lt;br /&gt;			{&lt;br /&gt;				// TODO : Log de l’erreur&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;				throw;&lt;br /&gt;			}&lt;br /&gt;			return result;&lt;br /&gt;		}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;Je passe en parametre “path” le chemin vers request.exe ou response.exe et les differents paramètres “parameters” comme indiqué dans la documentation, cette methode me retourne alors soit le code HTML du formulaire avec les paramètres encryptés pour se diriger vers la banque. Soit me retourne le code décrypté lors de l’appel du serveur par la banque.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;Il n’y a finalement pas besoin d’installer de composant , simplement si le site web tourne avec le compte “NetworkService”, il faut donner les droits d’execution à ce compte sur les fichiers Request.exe et Response.exe.&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-2603553705209778340?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/2603553705209778340/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=2603553705209778340' title='4 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/2603553705209778340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/2603553705209778340'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2010/05/utiliser-atos-sips-sur-windows-2008-r2.html' title='Utiliser Atos SIPS sur windows 2008 R2 64 bits'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-6054056009780747316</id><published>2010-05-09T15:19:00.001+02:00</published><updated>2010-05-09T15:19:43.801+02:00</updated><title type='text'>Comment rendre un projet compatible windows workflow foundation</title><content type='html'>&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_vatZwuxxe78/S-a2bEjBeJI/AAAAAAAAA4I/G4gZd9jiRag/s1600-h/image%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; margin: 0px 5px 5px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" align="left" src="http://lh3.ggpht.com/_vatZwuxxe78/S-a2bh-ypsI/AAAAAAAAA4M/oNzCBA3Ak5c/image_thumb%5B1%5D.png?imgmax=800" width="209" height="173" /&gt;&lt;/a&gt;Dans un projet , il arrive que l’on veuille ajouter à posteriori des workflows et des activities, malheureusement si l’on a commencé un projet “classique”, l’ajout dans le menu de visual studio 2008 n’est pas activé, voici une solution pour y arriver :&lt;/p&gt;  &lt;p&gt;il faut editer le fichier projet.cproj avec notepad par exemple, reperer le premier element &amp;lt;PropertyGroup&amp;gt;, regarder s’il existe un sous-element &amp;lt;ProjectTypeGuids&amp;gt;, si ce n’est pas le cas, ajouter ceci :&lt;/p&gt;  &lt;p&gt;&amp;lt;ProjectTypeGuids&amp;gt;{14822709-B5A1-4724-98CA-57A101D1B079};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}&amp;lt;/ProjectTypeGuids&amp;gt;&lt;/p&gt;  &lt;p&gt;s’il existe déjà, ajouter les 2 guids séparés par un point virgule.&lt;/p&gt;  &lt;p&gt;puis regarder à la fin du fichier cproj si l’élement suivant existe :&lt;/p&gt;  &lt;p&gt;&amp;lt;Import Project=&amp;quot;$(MSBuildExtensionsPath)\Microsoft\Windows Workflow Foundation\v3.5\Workflow.Targets&amp;quot; /&amp;gt;&lt;/p&gt;  &lt;p&gt;si ce n’est pas le cas, il faut l’ajouter, enregistrer le fichier puis réouvrir le projet avec vs 2008, le menu comme indiqué ci-dessus devrait apparaitre.&lt;/p&gt;  &lt;p&gt;Pour finir ne pas oublier de referencer les assemblies suivantes :&lt;/p&gt; System.WorkflowServices   &lt;br /&gt;System.Workflow.Runtime   &lt;br /&gt;System.Workflow.ComponentModel   &lt;br /&gt;System.Workflow.Activities     &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-6054056009780747316?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/6054056009780747316/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=6054056009780747316' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/6054056009780747316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/6054056009780747316'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2010/05/comment-rendre-un-projet-compatible.html' title='Comment rendre un projet compatible windows workflow foundation'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_vatZwuxxe78/S-a2bh-ypsI/AAAAAAAAA4M/oNzCBA3Ak5c/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-8857764543713823198</id><published>2010-05-06T17:50:00.001+02:00</published><updated>2010-05-06T17:50:26.407+02:00</updated><title type='text'>Migration de Microsoft Unity 1.2 vers 2.0 pour ERPStore</title><content type='html'>&lt;p&gt;&lt;img style="margin: 0px 5px 5px 0px; display: inline" alt="patterns &amp;amp; practices Developer Center" align="left" src="http://i.msdn.microsoft.com/Ff663144.pandp-logo-txt-2009(en-us,PandP.10).png" /&gt;&lt;/p&gt;  &lt;p&gt;Unity 2.0 en version standalone vient est maintenant téléchargeable en version standalone sur cette page :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=2d24f179-e0a6-49d7-89c4-5b67d939f91b&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyId=2d24f179-e0a6-49d7-89c4-5b67d939f91b&amp;amp;displaylang=en&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Je suis en train de migrer la &lt;a href="http://www.erpstore.net" target="_blank"&gt;plateforme eCommerce&lt;/a&gt; ERPStore qui utilisait Unity 1.2, je vais énumérer ici toutes les modifications que j’ai du mettre en place pour rendre ERPStore compatible avec Unity 2.0&lt;/p&gt;  &lt;p&gt;Premier point interessant, Unity 2.0 integre dans son assembly le namespace &lt;strong&gt;Microsoft.Practices.ObjectBuilder2, &lt;/strong&gt;ceci limite le nombre d’assembly a deployer.&lt;/p&gt;  &lt;p&gt;Deuxieme point, la methode Resolve&amp;lt;&amp;gt; à été supprimée de l’interface IUnityContainer , et à été remplacée par une methode d’extension, il faut maintenant declarer un using Microsoft.Practices.Unity en lieu et place.&lt;/p&gt;  &lt;p&gt;Si un fichier de configuration est utilisé pour le mapping, il faut convertir la section &lt;/p&gt;  &lt;p&gt;&amp;lt;configSections&amp;gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;section name=&amp;quot;unity&amp;quot; type=&amp;quot;Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;lt;/configSections&amp;gt; &lt;/p&gt;  &lt;p&gt;en&lt;/p&gt;  &lt;p&gt;&amp;lt;configSections&amp;gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;section name=&amp;quot;unity&amp;quot; type=&amp;quot;Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;lt;/configSections&amp;gt;&lt;/p&gt;  &lt;p&gt;Je n’ai eu que ça a modifier pour que ça refonctionne.&lt;/p&gt;  &lt;p&gt;Au global , ce qui change (voir le &lt;a href="http://unity.codeplex.com/wikipage?title=Unity2ChangeLog&amp;amp;referringTitle=Unity2ReleaseNotes" target="_blank"&gt;ChangeLog&lt;/a&gt; ) :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Amélioration de l’API d’interception.&lt;/li&gt;    &lt;li&gt;Nouvelle API d’injection &lt;/li&gt;    &lt;li&gt;Dependances optionnelles&lt;/li&gt;    &lt;li&gt;De nouveaux lifetime manager &lt;/li&gt;    &lt;li&gt;Resolution tardive (très interessant) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;var container = new UnityContainer();&lt;/p&gt;  &lt;p&gt;var resolver = container.Resolve&amp;lt;Func&amp;lt;IMyService&amp;gt;&amp;gt;();&lt;/p&gt;  &lt;p&gt;declaration du mapping&lt;/p&gt;  &lt;p&gt;container.RegisterType&amp;lt;IMyService, MyService&amp;gt;();&lt;/p&gt;  &lt;p&gt;IMyService service = resolver();&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-8857764543713823198?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/8857764543713823198/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=8857764543713823198' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/8857764543713823198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/8857764543713823198'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2010/05/migration-de-microsoft-unity-12-vers-20.html' title='Migration de Microsoft Unity 1.2 vers 2.0 pour ERPStore'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-6076701336129158095</id><published>2010-04-23T19:42:00.001+02:00</published><updated>2010-04-23T19:42:25.163+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Astuce'/><category scheme='http://www.blogger.com/atom/ns#' term='mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><title type='text'>Comment tester les routes Asp.Net MVC</title><content type='html'>&lt;p&gt;lors d’une phase de test, j’ai été amené a devoir tester un certain nombre de routes pour savoir quels Controllers et Actions etaient matchés, voici comment j’ai procédé.&lt;/p&gt; &lt;p&gt;Dans un premier temps il faut creer une classe HttpContext “bouchon” qui herite de HttpContextBase&lt;/p&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;public class MockHttpContext : HttpContextBase&lt;br /&gt;	{&lt;br /&gt;		private readonly string _relativeUrl;&lt;br /&gt;		private readonly Models.UserPrincipal _principal;&lt;br /&gt;		private readonly NameValueCollection _formParams;&lt;br /&gt;		private readonly NameValueCollection _queryStringParams;&lt;br /&gt;		private readonly HttpCookieCollection _cookies;&lt;br /&gt;		private readonly SessionStateItemCollection _sessionItems;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;		public MockHttpContext(string relativeUrl)&lt;br /&gt;			: this(relativeUrl, null, null, null, null, null)&lt;br /&gt;		{&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		public MockHttpContext(string relativeUrl, Models.UserPrincipal principal, NameValueCollection formParams, NameValueCollection queryStringParams, HttpCookieCollection cookies, SessionStateItemCollection sessionItems)&lt;br /&gt;		{&lt;br /&gt;			_relativeUrl = relativeUrl;&lt;br /&gt;			_principal = principal;&lt;br /&gt;			_formParams = formParams;&lt;br /&gt;			_queryStringParams = queryStringParams;&lt;br /&gt;			_cookies = cookies;&lt;br /&gt;			_sessionItems = sessionItems;&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		public override HttpRequestBase Request&lt;br /&gt;		{&lt;br /&gt;			get&lt;br /&gt;			{&lt;br /&gt;				return new MockHttpRequest(_relativeUrl, _formParams, _queryStringParams, _cookies);&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		public override IPrincipal User&lt;br /&gt;		{&lt;br /&gt;			get&lt;br /&gt;			{&lt;br /&gt;				return _principal;&lt;br /&gt;			}&lt;br /&gt;			set&lt;br /&gt;			{&lt;br /&gt;				throw new System.NotImplementedException();&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		public override HttpSessionStateBase Session&lt;br /&gt;		{&lt;br /&gt;			get&lt;br /&gt;			{&lt;br /&gt;				return null;&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;	}&lt;/pre&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;Et une classe HttpRequest “Bouchon”&lt;/pre&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;	public class MockHttpRequest : HttpRequestBase&lt;br /&gt;	{&lt;br /&gt;		private readonly string _relativeUrl;&lt;br /&gt;		private readonly NameValueCollection _formParams;&lt;br /&gt;		private readonly NameValueCollection _queryStringParams;&lt;br /&gt;		private readonly HttpCookieCollection _cookies;&lt;br /&gt;&lt;br /&gt;		public MockHttpRequest(string relativeUrl, NameValueCollection formParams, NameValueCollection queryStringParams, HttpCookieCollection cookies)&lt;br /&gt;		{&lt;br /&gt;			_relativeUrl = relativeUrl;&lt;br /&gt;			_formParams = formParams;&lt;br /&gt;			_queryStringParams = queryStringParams;&lt;br /&gt;			_cookies = cookies;&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		public override NameValueCollection Form&lt;br /&gt;		{&lt;br /&gt;			get&lt;br /&gt;			{&lt;br /&gt;				return _formParams;&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		public override NameValueCollection QueryString&lt;br /&gt;		{&lt;br /&gt;			get&lt;br /&gt;			{&lt;br /&gt;				return _queryStringParams;&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		public override HttpCookieCollection Cookies&lt;br /&gt;		{&lt;br /&gt;			get&lt;br /&gt;			{&lt;br /&gt;				return _cookies;&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		public override string AppRelativeCurrentExecutionFilePath&lt;br /&gt;		{&lt;br /&gt;			get { return _relativeUrl; }&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		public override string PathInfo&lt;br /&gt;		{&lt;br /&gt;			get { return String.Empty; }&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;	}&lt;/pre&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;Et pour pouvoir tester n’importe quelle url, il faut commencer par la création du context :&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;var fakeContext = new Serialcoder.ERPStore.Web.MockHttpContext(“/test”); &lt;br /&gt;&lt;p&gt;puis passer le context au gestionnaire des routes&amp;nbsp; pour obtenir les valeurs sur la route determinée :&lt;br /&gt;&lt;p&gt;var currentRoute = RouteTable.Routes.GetRouteData(context); &lt;br /&gt;&lt;p&gt;on verifie le “controller” et l’”action” retournés :&lt;br /&gt;&lt;p&gt;var controller =(string) ((KeyValuePair&amp;lt;string, object&amp;gt;)currentRoute.Values["controller"]).Value;&lt;br /&gt;&lt;p&gt;var action = (string) ((KeyValuePair&amp;lt;string, object&amp;gt;)currentRoute.Values["action"]).Value;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;il ne reste plus qu’a faire les comparaisons de test&lt;/pre&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: true; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;&amp;nbsp;&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-6076701336129158095?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/6076701336129158095/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=6076701336129158095' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/6076701336129158095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/6076701336129158095'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2010/04/comment-tester-les-routes-aspnet-mvc.html' title='Comment tester les routes Asp.Net MVC'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-1920786174800136960</id><published>2010-04-22T19:03:00.001+02:00</published><updated>2010-04-22T19:03:36.965+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Astuce'/><category scheme='http://www.blogger.com/atom/ns#' term='mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><title type='text'>Compression GZip d’une vue avec asp.net mvc</title><content type='html'>&lt;p&gt;&lt;img src="http://static.commentcamarche.net/www.commentcamarche.net/faq/images/0-60qBI3AS-gzip-s-.png" /&gt;&lt;/p&gt;  &lt;p&gt;Il est possible de compresser très facilement le contenu d’une vue avec asp.net mvc avant son rendu grace à un FilterAttribute, voici comment proceder :&lt;/p&gt;  &lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;	public class CompressFilter : ActionFilterAttribute&lt;br /&gt;	{&lt;br /&gt;		public override void OnActionExecuting(ActionExecutingContext filterContext)&lt;br /&gt;		{&lt;br /&gt;			var request = filterContext.HttpContext.Request;&lt;br /&gt;&lt;br /&gt;			string acceptEncoding = request.Headers[&amp;quot;Accept-Encoding&amp;quot;];&lt;br /&gt;&lt;br /&gt;			if (string.IsNullOrEmpty(acceptEncoding))&lt;br /&gt;			{&lt;br /&gt;				return;&lt;br /&gt;			}&lt;br /&gt;&lt;br /&gt;			acceptEncoding = acceptEncoding.ToUpperInvariant();&lt;br /&gt;&lt;br /&gt;			var response = filterContext.HttpContext.Response;&lt;br /&gt;&lt;br /&gt;			if (acceptEncoding.IndexOf(&amp;quot;GZIP&amp;quot;, StringComparison.InvariantCultureIgnoreCase) != -1)&lt;br /&gt;			{&lt;br /&gt;				response.AppendHeader(&amp;quot;Content-encoding&amp;quot;, &amp;quot;gzip&amp;quot;);&lt;br /&gt;				response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);&lt;br /&gt;			}&lt;br /&gt;			else if (acceptEncoding.IndexOf(&amp;quot;DEFLATE&amp;quot;,  StringComparison.InvariantCultureIgnoreCase) != -1)&lt;br /&gt;			{&lt;br /&gt;				response.AppendHeader(&amp;quot;Content-encoding&amp;quot;, &amp;quot;deflate&amp;quot;);&lt;br /&gt;				response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;	}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;puis de placer cet attribut sur la vue à compresser :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;		[CompressFilter]&lt;br /&gt;		public ActionResult Index()&lt;br /&gt;		{&lt;br /&gt;			return View();&lt;br /&gt;		}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;"&gt;Attention, si le serveur IIS est déjà configuré pour compresser les pages, cela peut creer des problèmes d’affichage.&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-1920786174800136960?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/1920786174800136960/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=1920786174800136960' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/1920786174800136960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/1920786174800136960'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2010/04/compression-gzip-dune-vue-avec-aspnet.html' title='Compression GZip d’une vue avec asp.net mvc'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-5380500497556178404</id><published>2010-04-20T17:48:00.001+02:00</published><updated>2010-04-20T17:50:06.412+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Astuce'/><category scheme='http://www.blogger.com/atom/ns#' term='mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><title type='text'>Asp.net MVC et CatchAll</title><content type='html'>&lt;p&gt;&lt;img style="margin: 0px 10px 10px 0px; display: inline" align="left" src="http://membres.multimania.fr/bleu/autoroutes_actuel.JPG" width="253" height="225" /&gt;Je viens d’avoir une attaque sur un site asp.net, du classique /admin/pma/main.php, ect… certains doivent bien connaitre. au passage il ne faut jamais mettre son backoffice sur le meme host que le site front, voir si c’est possible et je prêche pour ma parroisse, ne pas avoir de backoffice du tout mais plutot un vrai logiciel de gestion qui permet de piloter le site front , mais ceci est un autre sujet.&lt;/p&gt;  &lt;p&gt;Ces pages provoquaient des erreurs de type 500 qui poluaient le journal d’evenement.&lt;/p&gt;  &lt;p&gt;J’ai ajouté un systeme de filtre qui me permet de voir les pages qui ne sont pas catchées par mes routes que je ne détaillerai pas ici et du coup j’ai pu éliminer les attaques *.php&lt;/p&gt;  &lt;br&gt; &lt;br&gt; &lt;br&gt; &lt;br&gt; &lt;div&gt; &lt;p&gt;Voici un moyen d’intercepter toutes les routes avec asp.net, dans la déclaration des routes (global.asax) il suffit d’ajouter celle-ci &lt;u&gt;&lt;strong&gt;EN DERNIER attention !&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;RouteTable.Routes.MapRoute(    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;CatchAll&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; , &amp;quot;{*catchall}&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; , new { controller = &amp;quot;Home&amp;quot;, action = &amp;quot;CatchAll&amp;quot; }     &lt;br /&gt;);&lt;/p&gt;  &lt;p&gt;puis d’ajouter la methode CatchAll au controller Home&lt;/p&gt;  &lt;p&gt;public ActionResult CatchAll()    &lt;br /&gt;{ &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Response.StatusCode = 404;&lt;/p&gt;    &lt;p&gt;return View(&amp;quot;404&amp;quot;);&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-5380500497556178404?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/5380500497556178404/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=5380500497556178404' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/5380500497556178404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/5380500497556178404'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2010/04/aspnet-mvc-et-catchall.html' title='Asp.net MVC et CatchAll'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-4226565109746006012</id><published>2010-04-19T12:28:00.001+02:00</published><updated>2010-04-19T12:28:07.889+02:00</updated><title type='text'>Premier site Asp.net MVC2</title><content type='html'>&lt;a href="http://lh5.ggpht.com/_vatZwuxxe78/S8wwMEH05yI/AAAAAAAAA4A/MUWTu9d9-ws/s1600-h/home.quincaillerie.pro%5B4%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 10px 10px 0px; display: inline; border-top: 0px; border-right: 0px" title="home.quincaillerie.pro" border="0" alt="home.quincaillerie.pro" align="left" src="http://lh4.ggpht.com/_vatZwuxxe78/S8wwNt5RkrI/AAAAAAAAA4E/bUpnCsF7Mbs/home.quincaillerie.pro_thumb%5B2%5D.png?imgmax=800" width="346" height="711" /&gt;&lt;/a&gt;   &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.quincaillerie.pro" target="_blank"&gt;http://www.quincaillerie.pro&lt;/a&gt;, il s’agit du premier site utilisant la &lt;a href="http://www.erpstore.net" target="_blank"&gt;plateforme eCommerce&lt;/a&gt; ERPStore couplée à ERP360 (&lt;a href="http://www.erp360.net" target="_blank"&gt;gestion commerciale&lt;/a&gt;) tournant avec Asp.net MVC2.&lt;/p&gt;  &lt;p&gt;Le webdesign du site à été réalisé par mon amis Yvan Gapin, qui commence à très bien comprendre les ficèles d’Asp.net MVC ;)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.sid-networks.com" target="_blank"&gt;http://www.sid-networks.com&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Je ferais bientot un article très complet pour decrire avec precision toute l’architecture d’ERPStore.&lt;/p&gt;  &lt;p&gt;Première difficulté par rapport à MVC1 , les requetes jQuery JSON ne fonctionnent plus qu’en POST, il a fallu que je modifie quelques scripts (ajout au panier), j’ai passé pas mal de temps avant de comprendre pourquoi ils ne fonctionnaient plus, on le dit toujours, il faut lire la doc ;)&lt;/p&gt;  &lt;p&gt;Deuxième difficulté plus vicieuse, &lt;strong&gt;il ne faut &lt;u&gt;jamais&lt;/u&gt; retirer&lt;/strong&gt; la route par defaut “{controller}/{action}/{id}”, j’ai passé une bonne journée à essayer de comprendre pourquoi tous les traitements etaient doublés. D’autre part, maintenant avec MVC2 de nouvelles&amp;#160; methodes d’extension Html.RenderAction() ou Html.Action() font leur apparition, elles permettent de faire du rendu partiel, avant avec MVC1 il fallait utiliser les extensions de MVC.Futures, lors du portage sur ces nouvelles methodes natives, je me suis aussi rendu compte que d’avoir retiré la route par defaut posait un vrai problème, dans ce cas il y a un message d’erreur pour le moins énigmatique : “No route in the route table matches the supplied values.”&lt;/p&gt;  &lt;p&gt;Je n’ai pas encore utilisé la nouvelle fonctionnalité “Areas”, peut etre si j’inclu un CMS open source, ça pourra etre interessant de voir comme cela peut fonctionner.&lt;/p&gt;  &lt;p&gt;Prochaine étape, rendre ERPStore compatible avec les Smartphones.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-4226565109746006012?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/4226565109746006012/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=4226565109746006012' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/4226565109746006012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/4226565109746006012'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2010/04/premier-site-aspnet-mvc2.html' title='Premier site Asp.net MVC2'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_vatZwuxxe78/S8wwNt5RkrI/AAAAAAAAA4E/bUpnCsF7Mbs/s72-c/home.quincaillerie.pro_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-3647756885060938522</id><published>2009-12-12T12:00:00.001+01:00</published><updated>2009-12-12T12:00:07.307+01:00</updated><title type='text'>Mes meilleures pratiques pour ASP.Net MVC</title><content type='html'>&lt;h3&gt;1 – Ne pas utiliser les controlleurs par defaut&lt;/h3&gt;  &lt;p&gt;Supprimer les controlleurs Account et Home ce ne sont que de mauvaises pratiques ;) &lt;/p&gt;  &lt;h3&gt;2 – Utiliser l’inversion de controle&lt;/h3&gt;  &lt;p&gt;Pour ma part j’utilise Microsoft Unity 1.2 comme inverseur de controle, l’enorme avantage est que l’on defini au demarrage de l’application le mapping des services, ceux-ci sont résolu à la demande dans les controlleurs.&lt;/p&gt;  &lt;h3&gt;3 – Ne pas mettre de code dans le site et surtout pas de code behind&lt;/h3&gt;  &lt;p&gt;Sortir toute la logique dans une assembly a part qui sera testée, le projet web ne doit pas produire d’assembly.&lt;/p&gt;  &lt;h3&gt;4 – Ne pas utiliser de Magic strings&lt;/h3&gt;  &lt;p&gt;Eviter absolument les ecritures du type ViewData[“MagicString”] utiliser en lieu et place des vrais Models de manière à typer les vues.&lt;/p&gt;  &lt;h3&gt;5 – Controller toutes les Url sans exception&lt;/h3&gt;  &lt;p&gt;Eviter d’ecrire directement dans la vue du code comme &amp;lt;%=Html.ActionLink(&amp;quot;title&amp;quot;, &amp;quot;Account&amp;quot;, new { myparam = &amp;quot;xxx&amp;quot; }) %&amp;gt;&lt;/p&gt;  &lt;p&gt;mais plutot &amp;lt;%=Html.MyAccountActionLink(“xxx”)%&amp;gt; en ajoutant une methode d’extension “typée”&lt;/p&gt;  &lt;h3&gt;6 – Ecrire autant que possible toutes les routes&lt;/h3&gt;  &lt;p&gt;a lieu de :&lt;/p&gt;  &lt;p&gt;RouteTable.Routes.MapRoute(   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;Default&amp;quot;,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;{controller}/{action}/{id}&amp;quot;,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; new { controller = &amp;quot;Home&amp;quot;, action = &amp;quot;Index&amp;quot;, id = &amp;quot;&amp;quot; }    &lt;br /&gt;); &lt;/p&gt;  &lt;p&gt;ecrivez plutot une route pour chaque url avec un nom&lt;/p&gt;  &lt;p&gt;RouteTable.Routes.MapRoute(   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;Account&amp;quot;,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;account&amp;quot;,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; new { controller = &amp;quot;Account&amp;quot;, action = &amp;quot;Index&amp;quot; }    &lt;br /&gt;); &lt;/p&gt;  &lt;p&gt;voir 5 pour typer les appels&lt;/p&gt;  &lt;h3&gt;7 – Proscrire l’utilisation du singleton System.Web.HttpContext.Current&lt;/h3&gt;  &lt;p&gt;un appel comme ceci dans une methode n’est pas testable&lt;/p&gt;  &lt;h3&gt;8 – Utiliser HtmlHelper ou UrlHelper&lt;/h3&gt;  &lt;p&gt;dès que la logique d’affichage dans la vue nécessite plus qu’une boucle ou une condition , créer une méthode d’extension qui génère le code HTML&lt;/p&gt;  &lt;h3&gt;9 – Utiliser les ActionFilters&lt;/h3&gt;  &lt;p&gt;Utiliser les ActionFilters pour mutualiser le code entre les controlleurs.&lt;/p&gt;  &lt;h3&gt;10 – Controller toutes les exceptions&lt;/h3&gt;  &lt;p&gt;Utiliser sa propre page d’interception des erreurs et logger les exceptions&lt;/p&gt;  &lt;p&gt;[HandleError(View=&amp;quot;500&amp;quot;)]   &lt;br /&gt;public class AccountController &lt;/p&gt;  &lt;p&gt;Utiliser un catchall pour les erreurs 404 et logger.&lt;/p&gt;  &lt;p&gt;RouteTable.Routes.MapRoute(   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;CatchAll&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; , &amp;quot;{*catchall}&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; , new { controller = &amp;quot;Home&amp;quot;, action = &amp;quot;CatchAll&amp;quot; }    &lt;br /&gt;); &lt;/p&gt;  &lt;p&gt;Attention mettre cette route vraiment en dernier.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-3647756885060938522?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/3647756885060938522/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=3647756885060938522' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/3647756885060938522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/3647756885060938522'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2009/12/mes-meilleures-pratiques-pour-aspnet.html' title='Mes meilleures pratiques pour ASP.Net MVC'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-993909264939988540</id><published>2009-11-24T23:17:00.001+01:00</published><updated>2009-11-24T23:17:18.224+01:00</updated><title type='text'>System.Web.HttpUtility.ParseQueryString et UrlDecode</title><content type='html'>&lt;p&gt;La première question que je me pose lorsque je dois developper quelque chose de nouveau est, est-ce que ça existe pas déjà !, je voulais donc parser une url pour extraire les paramètres, je vois la methode System.Web.HttpUtility.ParseQueryString, elle retourne une NameValueCollection.&lt;/p&gt;  &lt;p&gt; Je lance un test&amp;#160; :&lt;/p&gt;  &lt;div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid"&gt;   &lt;div style="background-color: #000000; white-space: nowrap; overflow: scroll"&gt;&lt;font face=" Consolas"&gt;&lt;font size="3"&gt;&lt;/font&gt;&lt;font color="#a79a86"&gt;&lt;span style="background-color: #10100d"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [&lt;/span&gt;&lt;font color="#009b00"&gt;Test&lt;/font&gt;&lt;font color="#a79a86"&gt;]           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#d6d694"&gt;public&lt;/font&gt;&lt;font color="#a79a86"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#d6d694"&gt;void&lt;/font&gt;&lt;font color="#a79a86"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#e8e8e8"&gt;ParseQueryString&lt;/font&gt;&lt;font color="#a79a86"&gt;()           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#d6d694"&gt;var&lt;/font&gt;&lt;font color="#a79a86"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#e8e8e8"&gt;url&lt;/font&gt;&lt;font color="#a79a86"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#80ff00"&gt;=&lt;/font&gt;&lt;font color="#a79a86"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#44b1e3"&gt;&amp;quot;http://www.site.com/index.html?param1=A+B&amp;quot;&lt;/font&gt;&lt;font color="#a79a86"&gt;;           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#d6d694"&gt;var&lt;/font&gt;&lt;font color="#a79a86"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#e8e8e8"&gt;uri&lt;/font&gt;&lt;font color="#a79a86"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#80ff00"&gt;=&lt;/font&gt;&lt;font color="#a79a86"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#d6d694"&gt;new&lt;/font&gt;&lt;font color="#a79a86"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#009b00"&gt;Uri&lt;/font&gt;&lt;font color="#a79a86"&gt;(&lt;/font&gt;&lt;font color="#e8e8e8"&gt;url&lt;/font&gt;&lt;font color="#a79a86"&gt;);           &lt;br /&gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#d6d694"&gt;var&lt;/font&gt;&lt;font color="#a79a86"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#e8e8e8"&gt;prms&lt;/font&gt;&lt;font color="#a79a86"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#80ff00"&gt;=&lt;/font&gt;&lt;font color="#a79a86"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#e8e8e8"&gt;System&lt;/font&gt;&lt;font color="#80ff00"&gt;.&lt;/font&gt;&lt;font color="#e8e8e8"&gt;Web&lt;/font&gt;&lt;font color="#80ff00"&gt;.&lt;/font&gt;&lt;font color="#009b00"&gt;HttpUtility&lt;/font&gt;&lt;font color="#80ff00"&gt;.&lt;/font&gt;&lt;font color="#e8e8e8"&gt;ParseQueryString&lt;/font&gt;&lt;font color="#a79a86"&gt;(&lt;/font&gt;&lt;font color="#e8e8e8"&gt;uri&lt;/font&gt;&lt;font color="#80ff00"&gt;.&lt;/font&gt;&lt;font color="#e8e8e8"&gt;Query&lt;/font&gt;&lt;font color="#a79a86"&gt;);           &lt;br /&gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#009b00"&gt;Assert&lt;/font&gt;&lt;font color="#80ff00"&gt;.&lt;/font&gt;&lt;font color="#e8e8e8"&gt;AreEqual&lt;/font&gt;&lt;font color="#a79a86"&gt;(&lt;/font&gt;&lt;font color="#e8e8e8"&gt;prms&lt;/font&gt;&lt;font color="#80ff00"&gt;.&lt;/font&gt;&lt;font color="#e8e8e8"&gt;Keys&lt;/font&gt;&lt;font color="#a79a86"&gt;[&lt;/font&gt;&lt;font color="#00ffff"&gt;0&lt;/font&gt;&lt;font color="#a79a86"&gt;], &lt;/font&gt;&lt;font color="#44b1e3"&gt;&amp;quot;param1&amp;quot;&lt;/font&gt;&lt;font color="#a79a86"&gt;);           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#009b00"&gt;Assert&lt;/font&gt;&lt;font color="#80ff00"&gt;.&lt;/font&gt;&lt;font color="#e8e8e8"&gt;AreEqual&lt;/font&gt;&lt;font color="#a79a86"&gt;(&lt;/font&gt;&lt;font color="#e8e8e8"&gt;prms&lt;/font&gt;&lt;font color="#a79a86"&gt;[&lt;/font&gt;&lt;font color="#44b1e3"&gt;&amp;quot;param1&amp;quot;&lt;/font&gt;&lt;font color="#a79a86"&gt;], &lt;/font&gt;&lt;font color="#44b1e3"&gt;&amp;quot;A+B&amp;quot;&lt;/font&gt;&lt;font color="#a79a86"&gt;);           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt;&lt;/font&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Résultat :&lt;/p&gt;  &lt;div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid"&gt;   &lt;div style="background-color: #000000; white-space: nowrap; overflow: scroll"&gt;&lt;font face=" Envy Code R VS"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;font color="#80ff00"&gt;&lt;span style="background-color: #10100d"&gt;failed:&amp;#160; &lt;br /&gt;&amp;#160; String lengths are both 3. Strings differ at index 1.            &lt;br /&gt;&amp;#160; Expected: &amp;quot;A B&amp;quot;            &lt;br /&gt;&amp;#160; But was:&amp;#160; &amp;quot;A+B&amp;quot;            &lt;br /&gt;&amp;#160; ------------^&lt;/span&gt;&lt;/font&gt;&lt;/font&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;La méthode se permet d’urldecoder le paramètre (chose qui ne lui ai pas demandé) en plus à la rigueur, ça serait param1=A%20B, mais la c’est imparable comme bug. &lt;/p&gt;  &lt;p&gt;Je précise, j’utilise le Framework .Net 3.5 SP1&lt;/p&gt;  &lt;p&gt;Je viens juste de perdre quelques heures avant de comprendre le comportement de cette méthode. Pour contourner :&lt;/p&gt;  &lt;div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid"&gt;   &lt;div style="background-color: #000000; white-space: nowrap; overflow: scroll"&gt;&lt;font face=" Consolas"&gt;&lt;font size="3"&gt;&lt;/font&gt;&lt;font color="#a79a86"&gt;&lt;span style="background-color: #10100d"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [&lt;/span&gt;&lt;font color="#009b00"&gt;Test&lt;/font&gt;&lt;font color="#a79a86"&gt;]           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#d6d694"&gt;public&lt;/font&gt;&lt;font color="#a79a86"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#d6d694"&gt;void&lt;/font&gt;&lt;font color="#a79a86"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#e8e8e8"&gt;ParseQueryString&lt;/font&gt;&lt;font color="#a79a86"&gt;()           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#d6d694"&gt;var&lt;/font&gt;&lt;font color="#a79a86"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#e8e8e8"&gt;url&lt;/font&gt;&lt;font color="#a79a86"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#80ff00"&gt;=&lt;/font&gt;&lt;font color="#a79a86"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#44b1e3"&gt;&amp;quot;http://www.site.com/index.html?param1=A+B&amp;quot;&lt;/font&gt;&lt;font color="#a79a86"&gt;;           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#d6d694"&gt;var&lt;/font&gt;&lt;font color="#a79a86"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#e8e8e8"&gt;uri&lt;/font&gt;&lt;font color="#a79a86"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#80ff00"&gt;=&lt;/font&gt;&lt;font color="#a79a86"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#d6d694"&gt;new&lt;/font&gt;&lt;font color="#a79a86"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#009b00"&gt;Uri&lt;/font&gt;&lt;font color="#a79a86"&gt;(&lt;/font&gt;&lt;font color="#e8e8e8"&gt;url&lt;/font&gt;&lt;font color="#a79a86"&gt;);           &lt;br /&gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#d6d694"&gt;var&lt;/font&gt;&lt;font color="#a79a86"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#e8e8e8"&gt;prms&lt;/font&gt;&lt;font color="#a79a86"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#80ff00"&gt;=&lt;/font&gt;&lt;font color="#a79a86"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#d6d694"&gt;from&lt;/font&gt;&lt;font color="#a79a86"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#e8e8e8"&gt;keyvalue&lt;/font&gt;&lt;font color="#a79a86"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#d6d694"&gt;in&lt;/font&gt;&lt;font color="#a79a86"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#e8e8e8"&gt;uri&lt;/font&gt;&lt;font color="#80ff00"&gt;.&lt;/font&gt;&lt;font color="#e8e8e8"&gt;Query&lt;/font&gt;&lt;font color="#80ff00"&gt;.&lt;/font&gt;&lt;font color="#e8e8e8"&gt;Replace&lt;/font&gt;&lt;font color="#a79a86"&gt;(&lt;/font&gt;&lt;font color="#44b1e3"&gt;&amp;quot;?&amp;quot;&lt;/font&gt;&lt;font color="#a79a86"&gt;, &lt;/font&gt;&lt;font color="#44b1e3"&gt;&amp;quot;&amp;quot;&lt;/font&gt;&lt;font color="#a79a86"&gt;)&lt;/font&gt;&lt;font color="#80ff00"&gt;.&lt;/font&gt;&lt;font color="#e8e8e8"&gt;Split&lt;/font&gt;&lt;font color="#a79a86"&gt;(&lt;/font&gt;&lt;font color="#44b1e3"&gt;'&amp;amp;'&lt;/font&gt;&lt;font color="#a79a86"&gt;)           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#d6d694"&gt;select&lt;/font&gt;&lt;font color="#a79a86"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#e8e8e8"&gt;keyvalue&lt;/font&gt;&lt;font color="#80ff00"&gt;.&lt;/font&gt;&lt;font color="#e8e8e8"&gt;Split&lt;/font&gt;&lt;font color="#a79a86"&gt;(&lt;/font&gt;&lt;font color="#44b1e3"&gt;'='&lt;/font&gt;&lt;font color="#a79a86"&gt;);           &lt;br /&gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#009b00"&gt;Assert&lt;/font&gt;&lt;font color="#80ff00"&gt;.&lt;/font&gt;&lt;font color="#e8e8e8"&gt;AreEqual&lt;/font&gt;&lt;font color="#a79a86"&gt;(&lt;/font&gt;&lt;font color="#e8e8e8"&gt;prms&lt;/font&gt;&lt;font color="#80ff00"&gt;.&lt;/font&gt;&lt;font color="#e8e8e8"&gt;First&lt;/font&gt;&lt;font color="#a79a86"&gt;()[&lt;/font&gt;&lt;font color="#00ffff"&gt;0&lt;/font&gt;&lt;font color="#a79a86"&gt;], &lt;/font&gt;&lt;font color="#44b1e3"&gt;&amp;quot;param1&amp;quot;&lt;/font&gt;&lt;font color="#a79a86"&gt;);           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#009b00"&gt;Assert&lt;/font&gt;&lt;font color="#80ff00"&gt;.&lt;/font&gt;&lt;font color="#e8e8e8"&gt;AreEqual&lt;/font&gt;&lt;font color="#a79a86"&gt;(&lt;/font&gt;&lt;font color="#e8e8e8"&gt;prms&lt;/font&gt;&lt;font color="#80ff00"&gt;.&lt;/font&gt;&lt;font color="#e8e8e8"&gt;First&lt;/font&gt;&lt;font color="#a79a86"&gt;()[&lt;/font&gt;&lt;font color="#00ffff"&gt;1&lt;/font&gt;&lt;font color="#a79a86"&gt;], &lt;/font&gt;&lt;font color="#44b1e3"&gt;&amp;quot;A+B&amp;quot;&lt;/font&gt;&lt;font color="#a79a86"&gt;);           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt;&lt;/font&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Le resultat est :&lt;/p&gt;  &lt;p&gt;1 passed, 0 failed, 0 skipped&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-993909264939988540?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/993909264939988540/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=993909264939988540' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/993909264939988540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/993909264939988540'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2009/11/systemwebhttputilityparsequerystring-et.html' title='System.Web.HttpUtility.ParseQueryString et UrlDecode'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-7080865864201421175</id><published>2009-09-18T15:51:00.001+02:00</published><updated>2009-09-18T15:51:50.984+02:00</updated><title type='text'>Mise à jour virtual pc 2007 sp1</title><content type='html'>&lt;p&gt;Une mise à jour interessante pour virtual pc 2007 est disponible sur le site de Microsoft à cette adresse :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://support.microsoft.com/Default.aspx?id=958162"&gt;http://support.microsoft.com/Default.aspx?id=958162&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;elle permet surtout d’obtenir des resolution d’ecran jusqu’a 2048 x 1920&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.techiequest.com/pic/virtualpc2007-1.jpg" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-7080865864201421175?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/7080865864201421175/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=7080865864201421175' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/7080865864201421175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/7080865864201421175'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2009/09/mise-jour-virtual-pc-2007-sp1.html' title='Mise à jour virtual pc 2007 sp1'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-2815941017890245874</id><published>2009-09-17T23:00:00.001+02:00</published><updated>2009-09-17T23:00:17.253+02:00</updated><title type='text'>Yahoo meme, un nouveau concurrent de twitter</title><content type='html'>&lt;p&gt;Décidement twitter est attaqué de tous les cotés, après Facebook, c’est au tour de yahoo de sortir son réseau social avec le doux nom de “meme” qui ne signifie rien de social pour nous les Français, j’ai la chance de participer une alpha version, il me reste 6 invitations, avis aux amateurs.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_vatZwuxxe78/SrKjW3R2dWI/AAAAAAAAAvY/8_JMOkdTPT0/s1600-h/image%5B3%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_vatZwuxxe78/SrKjYDaCD0I/AAAAAAAAAvc/UfaIdjMs5NU/image_thumb%5B1%5D.png?imgmax=800" width="651" height="562" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Ce que l’on peut voir tout de suite est que l’on peut poster aussi bien du texte que de la musique , des photos ou des videos, seules les photos sont uploadables, pour la musique ou la video il faut obligatoirement un lien extene. Il n’y a visiblement pas de possibilité d’envoi de message par SMS.&lt;/p&gt;  &lt;p&gt;La page de settings est rudimentaire (comparée à twitter). &lt;/p&gt;  &lt;p&gt;Comme pour twitter, on peut citer un utilisateur via son pseudo @utilisateur, il est plus facile de “reposter” car ceci est inclu dans l’interface (pas besoin de prefixer par RT). Il y a un compteur indiquant le nombre de “repost”. Il est possible de repondre à un post, et toute la discussion tourne autour du premier post sans s’eparpiller comme dans twitter mais n’ayant que peu de followers je n’ai pas pu tester.&lt;/p&gt;  &lt;p&gt;C’est un compromis entre Twitter et Facebook assez interessant, ça se rapproche plus de FriendFeed, les places vont etre de plus en plus difficile a gagner, meme quand on s’appelle Yahoo, je souhaite bonne chance à ce nouveau reseau, que le meilleur l’emporte.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-2815941017890245874?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/2815941017890245874/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=2815941017890245874' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/2815941017890245874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/2815941017890245874'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2009/09/yahoo-meme-un-nouveau-concurrent-de.html' title='Yahoo meme, un nouveau concurrent de twitter'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_vatZwuxxe78/SrKjYDaCD0I/AAAAAAAAAvc/UfaIdjMs5NU/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-7922678535657054295</id><published>2009-09-11T16:41:00.001+02:00</published><updated>2009-09-11T17:59:23.537+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Outils'/><category scheme='http://www.blogger.com/atom/ns#' term='Astuce'/><title type='text'>Lancer IE6, IE7 et IE8 sur la meme machine (mise a jour)</title><content type='html'>&lt;p&gt;J’avais ecrit il y a quelque temps un article avec une solution un peu contraignante pour faire tourner&amp;#160; differentes versions d’internet explorer sur la meme machine, indispensable pour les web designers.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://marc-chouteau.blogspot.com/2007/02/comment-executer-differentes-version-d.html"&gt;http://marc-chouteau.blogspot.com/2007/02/comment-executer-differentes-version-d.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Microsoft a depuis,&amp;#160; mis en ligne gratuitement Expression Web SuperPreview for Windows Internet Explorer &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=8e6ac106-525d-45d0-84db-dccff3fae677&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=8e6ac106-525d-45d0-84db-dccff3fae677&amp;amp;displaylang=en&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_vatZwuxxe78/SqphjC3t6wI/AAAAAAAAAvQ/09Ayzr0msCs/s1600-h/image%5B5%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_vatZwuxxe78/Sqphk66xVXI/AAAAAAAAAvU/AFg2X3eu1WM/image_thumb%5B3%5D.png?imgmax=800" width="764" height="687" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;On voit bien sur le site yahoo.fr, 2 pages differentes en haut IE6 et en bas IE7/IE8, vraiment génial cet outil.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-7922678535657054295?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/7922678535657054295/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=7922678535657054295' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/7922678535657054295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/7922678535657054295'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2009/09/lancer-ie6-ie7-et-ie8-sur-la-meme.html' title='Lancer IE6, IE7 et IE8 sur la meme machine (mise a jour)'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_vatZwuxxe78/Sqphk66xVXI/AAAAAAAAAvU/AFg2X3eu1WM/s72-c/image_thumb%5B3%5D.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-968966391475568836</id><published>2009-09-09T11:45:00.001+02:00</published><updated>2009-09-09T11:45:00.091+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Astuce'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><title type='text'>Methode d’extension pour reperer les sequences dans une liste</title><content type='html'>&lt;p&gt;J’utilise cette methode d’extension pour reperer les lignes dans une liste et alterner une couleur de fond via une feuille de style.&lt;/p&gt;  &lt;div&gt;   &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; ColumnIndexName&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; IList&amp;lt;T&amp;gt; source, T item, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; columnCount, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; prefix)&lt;br /&gt;{&lt;br /&gt;    var index = source.IndexOf(item);&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #006080"&gt;&amp;quot;{0}{1}&amp;quot;&lt;/span&gt;, prefix, (index % columnCount) + 1);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Exemple d’utilisation avec asp.net mvc si Model implémente IList :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;lt;div &lt;span style="color: #0000ff"&gt;class&lt;/span&gt;=&lt;span style="color: #006080"&gt;&amp;quot;&amp;lt;%=Model.ColumnIndexName(item, 3, &amp;quot;&lt;/span&gt;prefix&lt;span style="color: #006080"&gt;&amp;quot;) %&amp;gt;&amp;quot;&lt;/span&gt;&amp;gt;...&amp;lt;/div&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;ce qui donnera :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;lt;div class=”prefix1”&amp;gt;…&amp;lt;/div&amp;gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;lt;div class=”prefix2”&amp;gt;…&amp;lt;/div&amp;gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;lt;div class=”prefix3”&amp;gt;…&amp;lt;/div&amp;gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;lt;div class=”prefix1”&amp;gt;…&amp;lt;/div&amp;gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;lt;div class=”prefix2”&amp;gt;…&amp;lt;/div&amp;gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;lt;div class=”prefix3”&amp;gt;…&amp;lt;/div&amp;gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;ect…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-968966391475568836?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/968966391475568836/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=968966391475568836' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/968966391475568836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/968966391475568836'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2009/09/methode-dextension-pour-reperer-les.html' title='Methode d’extension pour reperer les sequences dans une liste'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-484278533705383495</id><published>2009-09-08T18:01:00.001+02:00</published><updated>2009-09-08T19:42:17.667+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Astuce'/><category scheme='http://www.blogger.com/atom/ns#' term='mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><title type='text'>Récupération de la sortie html d’une vue asp.net mvc</title><content type='html'>&lt;p&gt;Pour pouvoir templater des emails pour un site web en utilisant asp.net mvc, j’avais besoin de pouvoir recuperer la sortie html d’une vue sans avoir à recrawler une page (ce qui provoque des problèmes de statistiques et autres), en cherchant je suis tombé sur cet article très interessant :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://jwbs-blog.blogspot.com/2009/08/chaining-aspnet-mvc-actions.html" target="_blank"&gt;http://jwbs-blog.blogspot.com/2009/08/chaining-aspnet-mvc-actions.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Je l’ai un peu modifié pour en faire une methode d’extension :&lt;/p&gt;  &lt;div&gt;   &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; GetActionOutput&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; System.Web.Mvc.Controller ctrl, Expression&amp;lt;Action&amp;lt;T&amp;gt;&amp;gt; action)&lt;br /&gt;{&lt;br /&gt;    var body = action.Body &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; MethodCallExpression;&lt;br /&gt;&lt;br /&gt;    var responseFilter = ctrl.HttpContext.Response.Filter;&lt;br /&gt;    var memoryStreamFilter = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; MemoryStreamFilter(ctrl.HttpContext.Response.Filter);&lt;br /&gt;    ctrl.HttpContext.Response.Filter = memoryStreamFilter;&lt;br /&gt;&lt;br /&gt;    var routeData = ctrl.ControllerContext.RequestContext.RouteData;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; controllerName = body.Object.Type.Name.Replace(&amp;quot;Controller&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; actionName = body.Method.Name;&lt;br /&gt;    var orgAction = routeData.Values[&lt;span style="color: #006080"&gt;&amp;quot;action&amp;quot;&lt;/span&gt;];&lt;br /&gt;    var orgController = routeData.Values[&lt;span style="color: #006080"&gt;&amp;quot;controller&amp;quot;&lt;/span&gt;];&lt;br /&gt;    routeData.Values[&lt;span style="color: #006080"&gt;&amp;quot;action&amp;quot;&lt;/span&gt;] = actionName;&lt;br /&gt;    routeData.Values[&lt;span style="color: #006080"&gt;&amp;quot;controller&amp;quot;&lt;/span&gt;] = controllerName;&lt;br /&gt;&lt;br /&gt;    var parameters = body.Method.GetParameters();&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (parameters.Length &amp;gt; 0)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; i = 0; i &amp;lt; parameters.Length; i++)&lt;br /&gt;        {&lt;br /&gt;            var expression = body.Arguments[i];&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; &lt;span style="color: #0000ff"&gt;value&lt;/span&gt; = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&gt;            var constantExpression = expression &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; ConstantExpression;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (constantExpression != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;value&lt;/span&gt; = constantExpression.Value;&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                var lambda = Expression.Lambda&amp;lt;Func&amp;lt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;(Expression.Convert(expression, &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;)), &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ParameterExpression[0]);&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;value&lt;/span&gt; = lambda.Compile()();&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            routeData.Values.Add(parameters[i].Name, &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    var controllerFactory = ControllerBuilder.Current.GetControllerFactory();&lt;br /&gt;    var c = controllerFactory.CreateController(ctrl.ControllerContext.RequestContext, controllerName);&lt;br /&gt;    c.Execute(ctrl.ControllerContext.RequestContext);&lt;br /&gt;&lt;br /&gt;    ctrl.HttpContext.Response.Flush();&lt;br /&gt;    memoryStreamFilter.Position = 0;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; result = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (var r = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; StreamReader(memoryStreamFilter))&lt;br /&gt;    {&lt;br /&gt;        result = r.ReadToEnd();&lt;br /&gt;        r.Close();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    memoryStreamFilter.Close();&lt;br /&gt;    memoryStreamFilter.Dispose();&lt;br /&gt;&lt;br /&gt;    ctrl.HttpContext.Response.Filter = responseFilter;&lt;br /&gt;    routeData.Values[&lt;span style="color: #006080"&gt;&amp;quot;action&amp;quot;&lt;/span&gt;] = orgAction;&lt;br /&gt;    routeData.Values[&lt;span style="color: #006080"&gt;&amp;quot;controller&amp;quot;&lt;/span&gt;] = orgController;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; result;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;voici la classe de wrapping pour recuperer la sortie en mémoire :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; MemoryStreamFilter : MemoryStream&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; MemoryStreamFilter(Stream stream)&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;pour utiliser cette methode d’extension, il suffit de faire un appel comme ceci :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ActionResult Index()&lt;br /&gt;{&lt;br /&gt;    ViewData[&lt;span style="color: #006080"&gt;&amp;quot;Message&amp;quot;&lt;/span&gt;] = &lt;span style="color: #006080"&gt;&amp;quot;Welcome to ASP.NET MVC!&amp;quot;&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;strong&gt;var content = &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.GetActionOutput&amp;lt;HomeController&amp;gt;(i =&amp;gt; i.About());&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; View();&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;il est possible de passer des paramètres, la methode est prevue pour ça.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-484278533705383495?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/484278533705383495/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=484278533705383495' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/484278533705383495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/484278533705383495'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2009/09/recuperation-de-la-sortie-html-dune-vue.html' title='Récupération de la sortie html d’une vue asp.net mvc'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-4422267255047105728</id><published>2009-08-24T11:43:00.001+02:00</published><updated>2009-08-24T11:43:25.623+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Politique'/><title type='text'>LOI HADOPI (Tract du 5 septembre 2009)</title><content type='html'>&lt;p&gt;Suite à une proposition du site &lt;a href="http://www.odebi.org"&gt;http://www.odebi.org&lt;/a&gt;, qui nous invite tous à sortir dans la rue le 5 septembre, voici le tract que j’ai choisi :&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;Où en sommes-nous ?    &lt;br /&gt;&lt;i&gt;TOUJOURS dans la répression, RIEN pour la création&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;Cette loi vise un but noble : endiguer le téléchargement illégal d'œuvres (musiques, films...) via Internet.   &lt;br /&gt;POURTANT :    &lt;br /&gt;• Cette loi instaurera une logique de &amp;quot;tout répressif&amp;quot; comme seule réponse aux enjeux de l'ère numérique avec une coupure de l’accès à Internet allant jusqu'à un an, une peine de deux ans de prison et 1500 euros d’amende pour le propriétaire de la ligne accusée de téléchargement illégal. Comme pour les radars automatiques le traitement sera automatisé, confié à des entreprises privées, ce sera à l'accusé de prouver son innocence. Qui dit traitement automatisé, dit aussi risque d'erreurs... D'autant plus qu'il est très facile de se faire passer pour quelqu'un d'autre sur Internet ou de pirater le WiFi du voisin, comme l'a démontré l'association UFC que choisir récemment !    &lt;br /&gt;• Cette loi prévoit l'installation d'un &amp;quot;logiciel de sécurisation&amp;quot; payant sur votre ordinateur. Mais il ne s'agira ni plus ni moins que d'un logiciel espion : il pourra contrôler vos communications et vos données sans même que vous le sachiez.    &lt;br /&gt;• Cette loi a été censurée par le Conseil Constitutionnel dans sa première version... Et pourtant elle revient devant l'Assemblée presque à l'identique... C’est de l’acharnement !    &lt;br /&gt;• Cette loi ne profitera pas aux artistes, mais seulement aux maisons de disques qui récupèrent 75 % du prix HT d'un album. Mais pourquoi vouloir aider à ce point des entreprises qui font déjà des bénéfices monstrueux en finançant les mesures prises avec l’argent&amp;#160; public ?    &lt;br /&gt;• Cette loi sera extrêmement difficile à appliquer techniquement et coûtera entre 100 et 200 millions d'euros dans le contexte actuel de crise économique. Le tout sans garantie de résultats puisque les pirates ont déjà développé de nombreuses parades pour la contourner.&lt;/p&gt;  &lt;p&gt;LA PEUR DU GENDARME   &lt;br /&gt;LE PROFIT DES MAJORS    &lt;br /&gt;LE CONTRÔLE DE VOS ORDINATEURS ET COMMUNICATIONS    &lt;br /&gt;STOP !    &lt;br /&gt;Il existe des alternatives saines qui concilient Internet et rémunération des artistes.&lt;/p&gt;  &lt;p&gt;Pour vous informer et savoir comment agir rendez-vous sur :   &lt;br /&gt;- La Ligue ODEBI : &lt;a href="http://www.odebi.org/hadopi"&gt;http://www.odebi.org/hadopi&lt;/a&gt;    &lt;br /&gt;- Numerama : &lt;a href="http://www.numerama.com/"&gt;http://www.numerama.com/&lt;/a&gt;    &lt;br /&gt;- La Quadrature du Net : &lt;a href="http://www.laquadrature.net/"&gt;http://www.laquadrature.net/&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-4422267255047105728?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/4422267255047105728/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=4422267255047105728' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/4422267255047105728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/4422267255047105728'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2009/08/loi-hadopi-tract-du-5-septembre-2009.html' title='LOI HADOPI (Tract du 5 septembre 2009)'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-2043526445296279151</id><published>2009-08-17T23:02:00.001+02:00</published><updated>2009-08-17T23:02:32.762+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Astuce'/><category scheme='http://www.blogger.com/atom/ns#' term='mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><title type='text'>ValidationSummary designable avec asp.net mvc</title><content type='html'>&lt;p&gt;La methode d’extension Html.ValidationSummary() est certe pratique mais très vite limitée en terme de webdesign pour un rendu professionnel d’un message d’erreur de validation, pour etre plus precis, voici une solution que j’utilise :&lt;/p&gt;  &lt;p&gt;Il faut creer un controle validationsummary.ascx (par exemple) à placer dans le repertoire courrant ou dans /shared&lt;/p&gt;  &lt;div&gt;   &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;lt;%@ Control Language=&lt;span style="color: #006080"&gt;&amp;quot;C#&amp;quot;&lt;/span&gt; Inherits=&lt;span style="color: #006080"&gt;&amp;quot;System.Web.Mvc.ViewUserControl&amp;quot;&lt;/span&gt; %&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;% &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!ViewData.ModelState.IsValid) { %&amp;gt;&lt;br /&gt;&amp;lt;div &lt;span style="color: #0000ff"&gt;class&lt;/span&gt;=&lt;span style="color: #006080"&gt;&amp;quot;validation&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;strong&amp;gt;&amp;lt;img src=&lt;span style="color: #006080"&gt;&amp;quot;/content/images/icon_error.png&amp;quot;&lt;/span&gt; alt=&lt;span style="color: #006080"&gt;&amp;quot;&amp;quot;&lt;/span&gt;/&amp;gt;Attention !&amp;lt;/strong&amp;gt;&lt;br /&gt;    &amp;lt;% &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (var item &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; ViewData.ModelState.GetAllErrors()) { %&amp;gt;&lt;br /&gt;    &amp;lt;p &lt;span style="color: #0000ff"&gt;class&lt;/span&gt;=&lt;span style="color: #006080"&gt;&amp;quot;error&amp;quot;&lt;/span&gt;&amp;gt; &lt;br /&gt;        &amp;lt;span&amp;gt;&amp;lt;%=item%&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;    &amp;lt;/p&amp;gt;&lt;br /&gt;    &amp;lt;% } %&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;% } %&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Ajouter la methode d’extension GetAllErrors dans une classe helper :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// Retourne la liste de toutes les erreurs de validation d'un formulaire&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;modelState&amp;quot;&amp;gt;State of the model.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IEnumerable&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt; GetAllErrors(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; ModelStateDictionary modelState)&lt;br /&gt;{&lt;br /&gt;    var errors = from state &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; modelState&lt;br /&gt;                 from error &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; state.Value.Errors&lt;br /&gt;                 &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; state.Value.Errors.Count &amp;gt; 0&lt;br /&gt;                 select error.ErrorMessage;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; errors;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;puis dans la page ou se trouve le formulaire il suffit d’appeler un rendu partiel&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;lt;%Html.RenderPartial(&lt;span style="color: #006080"&gt;&amp;quot;ValidationSummary&amp;quot;&lt;/span&gt;); %&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-2043526445296279151?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/2043526445296279151/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=2043526445296279151' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/2043526445296279151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/2043526445296279151'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2009/08/validationsummary-designable-avec.html' title='ValidationSummary designable avec asp.net mvc'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-3224179796908335107</id><published>2009-08-13T16:17:00.001+02:00</published><updated>2009-08-13T19:16:23.055+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Astuce'/><category scheme='http://www.blogger.com/atom/ns#' term='mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><title type='text'>Favicon.ico, asp.net mvc et 404</title><content type='html'>&lt;p&gt;Sur un de mes sites j’ai constaté dans les logs IIS qu’un 404 se produisait car les navigateurs veulent obtenir le fichier favicon.ico, voici une solution pour eviter de renvoyer un 404 :&lt;/p&gt;  &lt;p&gt;dans global.asax, ajouter une route :&lt;/p&gt;  &lt;div&gt;   &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;routes.MapRoute(&lt;br /&gt;    &lt;span style="color: #006080"&gt;&amp;quot;FavIcon&amp;quot;&lt;/span&gt;&lt;br /&gt;    , &lt;span style="color: #006080"&gt;@&amp;quot;favicon.ico&amp;quot;&lt;/span&gt;&lt;br /&gt;    , &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; { controller = &lt;span style="color: #006080"&gt;&amp;quot;Home&amp;quot;&lt;/span&gt;, action = &lt;span style="color: #006080"&gt;&amp;quot;FavIcon&amp;quot;&lt;/span&gt; }&lt;br /&gt;);&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;dans le controller “HomeController” ajouter l’action FavIcon :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ActionResult FavIcon()&lt;br /&gt;{&lt;br /&gt;    var pixel = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[35] { 0x47, 0x49, 0x46, 0x38, 0x39, 0x61          &lt;br /&gt;                             , 0x01, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00    &lt;br /&gt;                             , 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF          &lt;br /&gt;                             , 0x2C, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00 &lt;br /&gt;                             , 0x02, 0x01, 0x44, 0x01, 0x00 &lt;br /&gt;                             , 0x3B };&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.File(pixel, &lt;span style="color: #006080"&gt;&amp;quot;image/gif&amp;quot;&lt;/span&gt;);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;le serveur retournera bien une reponse 200 au navigateur avec une image d’un pixel.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;A savoir, si le fichier existe, pour eviter de passer par le controller par defaut, il faut ajouter la ligne suivante dans global.asax :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;routes.IgnoreRoute(&lt;span style="color: #006080"&gt;&amp;quot;{*favicon}&amp;quot;&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; { favicon = &lt;span style="color: #006080"&gt;@&amp;quot;(.*/)?favicon.ico(/.*)?&amp;quot;&lt;/span&gt; });&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Une variation pour l’action FavIcon() suite à la juste remarque de Dascritch :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;[OutputCache(VaryByParam=&lt;span style="color: #006080"&gt;&amp;quot;none&amp;quot;&lt;/span&gt;, Duration=3600)]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ActionResult FavIcon()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] result = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (var bitmap = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; System.Drawing.Bitmap(16, 16, System.Drawing.Imaging.PixelFormat.Format24bppRgb))&lt;br /&gt;            {&lt;br /&gt;                var backColor = bitmap.GetPixel(0, 0);&lt;br /&gt;                bitmap.MakeTransparent(backColor);&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (var ms = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; System.IO.MemoryStream())&lt;br /&gt;                {&lt;br /&gt;                    bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png);&lt;br /&gt;                    result = ms.GetBuffer();&lt;br /&gt;                    ms.Close();&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.File(result, &lt;span style="color: #006080"&gt;&amp;quot;image/x-icon&amp;quot;&lt;/span&gt;);&lt;br /&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;Retourne une image au format 16x16 transparent au format PNG, IE ne la prends pas en compte, Firefox est ok et Chrome affiche un carré noir :(  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-3224179796908335107?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/3224179796908335107/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=3224179796908335107' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/3224179796908335107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/3224179796908335107'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2009/08/faviconico-aspnet-mvc-et-404.html' title='Favicon.ico, asp.net mvc et 404'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-1702133992568467890</id><published>2009-08-13T11:51:00.001+02:00</published><updated>2009-08-13T11:51:50.231+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><title type='text'>Detection de rupture de sequence sql</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Voici une solution, suite à une colle que l’on vient de me poser a propos de la problèmatique suivante avec sql serveur :&lt;/p&gt;  &lt;p&gt;Une table contient une colonne de type Int les valeurs de cette colonne doivent etre uniques, lors de l’ajout d’un nouvel enregistrement il faut aller chercher la première rupture de sequence et non pas ajouter la valeur maximale de la colonne + 1, par exemple :&lt;/p&gt;  &lt;div&gt;   &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;create table Sequence&lt;br /&gt;(&lt;br /&gt;    Id &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; not &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;insert into Sequence (Id) Values (1)&lt;br /&gt;insert into Sequence (Id) Values (2)&lt;br /&gt;insert into Sequence (Id) Values (8)&lt;br /&gt;insert into Sequence (Id) Values (3)&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;nous avons le resultat suivant :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;1&lt;br /&gt;  &lt;br /&gt;2&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;8&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;3&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;la nouvelle valeur doit etre 4, voici comment avec une seule requete :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;select MIN(A.Precedent) + 1&lt;br /&gt;from (&lt;br /&gt;select ID&lt;br /&gt;, (select max(subsquence.ID) from Sequence &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; subsquence &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; subsquence.ID &amp;lt; Sequence.Id) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; Precedent&lt;br /&gt;from Sequence &lt;br /&gt;&lt;span style="color: #0000ff"&gt;where&lt;/span&gt; ID - (select max(subsquence.ID) from Sequence &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; subsquence &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; subsquence.ID &amp;lt; Sequence.Id) &amp;gt; 1) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; A&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Explication :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;une premiere requete selectionne les identifiants et l’identifiant de la ligne dont l’identifiant est inférieur à celui en cours :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;select ID&lt;br /&gt;, (select max(subsquence.ID) from Sequence &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; subsquence &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; subsquence.ID &amp;lt; Sequence.Id) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; Precedent&lt;br /&gt;from Sequence &lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;ensuite il suffit d’ajouter une contrainte qui determine que la difference entre ces 2 indentifiants est supérieure à 1 (cas d’une rupture de sequence ).&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;where&lt;/span&gt; ID - (select max(subsquence.ID) from Sequence &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; subsquence &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; subsquence.ID &amp;lt; Sequence.Id) &amp;gt; 1&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;puis de prendre l’identifiant minimum de la liste et ajouter 1 :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;select MIN(A.Precedent) + 1&lt;br /&gt;from (...) &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; A&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Le résultat donne bien 4&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-1702133992568467890?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/1702133992568467890/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=1702133992568467890' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/1702133992568467890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/1702133992568467890'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2009/08/detection-de-rupture-de-sequence-sql.html' title='Detection de rupture de sequence sql'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-7274530084127572221</id><published>2009-08-13T10:51:00.001+02:00</published><updated>2009-08-13T11:27:23.105+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Astuce'/><category scheme='http://www.blogger.com/atom/ns#' term='Winforms'/><title type='text'>Binding et “refactorisation”</title><content type='html'>&lt;p&gt;Un problème qui vient de m’arriver et qui est assez difficile à anticiper via des tests unitaires est le fait que d’utiliser le binding des controles dans une winform. &lt;/p&gt;  &lt;p&gt;Par exemple si j’ai une textbox sur laquelle je veux binder le code d’un produit je vais ecrire :&lt;/p&gt;  &lt;div&gt;   &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;myTextBox.DataBindings.Add(&lt;span style="color: #006080"&gt;&amp;quot;Text&amp;quot;&lt;/span&gt;, bindingSource, &lt;span style="color: #006080"&gt;&amp;quot;ProductCode&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Si maintenant je “refactore” ma classe product et change la propriété [ProductCode] par [Code] pour etre plus simple, tout mon projet sera changé, ça va compiler, sauf la ligne précédente il restera toujours “ProductCode”, etant donné que ce code est directement lié à l’interface graphique il est très difficile de reperer le bug via des tests unitaires avant d’ouvrir le formulaire manuellement, c’est du vecu, c’est plutot vos clients qui vous en parlent en premier :(&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;pour eviter ce problème, voici une solution :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; BindingExtensions&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Binding Add&amp;lt;TSource&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; ControlBindingsCollection controlBindingCollection, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; propertyName, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; bindingSource, Expression&amp;lt;Func&amp;lt;TSource, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; expression)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; controlBindingCollection.Add(propertyName, bindingSource, expression, &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;, controlBindingCollection.DefaultDataSourceUpdateMode, &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Empty, &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Binding Add&amp;lt;TSource&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; ControlBindingsCollection controlBindingCollection, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; propertyName, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; bindingSource, Expression&amp;lt;Func&amp;lt;TSource, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; expression, &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; formattingEnabled)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; controlBindingCollection.Add(propertyName, bindingSource, expression, formattingEnabled, controlBindingCollection.DefaultDataSourceUpdateMode, &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Empty, &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Binding Add&amp;lt;TSource&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; ControlBindingsCollection controlBindingCollection, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; propertyName, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; bindingSource, Expression&amp;lt;Func&amp;lt;TSource, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; expression, &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; formattingEnabled, DataSourceUpdateMode updateMode)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; controlBindingCollection.Add(propertyName, bindingSource, expression, formattingEnabled, updateMode, &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Empty, &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Binding Add&amp;lt;TSource&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; ControlBindingsCollection controlBindingCollection, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; propertyName, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; bindingSource, Expression&amp;lt;Func&amp;lt;TSource, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; expression, &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; formattingEnabled, DataSourceUpdateMode updateMode, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; nullValue)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; controlBindingCollection.Add(propertyName, bindingSource, expression, formattingEnabled, updateMode, nullValue, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Empty, &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Binding Add&amp;lt;TSource&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; ControlBindingsCollection controlBindingCollection, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; propertyName, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; bindingSource, Expression&amp;lt;Func&amp;lt;TSource, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; expression, &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; formattingEnabled, DataSourceUpdateMode updateMode, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; nullValue, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; formatString)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; controlBindingCollection.Add(propertyName, bindingSource, expression, formattingEnabled, updateMode, nullValue, formatString, &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Binding Add&amp;lt;TSource&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; ControlBindingsCollection controlBindingCollection, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; propertyName, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; bindingSource, Expression&amp;lt;Func&amp;lt;TSource, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; expression, &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; formattingEnabled, DataSourceUpdateMode updateMode, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; nullValue, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; formatString, IFormatProvider formatInfo)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (bindingSource == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span style="color: #006080"&gt;&amp;quot;dataSource&amp;quot;&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;        var dataMemberName = ((expression.Body &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; UnaryExpression).Operand &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; MemberExpression).Member.Name;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; controlBindingCollection.Add(propertyName, bindingSource, dataMemberName, formattingEnabled, updateMode, nullValue, formatString, formatInfo);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;J’ai ajouté dans mon projet une classe avec un certain nombre de methodes qui etendent l’objet ControlBindingCollection, la difference est que je ne passe plus le nom de la propriété mais utilise une lambda expression de la manière suivante :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;myTextbox.DataBindings.Add&amp;lt;Product&amp;gt;(&lt;span style="color: #006080"&gt;&amp;quot;Text&amp;quot;&lt;/span&gt;, bindingSource, p =&amp;gt; p.ProductCode);&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;En cas de “refacto”, le nouveau nom de propriété sera changé.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Petit bémol avec cette méthode, il n’est plus question d’utiliser le designer intégré avec visual studio 2008, mais il faut choisir entre la maintenabilité et le confort pour le developpeur. Personnelement je n’utilise plus le designer pour tout ce qui concerne le binding.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-7274530084127572221?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/7274530084127572221/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=7274530084127572221' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/7274530084127572221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/7274530084127572221'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2009/08/binding-et-refactorisation.html' title='Binding et “refactorisation”'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-4278329289229349552</id><published>2009-08-10T21:31:00.001+02:00</published><updated>2009-08-10T21:31:28.374+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Astuce'/><category scheme='http://www.blogger.com/atom/ns#' term='mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><title type='text'>Methode d’extension asp.net mvc pour ajouter un paramètre dans l’url</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Voici une petite methode d’extension bien pratique pour pouvoir ajouter un parametre dans l’url courante &lt;/p&gt;  &lt;div&gt;   &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// Ajoute un parametre et sa valeur dans une URL en tenant compte de sa presence eventuelle&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;example&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// Exemple d'utilisation&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;code&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;![CDATA[&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// une url existante est de la forme &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// http://domain.com/test?param1=valeur1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;a href='&amp;lt;%=Url.AddParameter(&amp;quot;param2&amp;quot;, &amp;quot;valeur2&amp;quot;)%&amp;gt;'&amp;gt;Mon lien&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// Donnera le resultat suivant :&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// http://domain.com/test?param1=valeur1&amp;amp;param2=valeur2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;a href='&amp;lt;%=Url.AddParameter(&amp;quot;param1&amp;quot;, &amp;quot;valeur2&amp;quot;)%&amp;gt;'&amp;gt;Mon lien&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// Donnera le resultat suivant :&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// http://domain.com/test?param1=valeur2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// ]]&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;/code&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;/example&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &amp;quot;value&amp;quot; est urlencodé par la methode, ne pas passer la valeur deja encodée&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;helper&amp;quot;&amp;gt;The helper.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;key&amp;quot;&amp;gt;The key.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;value&amp;quot;&amp;gt;The value.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;Le lien avec le couple key=value&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; AddParameter(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; UrlHelper helper, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; key, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;)&lt;br /&gt;{&lt;br /&gt;    var link = helper.RequestContext.HttpContext.Request.Url.PathAndQuery;&lt;br /&gt;    var pattern = &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #006080"&gt;&amp;quot;&amp;amp;*{0}=[^&amp;amp;]*&amp;quot;&lt;/span&gt;, key);&lt;br /&gt;    link = System.Text.RegularExpressions.Regex.Replace(link, pattern, &lt;span style="color: #006080"&gt;&amp;quot;&amp;quot;&lt;/span&gt;);&lt;br /&gt;    link = link.Trim(&lt;span style="color: #006080"&gt;'?'&lt;/span&gt;).Trim(&lt;span style="color: #006080"&gt;'&amp;amp;'&lt;/span&gt;);&lt;br /&gt;    var separator = (link.IndexOf(&lt;span style="color: #006080"&gt;&amp;quot;?&amp;quot;&lt;/span&gt;) == -1) ? &lt;span style="color: #006080"&gt;&amp;quot;?&amp;quot;&lt;/span&gt; : &lt;span style="color: #006080"&gt;&amp;quot;&amp;amp;&amp;quot;&lt;/span&gt;;&lt;br /&gt;    link += &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #006080"&gt;&amp;quot;{0}{1}={2}&amp;quot;&lt;/span&gt;, separator, key, helper.Encode(&lt;span style="color: #0000ff"&gt;value&lt;/span&gt;));&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; link;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-4278329289229349552?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/4278329289229349552/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=4278329289229349552' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/4278329289229349552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/4278329289229349552'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2009/08/methode-dextension-aspnet-mvc-pour.html' title='Methode d’extension asp.net mvc pour ajouter un paramètre dans l’url'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-187249908804883167</id><published>2009-08-09T11:18:00.001+02:00</published><updated>2009-08-09T11:18:37.690+02:00</updated><title type='text'>Une incitation au téléchargement ?</title><content type='html'>&lt;p&gt;&lt;img style="margin: 0px 10px 10px 0px; display: inline" alt="L&amp;#39;Attaque du métro 123" align="left" src="http://a69.g.akamai.net/n/69/10688/v1/img5.allocine.fr/acmedia/medias/nmedia/18/68/62/65/19117771.jpg" width="175" height="233" /&gt;&lt;/p&gt;  &lt;p&gt;J’ai profité de mes vacances pour aller voir le film (l’attaque du metro 123) avec mon épouse, je ne conseille vraiment pas ce film, aucun scenario, violence gratuite (des tonnes de ketchup qui n’apportent rien au film). &lt;/p&gt;  &lt;p&gt;En fait ce qui m’a le plus saoulé, c’est la publicité avant de pouvoir voir le film, j’ai chronometré, 27 minutes ! pas une seule bande annonce pour les autres films, non, juste de la publicité bien grace, en passant par des glaces, la pub locale, et autres produits de consomation.&lt;/p&gt;  &lt;p&gt;Le prix de la place était de 8 euros 50 soit 17 euros à 2 personnes. Je me demande bien pourquoi les producteurs de films sont encore étonnés que l’on puisse télécharger sur internet, franchement c’est une veritable incitation, c’est carrement désagréable de devoir subir cette publicité, c’est pire que la TV, à la limite je serais d’accord pour sa diffusion, mais dans ce cas le film devrait etre gratuit ou vraiment moins cher.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-187249908804883167?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/187249908804883167/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=187249908804883167' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/187249908804883167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/187249908804883167'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2009/08/une-incitation-au-telechargement.html' title='Une incitation au téléchargement ?'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-6026400009886293041</id><published>2009-07-30T01:35:00.001+02:00</published><updated>2009-07-30T01:35:22.168+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='Article'/><title type='text'>Comment traduire un site Asp.net MVC ?</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;La traduction d’un site en plusieurs langues est une tache difficile, et les façons de faire sont nombreuses, je vais proposer ici une methode qui permet de traduire “à la volée” un site web réalisé avec la technologie asp.net MVC.&lt;/p&gt;  &lt;p&gt;Le problème principal pour un traducteur, est d’obtenir le contexte de traduction (la page dans laquelle se trouve le texte et son ensemble), la traduction mot à mot engendre systematiquement des aproximations. un autre problème est le format d’echange avec le traducteur, puis la réintroduction des textes traduits. Bref la galère…&lt;/p&gt;  &lt;p&gt;Le problème principal pour un webdesigner est qu’il doit editer des fichiers de ressources, bien localiser les textes dans les pages puis trouver leurs correspondances dans des fichier généralement en xml. Bref la galère…&lt;/p&gt;  &lt;p&gt;Pour resoudre les principaux problèmes du traducteur, je propose qu’il puisse traduire directement dans la page comme un wiki. Ce qui supprime pratiquement le problème du webdesigner et de ses fichiers, il reste néanmoins la definitions des textes dans les pages a mettre en place, pour cela je propose l’ecriture suivante :&lt;/p&gt;  &lt;p&gt;Il s’agit de la page index.aspx par defaut lorsque l’on crée un nouveau projet de type asp.net mvc&lt;/p&gt;  &lt;div&gt;   &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;lt;%@ Page Language=&lt;span style="color: #006080"&gt;&amp;quot;C#&amp;quot;&lt;/span&gt; MasterPageFile=&lt;span style="color: #006080"&gt;&amp;quot;~/Views/Shared/Site.Master&amp;quot;&lt;/span&gt; Inherits=&lt;span style="color: #006080"&gt;&amp;quot;System.Web.Mvc.ViewPage&amp;quot;&lt;/span&gt; %&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;asp:Content ID=&lt;span style="color: #006080"&gt;&amp;quot;indexTitle&amp;quot;&lt;/span&gt; ContentPlaceHolderID=&lt;span style="color: #006080"&gt;&amp;quot;TitleContent&amp;quot;&lt;/span&gt; runat=&lt;span style="color: #006080"&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;    Home Page&lt;br /&gt;&amp;lt;/asp:Content&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;asp:Content ID=&lt;span style="color: #006080"&gt;&amp;quot;indexContent&amp;quot;&lt;/span&gt; ContentPlaceHolderID=&lt;span style="color: #006080"&gt;&amp;quot;MainContent&amp;quot;&lt;/span&gt; runat=&lt;span style="color: #006080"&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;h2&amp;gt;&amp;lt;%= Html.Encode(ViewData[&lt;span style="color: #006080"&gt;&amp;quot;Message&amp;quot;&lt;/span&gt;]) %&amp;gt;&amp;lt;/h2&amp;gt;&lt;br /&gt;    &amp;lt;p&amp;gt;&lt;br /&gt;        &lt;strong&gt;&amp;lt;%=Html.Localize(&lt;span style="color: #006080"&gt;&amp;quot;Content1&amp;quot;&lt;/span&gt;,&lt;span style="color: #006080"&gt;&amp;quot;To learn more about ASP.NET MVC visit&amp;quot;&lt;/span&gt;)%&amp;gt;&lt;/strong&gt;&amp;lt;a href=&lt;span style="color: #006080"&gt;&amp;quot;http://asp.net/mvc&amp;quot;&lt;/span&gt; title=&lt;span style="color: #006080"&gt;&amp;quot;ASP.NET MVC Website&amp;quot;&lt;/span&gt;&amp;gt;http:&lt;span style="color: #008000"&gt;//asp.net/mvc&amp;lt;/a&amp;gt;.&lt;/span&gt;&lt;br /&gt;    &amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/asp:Content&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Concernant le fichier index.aspx, l’idée est de sauvegarder un fichier par language avec le nom suivant :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;index.aspx.fr.resx&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;index.aspx.en.resx&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;ect…&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;le contenu des fichiers est le suivant :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;lt;?xml version=&lt;span style="color: #006080"&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt; encoding=&lt;span style="color: #006080"&gt;&amp;quot;utf-8&amp;quot;&lt;/span&gt;?&amp;gt;&lt;br /&gt;&amp;lt;localizations&amp;gt;&lt;br /&gt;  &amp;lt;localization key=&lt;span style="color: #006080"&gt;&amp;quot;Title&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;![CDATA[Mon Application MVC]]&amp;gt;&amp;lt;/localization&amp;gt;&lt;br /&gt;  &amp;lt;localization key=&lt;span style="color: #006080"&gt;&amp;quot;Content1&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;![CDATA[Pour en apprendre d&lt;span style="color: #006080"&gt;'avantage a propos d'&lt;/span&gt;ASP.Net MVC allez sur]]&amp;gt;&amp;lt;/localization&amp;gt;&lt;br /&gt;&amp;lt;/localizations&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;On retrouve l’identifiant “Content1”&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Le but de la methode d’extension Localize(..) est de reconnaitre le language en cours et de retrouver le bon terme.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;voici le détail de cette methode :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Localize(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; HtmlHelper helper, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; contentKey, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; defaultContent)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; translationLink = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&gt;    var localizationService = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Services.LocalizationService();&lt;br /&gt;    var view = helper.ViewContext.View &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; System.Web.Mvc.WebFormView;&lt;br /&gt;    var path = view.ViewPath.Replace(&lt;span style="color: #006080"&gt;&amp;quot;~&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;&amp;quot;&lt;/span&gt;);&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (helper.ViewContext.HttpContext.Request[&lt;span style="color: #006080"&gt;&amp;quot;translate&amp;quot;&lt;/span&gt;] == &lt;span style="color: #006080"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        translationLink = helper.RouteLink(&lt;span style="color: #006080"&gt;&amp;quot;translate&amp;quot;&lt;/span&gt;&lt;br /&gt;            , &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; { controller = &lt;span style="color: #006080"&gt;&amp;quot;Localization&amp;quot;&lt;/span&gt;&lt;br /&gt;                , action = &lt;span style="color: #006080"&gt;&amp;quot;LocalizeContent&amp;quot;&lt;/span&gt;&lt;br /&gt;                , id = &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Empty&lt;br /&gt;                , path = path&lt;br /&gt;                , key = contentKey &lt;br /&gt;            });&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (view != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        var localization = localizationService.GetContentLocalization(path, contentKey);&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (localization != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; localization.Value + &lt;span style="color: #006080"&gt;&amp;quot;&amp;amp;nbsp;&amp;quot;&lt;/span&gt; + translationLink + &lt;span style="color: #006080"&gt;&amp;quot;&amp;amp;nbsp;&amp;quot;&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; defaultContent + &lt;span style="color: #006080"&gt;&amp;quot;&amp;amp;nbsp;&amp;quot;&lt;/span&gt; + translationLink + &lt;span style="color: #006080"&gt;&amp;quot;&amp;amp;nbsp;&amp;quot;&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Dans un premier temps elle va instancier le service de traduction, recuperer le nom du fichier en cours et interroger le service de traduction pour savoir s’il existe un terme pour le fichier en cours avec l’identifiant contentKey , si c’est le cas le terme est retourné, sinon on utilise le terme defaultContent.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;On peut voir aussi que l’on verifie l’existence d’un parametre translate=1 dans l’url, c’est ce parametre qui permet de traduire les pages à la volée, s’il est la, on ajoute un lien pour la traduction du terme a coté du terme a traduire, de telle sorte que le traducteur retrouve son contexte.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Voici le service de traduction :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; LocalizationService : ILocalizationService&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; LocalizationService()&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; List&amp;lt;Models.ContentLocalization&amp;gt; m_LocalizationList;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; m_Lock = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;();&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; IList&amp;lt;Models.ContentLocalization&amp;gt; LocalizationList&lt;br /&gt;    {&lt;br /&gt;        get&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (m_LocalizationList == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;lock&lt;/span&gt; (m_Lock)&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (m_LocalizationList == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;                    {&lt;br /&gt;                        m_LocalizationList = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; List&amp;lt;Models.ContentLocalization&amp;gt;();&lt;br /&gt;                        var currentDirectory = System.Web.HttpContext.Current.Server.MapPath(&lt;span style="color: #006080"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;);&lt;br /&gt;                        var fileList = from file &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; System.IO.Directory.GetFiles(currentDirectory, &lt;span style="color: #006080"&gt;&amp;quot;*.resx&amp;quot;&lt;/span&gt;, System.IO.SearchOption.AllDirectories)&lt;br /&gt;                                       select file;&lt;br /&gt;&lt;br /&gt;                        &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (var file &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; fileList)&lt;br /&gt;                        {&lt;br /&gt;                            XDocument doc = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&gt;                            &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; content = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&gt;                            System.IO.StreamReader fs = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&gt;                            &lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;br /&gt;                            {&lt;br /&gt;                                fs = System.IO.File.OpenText(file);&lt;br /&gt;                                content = fs.ReadToEnd();&lt;br /&gt;                                doc = XDocument.Parse(content);&lt;br /&gt;                            }&lt;br /&gt;                            &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&lt;br /&gt;                            {&lt;br /&gt;                                &lt;span style="color: #0000ff"&gt;continue&lt;/span&gt;;&lt;br /&gt;                            }&lt;br /&gt;                            &lt;span style="color: #0000ff"&gt;finally&lt;/span&gt;&lt;br /&gt;                            {&lt;br /&gt;                                &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (fs != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;                                {&lt;br /&gt;                                    fs.Close();&lt;br /&gt;                                }&lt;br /&gt;                            }&lt;br /&gt;&lt;br /&gt;                            var path = System.IO.Path.GetFileName(file);&lt;br /&gt;                            var language = path.Split(&lt;span style="color: #006080"&gt;'.'&lt;/span&gt;)[2];&lt;br /&gt;                            path = file.Replace(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #006080"&gt;&amp;quot;.{0}.resx&amp;quot;&lt;/span&gt;, language), &lt;span style="color: #006080"&gt;&amp;quot;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                            path = path.Replace(currentDirectory, &lt;span style="color: #006080"&gt;&amp;quot;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                            path = &lt;span style="color: #006080"&gt;'/'&lt;/span&gt; + path.Replace(&lt;span style="color: #006080"&gt;'\\', '&lt;/span&gt;/&lt;span style="color: #006080"&gt;');&lt;br /&gt;                            m_LocalizationList.AddRange(from x in doc.Root.Elements()&lt;br /&gt;                                                        select new Models.ContentLocalization()&lt;br /&gt;                                                        {&lt;br /&gt;                                                            Key = x.Attribute(XName.Get(&amp;quot;key&amp;quot;)).Value,&lt;br /&gt;                                                            Value = x.Value,&lt;br /&gt;                                                            Path = path,&lt;br /&gt;                                                            Language = language,&lt;br /&gt;                                                        });&lt;br /&gt;&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;            return m_LocalizationList;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static string DefaultLanguage&lt;br /&gt;    {&lt;br /&gt;        get&lt;br /&gt;        {&lt;br /&gt;            var language = (string)System.Web.HttpContext.Current.Session[&amp;quot;language&amp;quot;];&lt;br /&gt;            if (language == null)&lt;br /&gt;            {&lt;br /&gt;                language = &amp;quot;fr&amp;quot;;&lt;br /&gt;            }&lt;br /&gt;            return language;&lt;br /&gt;        }&lt;br /&gt;        set&lt;br /&gt;        {&lt;br /&gt;            System.Web.HttpContext.Current.Session[&amp;quot;language&amp;quot;] = value;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    #region ILocalizationService Members&lt;br /&gt;&lt;br /&gt;    /// &amp;lt;summary&amp;gt;&lt;br /&gt;    /// Gets the content localization.&lt;br /&gt;    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;    /// &amp;lt;param name=&amp;quot;path&amp;quot;&amp;gt;The path.&amp;lt;/param&amp;gt;&lt;br /&gt;    /// &amp;lt;param name=&amp;quot;key&amp;quot;&amp;gt;The key.&amp;lt;/param&amp;gt;&lt;br /&gt;    /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;    public Models.ContentLocalization GetContentLocalization(string path, string key)&lt;br /&gt;    {&lt;br /&gt;        return LocalizationList.FirstOrDefault(i =&amp;gt; i.Path.Equals(path, StringComparison.InvariantCultureIgnoreCase)&lt;br /&gt;            &amp;amp;&amp;amp; i.Key.Equals(key, StringComparison.InvariantCultureIgnoreCase)&lt;br /&gt;            &amp;amp;&amp;amp; i.Language.Equals(LocalizationService.DefaultLanguage, StringComparison.InvariantCultureIgnoreCase));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public IList&amp;lt;Models.ContentLocalization&amp;gt; GetContentLocalizationList(string path, string key)&lt;br /&gt;    {&lt;br /&gt;        var list = LocalizationList.Where(i =&amp;gt; i.Path.Equals(path, StringComparison.InvariantCultureIgnoreCase)&lt;br /&gt;            &amp;amp;&amp;amp; i.Key.Equals(key, StringComparison.InvariantCultureIgnoreCase)).ToList();&lt;br /&gt;&lt;br /&gt;        foreach (var language in GetLanguageList())&lt;br /&gt;        {&lt;br /&gt;            var item = list.SingleOrDefault(i =&amp;gt; i.Language.Equals(language, StringComparison.InvariantCultureIgnoreCase));&lt;br /&gt;            if (item == null)&lt;br /&gt;            {&lt;br /&gt;                list.Add(new Models.ContentLocalization()&lt;br /&gt;                {&lt;br /&gt;                    Key = key,&lt;br /&gt;                    Path = path,&lt;br /&gt;                    Language = language,&lt;br /&gt;                    Value = null,&lt;br /&gt;                });&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        return list;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /// &amp;lt;summary&amp;gt;&lt;br /&gt;    /// Sauvegarde une liste de traduction.&lt;br /&gt;    /// &lt;br /&gt;    /// le principe est de sauvegarder un fichier par langue pour une page ou un controle donné&lt;br /&gt;    /// &lt;br /&gt;    /// par exemple si le path est :&lt;br /&gt;    /// &lt;br /&gt;    /// /views/home/index.aspx&lt;br /&gt;    /// &lt;br /&gt;    /// la liste des traductions est fr, en alors, il y a creation ou append de 2 fichiers&lt;br /&gt;    /// &lt;br /&gt;    /// /views/home/index.aspx.fr.resx&lt;br /&gt;    /// /views/home/index.aspx.en.resx&lt;br /&gt;    /// &lt;br /&gt;    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;    /// &amp;lt;param name=&amp;quot;list&amp;quot;&amp;gt;The list.&amp;lt;/param&amp;gt;&lt;br /&gt;    public void Save(IList&amp;lt;Models.ContentLocalization&amp;gt; list)&lt;br /&gt;    {&lt;br /&gt;        var rootPath = System.Web.HttpContext.Current.Server.MapPath(&amp;quot;/&amp;quot;);&lt;br /&gt;&lt;br /&gt;        foreach (var localization in list)&lt;br /&gt;        {&lt;br /&gt;            if (string.IsNullOrEmpty( localization.Value))&lt;br /&gt;            {&lt;br /&gt;                continue;&lt;br /&gt;            }&lt;br /&gt;            var path = System.IO.Path.Combine(rootPath, localization.Path.Trim('&lt;/span&gt;/&lt;span style="color: #006080"&gt;').Replace('&lt;/span&gt;/&lt;span style="color: #006080"&gt;', '&lt;/span&gt;\\&lt;span style="color: #006080"&gt;'));&lt;br /&gt;            path = string.Format(&amp;quot;{0}.{1}.resx&amp;quot;, path, localization.Language);&lt;br /&gt;&lt;br /&gt;            XDocument doc = null;&lt;br /&gt;            if (System.IO.File.Exists(path))&lt;br /&gt;            {&lt;br /&gt;                using (var fs = System.IO.File.OpenText(path))&lt;br /&gt;                {&lt;br /&gt;                    doc = XDocument.Parse(fs.ReadToEnd());&lt;br /&gt;                    fs.Close();&lt;br /&gt;                }&lt;br /&gt;                var match = doc.XPathSelectElement(string.Format(&amp;quot;//localization[@key='&lt;/span&gt;{0}']&lt;span style="color: #006080"&gt;&amp;quot;, localization.Key));&lt;br /&gt;                if (match != null)&lt;br /&gt;                {&lt;br /&gt;                    match.RemoveAll();&lt;br /&gt;                    match.Add(new XCData(localization.Value));&lt;br /&gt;                    match.Add(new XAttribute(&amp;quot;&lt;/span&gt;key&lt;span style="color: #006080"&gt;&amp;quot;, localization.Key));&lt;br /&gt;                }&lt;br /&gt;                else&lt;br /&gt;                {&lt;br /&gt;                    var elem = new XElement(&amp;quot;&lt;/span&gt;localization&lt;span style="color: #006080"&gt;&amp;quot;, new XCData(localization.Value));&lt;br /&gt;                    elem.Add(new XAttribute(&amp;quot;&lt;/span&gt;key&lt;span style="color: #006080"&gt;&amp;quot;, localization.Key));&lt;br /&gt;                    doc.Root.Add(elem);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            else&lt;br /&gt;            {&lt;br /&gt;                doc = new XDocument(new XDeclaration(&amp;quot;&lt;/span&gt;1.0&lt;span style="color: #006080"&gt;&amp;quot;, &amp;quot;&lt;/span&gt;UTF-8&lt;span style="color: #006080"&gt;&amp;quot;, null));&lt;br /&gt;                var root = new XElement(&amp;quot;&lt;/span&gt;localizations&lt;span style="color: #006080"&gt;&amp;quot;);&lt;br /&gt;                var elem = new XElement(&amp;quot;&lt;/span&gt;localization&lt;span style="color: #006080"&gt;&amp;quot;, new XCData(localization.Value));&lt;br /&gt;                elem.Add(new XAttribute(&amp;quot;&lt;/span&gt;key&lt;span style="color: #006080"&gt;&amp;quot;, localization.Key));&lt;br /&gt;                root.Add(elem);&lt;br /&gt;                doc.Add(root);&lt;br /&gt;            }&lt;br /&gt;            doc.Save(path);&lt;br /&gt;        }&lt;br /&gt;        m_LocalizationList = null;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public IEnumerable&amp;lt;string&amp;gt; GetLanguageList()&lt;br /&gt;    {&lt;br /&gt;        yield return &amp;quot;&lt;/span&gt;fr&lt;span style="color: #006080"&gt;&amp;quot;;&lt;br /&gt;        yield return &amp;quot;&lt;/span&gt;en&lt;span style="color: #006080"&gt;&amp;quot;;&lt;br /&gt;        yield return &amp;quot;&lt;/span&gt;es&amp;quot;;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;yield&lt;/span&gt; &lt;span style="color: #0000ff"&gt;break&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #cc6633"&gt;#endregion&lt;/span&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;il implemente l’interface suivante :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;interface&lt;/span&gt; ILocalizationService&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #008000"&gt;/// Retourne une traduction en fonction du chemin de la vue et de la clé de traduction&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;path&amp;quot;&amp;gt;The path.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;key&amp;quot;&amp;gt;The key.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;        Models.ContentLocalization GetContentLocalization(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; path, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; key);&lt;br /&gt;        &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #008000"&gt;/// Retourne la liste de toutes les traductions possible d'un contenu&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;path&amp;quot;&amp;gt;The path.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;key&amp;quot;&amp;gt;The key.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;        IList&amp;lt;Models.ContentLocalization&amp;gt; GetContentLocalizationList(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; path, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; key);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #008000"&gt;/// Sauvegarde une liste de traduction.&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;list&amp;quot;&amp;gt;The list.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Save(IList&amp;lt;Models.ContentLocalization&amp;gt; list);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #008000"&gt;/// Liste des language de traduction&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;        IEnumerable&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt; GetLanguageList();&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Comme je l’ai évoqué , si le parametre translate=1 est present, des liens son générés dans la page, ces liens utilisent le controlleur de traduction dont voici le code :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; LocalizationController : Controller&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; LocalizationController()&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.LocalizationService = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Services.LocalizationService();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; Services.ILocalizationService LocalizationService { get; set; }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ViewResult LocalizeContent(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; path, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; key)&lt;br /&gt;    {&lt;br /&gt;        var list = LocalizationService.GetContentLocalizationList(path, key);&lt;br /&gt;        ViewData.Model = list;&lt;br /&gt;        ViewData[&lt;span style="color: #006080"&gt;&amp;quot;Key&amp;quot;&lt;/span&gt;] = key;&lt;br /&gt;        ViewData[&lt;span style="color: #006080"&gt;&amp;quot;Path&amp;quot;&lt;/span&gt;] = path;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; View();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ViewResult SaveLocalizedContent(FormCollection form)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; key = form[&lt;span style="color: #006080"&gt;&amp;quot;Key&amp;quot;&lt;/span&gt;];&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; path = form[&lt;span style="color: #006080"&gt;&amp;quot;Path&amp;quot;&lt;/span&gt;];&lt;br /&gt;        var    list = LocalizationService.GetContentLocalizationList(path, key);&lt;br /&gt;        var languages = form[&lt;span style="color: #006080"&gt;&amp;quot;lg&amp;quot;&lt;/span&gt;].Split(&lt;span style="color: #006080"&gt;','&lt;/span&gt;);&lt;br /&gt;        var values = form[&lt;span style="color: #006080"&gt;&amp;quot;value&amp;quot;&lt;/span&gt;].Split(&lt;span style="color: #006080"&gt;','&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; i = 0; i &amp;lt; languages.Length; i++)&lt;br /&gt;        {&lt;br /&gt;            var language = languages[i];&lt;br /&gt;            var &lt;span style="color: #0000ff"&gt;value&lt;/span&gt; = values[i];&lt;br /&gt;            var localization = list.Single(l =&amp;gt; l.Language.Equals(language, StringComparison.InvariantCultureIgnoreCase));&lt;br /&gt;            localization.Value = &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        LocalizationService.Save(list);&lt;br /&gt;&lt;br /&gt;        ViewData.Model = list;&lt;br /&gt;        ViewData[&lt;span style="color: #006080"&gt;&amp;quot;Key&amp;quot;&lt;/span&gt;] = key;&lt;br /&gt;        ViewData[&lt;span style="color: #006080"&gt;&amp;quot;Path&amp;quot;&lt;/span&gt;] = path;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; View(&lt;span style="color: #006080"&gt;&amp;quot;LocalizeContent&amp;quot;&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Je n’ai pas évoqué la securité, mais bien sur il ne faut pas utiliser cette solution telle qu’elle, en effet il ne faut pas qu’un internaute puisse retraduire le site, mais on peut s’appuyer facilement sur les membership asp.net, ajouter un attribut “Authorize” sur les methodes du controlleur de traduction.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Pour la demo, il faut que le user sous lequel tourne le site web ai les droits d’ecriture dans le repertoire et sous-repertoire views.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;pour voir plus en détail cette solution , voici le code source :&lt;/p&gt;&lt;br /&gt;&lt;iframe style="border-bottom: #dde5e9 1px solid; border-left: #dde5e9 1px solid; padding-bottom: 0px; background-color: #ffffff; margin: 3px; padding-left: 0px; width: 240px; padding-right: 0px; height: 66px; border-top: #dde5e9 1px solid; border-right: #dde5e9 1px solid; padding-top: 0px" marginheight="0" src="http://cid-a458279ec363307a.skydrive.live.com/embedrowdetail.aspx/Public/MvcLocalization.zip" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-6026400009886293041?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/6026400009886293041/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=6026400009886293041' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/6026400009886293041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/6026400009886293041'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2009/07/comment-traduire-un-site-aspnet-mvc.html' title='Comment traduire un site Asp.net MVC ?'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-4013611533256327344</id><published>2009-07-26T10:15:00.000+02:00</published><updated>2009-09-11T17:59:49.533+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ERP 360'/><title type='text'>ERP 360: Mise à jour du 27 juillet 2009 (build 123)</title><content type='html'>&lt;a href="http://blog.erp360.net/2009/07/mise-jour-du-27-juillet-2009-build-123.html"&gt;ERP 360: Mise à jour du 27 juillet 2009 (build 123)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-4013611533256327344?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://blog.erp360.net/2009/07/mise-jour-du-27-juillet-2009-build-123.html' title='ERP 360: Mise à jour du 27 juillet 2009 (build 123)'/><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/4013611533256327344/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=4013611533256327344' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/4013611533256327344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/4013611533256327344'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2009/07/erp-360-mise-jour-du-27-juillet-2009.html' title='ERP 360: Mise à jour du 27 juillet 2009 (build 123)'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-6680056339644965717</id><published>2009-07-17T09:46:00.001+02:00</published><updated>2009-07-17T09:46:17.701+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Astuce'/><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><title type='text'>Comment obtenir le host d’un service WCF hébergé avec IIS</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;dans le cas d’un service wcf hébergé, System.Web.HttpContext.Current retourne null, il n’est donc pas possible de passer par lui pour obtenir la valeur du host, voici ci-dessous une methode pour y parvenir.&lt;/p&gt;  &lt;div&gt;   &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;var serviceHost = System.ServiceModel.OperationContext.Current.InstanceContext.Host;&lt;br /&gt;var baseAddress = serviceHost.BaseAddresses.First();&lt;br /&gt;var host = baseAddress.AbsoluteUri.Replace(baseAddress.LocalPath, &lt;span style="color: #006080"&gt;&amp;quot;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-6680056339644965717?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/6680056339644965717/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=6680056339644965717' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/6680056339644965717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/6680056339644965717'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2009/07/comment-obtenir-le-host-dun-service-wcf.html' title='Comment obtenir le host d’un service WCF hébergé avec IIS'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-748145940554504305</id><published>2009-07-15T12:23:00.001+02:00</published><updated>2009-07-15T13:51:29.846+02:00</updated><title type='text'>Marketing tout pourri ou vrai problème de montée en charge ?</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_vatZwuxxe78/Sl2uMpPUtvI/AAAAAAAAApg/IBmQ7eBSrDs/s1600-h/image%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_vatZwuxxe78/Sl2uNmEHPTI/AAAAAAAAApk/5o_y4oZI5kI/image_thumb%5B1%5D.png?imgmax=800" width="644" height="436" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Le jour de l’annonce de Microsoft concernant la possibilité de pré-commander sa version de windows seven au tarif prérérentiel de 50 euros, en allant sur le site on peut voir cette belle page d’erreur.&lt;/p&gt;  &lt;p&gt;j’ai du mal a croire que Microsoft ne puisse pas aligner des milliers de serveurs pour tenir la charge face à une “forte demande”, de ce que j’ai lu ci ou la , la nouvelle version de windows est plutot stratégiquement cruciale pour le premier editeur de logiciel au monde, et ils prennent un grand risque à ne pas avoir anticipé la demande.&lt;/p&gt;  &lt;p&gt;A moins qu’il s’agisse d’une basse manoeuvre marketing basée sur la rareté du produit ayant pour but de succiter une demande accrue, comme l’avait fait a son epoque Sony pour sa psp ou Apple pour son premier iPhone.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-748145940554504305?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/748145940554504305/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=748145940554504305' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/748145940554504305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/748145940554504305'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2009/07/marqueting-tout-pourri-ou-vrai-probleme.html' title='Marketing tout pourri ou vrai problème de montée en charge ?'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_vatZwuxxe78/Sl2uNmEHPTI/AAAAAAAAApk/5o_y4oZI5kI/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-8865653342937319232</id><published>2009-06-24T15:15:00.000+02:00</published><updated>2009-08-13T11:27:38.659+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ERP 360'/><title type='text'>ERP 360: Mise à jour du 24 juin 2009 (build 98)</title><content type='html'>&lt;a href="http://blog.erp360.net/2009/06/mise-jour-du-24-juin-2009-build-98.html"&gt;ERP 360: Mise à jour du 24 juin 2009 (build 98)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-8865653342937319232?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://blog.erp360.net/2009/06/mise-jour-du-24-juin-2009-build-98.html' title='ERP 360: Mise à jour du 24 juin 2009 (build 98)'/><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/8865653342937319232/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=8865653342937319232' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/8865653342937319232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/8865653342937319232'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2009/06/erp-360-mise-jour-du-24-juin-2009-build.html' title='ERP 360: Mise à jour du 24 juin 2009 (build 98)'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-8079031572897739025</id><published>2009-06-19T10:44:00.001+02:00</published><updated>2009-09-11T18:00:18.574+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Troll'/><title type='text'>Asp.Net plus rapide que php ?</title><content type='html'>&lt;a href="http://naspinski.net/post/AspNet-vs-php--speed-comparison.aspx"&gt;A la demande générale, voici un petit troll ;)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-8079031572897739025?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://naspinski.net/post/AspNet-vs-php--speed-comparison.aspx' title='Asp.Net plus rapide que php ?'/><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/8079031572897739025/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=8079031572897739025' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/8079031572897739025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/8079031572897739025'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2009/06/marc-chouteau-erp-360-comment-creer-des.html' title='Asp.Net plus rapide que php ?'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-3920323361677023274</id><published>2009-06-19T10:15:00.000+02:00</published><updated>2009-09-11T18:00:32.207+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ERP 360'/><title type='text'>ERP 360: Comment creer des selections d’entité dans ERP 360 Studio ?</title><content type='html'>&lt;a href="http://blog.erp360.net/2009/06/comment-creer-des-selections-dentite.html"&gt;ERP 360: Comment creer des selections d’entité dans ERP 360 Studio ?&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-3920323361677023274?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://blog.erp360.net/2009/06/comment-creer-des-selections-dentite.html' title='ERP 360: Comment creer des selections d’entité dans ERP 360 Studio ?'/><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/3920323361677023274/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=3920323361677023274' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/3920323361677023274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/3920323361677023274'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2009/06/erp-360-comment-creer-des-selections.html' title='ERP 360: Comment creer des selections d’entité dans ERP 360 Studio ?'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-1391632348383584230</id><published>2009-05-28T21:16:00.001+02:00</published><updated>2009-05-28T21:16:37.366+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Astuce'/><category scheme='http://www.blogger.com/atom/ns#' term='mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='Article'/><title type='text'>Comment faire un handler d’image en asp.net mvc</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;img style="margin: 0px 5px 5px 0px; display: inline" alt="ASP.NET MVC" align="left" src="http://www.asp.net/App_Themes/Standard/i/mvc-logo-landing-page.png" /&gt;&lt;/p&gt;  &lt;p&gt;Lors de la création d’un site web un peu compliqué ou par exemple les images se trouvent sous forme de blob dans une base de données, ou les fichiers images existent à differents endroits, et pas mal d’autre cas encore, il faut utiliser un handler d’image, qui permet d’intercepter la requete de de produire un traitement avant de rendre l’image demandée.&lt;/p&gt;  &lt;p&gt;Avec asp.net version webforms il fallait declarer un handler, souvent une url de la forme &lt;a href="http://www.monsite.com/image.ashx?fileName=image.gif"&gt;http://www.monsite.com/image.ashx?fileName=image.gif&lt;/a&gt;, ou plus seo compliant &lt;a href="http://www.monsite.com/image.ashx/image.gif"&gt;http://www.monsite.com/image.ashx/image.gif&lt;/a&gt; (malheureusement cette forme d’url ne fonctionnant pas avec le server web de dev cassini). &lt;/p&gt;  &lt;p&gt;Avec asp.net mvc l’idée est de faire passer toutes les requetes via le “ControllerFactory”, il faut ajouter une route de la forme :&lt;/p&gt;  &lt;div&gt;   &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;routes.MapRoute(&lt;br /&gt;    &lt;span style="color: #006080"&gt;&amp;quot;Images&amp;quot;&lt;/span&gt;&lt;br /&gt;    ,&lt;span style="color: #006080"&gt;&amp;quot;images/{*fileName}&amp;quot;&lt;/span&gt;&lt;br /&gt;    , &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; { controller = &lt;span style="color: #006080"&gt;&amp;quot;Images&amp;quot;&lt;/span&gt;, action = &lt;span style="color: #006080"&gt;&amp;quot;Index&amp;quot;&lt;/span&gt; }&lt;br /&gt;);&lt;/pre&gt;&lt;br /&gt;L’url peut etre de la forme &lt;a href="http://www.monsite.com/images/image.gif"&gt;http://www.monsite.com/images/image.gif&lt;/a&gt;, attention il ne faut pas que le repertoire images existe à la racine du site. &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;A savoir, {*imageFilename} permet d’ajouter ce que l’on veut comme nom de fichier et par exemple /folder1/folder2/image.gif&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Le controller est codé de la manière suivante :&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; ImagesController : Controller&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ActionResult Index(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; fileName)&lt;br /&gt;    {&lt;br /&gt;        fileName = System.IO.Path.Combine(&lt;span style="color: #006080"&gt;@&amp;quot;c:\images&amp;quot;&lt;/span&gt;, fileName);&lt;br /&gt;        var mimeType = &lt;span style="color: #006080"&gt;&amp;quot;image/gif&amp;quot;&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.File(fileName, mimeType);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Pour ne pas compliquer le discours, je suis parti du principe que les images se trouvent dans le repertoire c:\images et qu’il n’y a que des fichiers gif, l’interception est la combinaison du nom de fichier et son chemin. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Le problème ici est qu’il manque le type mime, voici ci dessous un petit dictionnaire qui permet de retrouver un mimeType via une extension ou vice/versa.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt; MIMETypeDictionary&lt;br /&gt;    = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;()&lt;br /&gt;{&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;323&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/h323&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;3gp&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;video/3gpp&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;3gpp&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;video/3gpp&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;acp&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;audio/x-mei-aac&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;act&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/xml&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;actproj&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;ade&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/msaccess&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;adp&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/msaccess&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;ai&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/postscript&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;aif&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;audio/aiff&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;aifc&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;audio/aiff&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;aiff&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;audio/aiff&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;asf&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;video/x-ms-asf&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;asm&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;asx&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;video/x-ms-asf&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;au&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;audio/basic&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;avi&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;video/avi&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;bmp&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;image/bmp&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;bwp&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-bwpreview&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;c&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;cat&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.ms-pki.seccat&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;cc&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;cdf&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-cdf&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;cer&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-x509-ca-cert&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;cod&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;cpp&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;crl&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/pkix-crl&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;crt&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-x509-ca-cert&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;cs&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;css&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/css&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;csv&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.ms-excel&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;cxx&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;dbs&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;def&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;der&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-x509-ca-cert&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;dib&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;image/bmp&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;dif&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;video/x-dv&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;dll&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-msdownload&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;doc&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/msword&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;dot&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/msword&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;dsp&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;dsw&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;dv&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;video/x-dv&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;edn&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.adobe.edn&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;eml&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;message/rfc822&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;eps&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/postscript&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;etd&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-ebx&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;etp&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;exe&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-msdownload&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;ext&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;fdf&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.fdf&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;fif&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/fractals&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;fky&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;gif&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;image/gif&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;gz&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-gzip&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;h&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;hpp&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;hqx&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/mac-binhex40&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;hta&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/hta&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;htc&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/x-component&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;htm&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/html&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;html&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/html&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;htt&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/webviewhtml&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;hxx&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;i&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;iad&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-iad&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;ico&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;image/x-icon&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;ics&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/calendar&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;idl&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;iii&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-iphone&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;inc&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;infopathxml&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/ms-infopath.xml&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;inl&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;ins&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-internet-signup&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;iqy&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/x-ms-iqy&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;isp&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-internet-signup&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;java&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/java&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;jnlp&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-java-jnlp-file&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;jpg&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;image/jpeg&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;jpe&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;image/jpeg&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;jpeg&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;image/jpeg&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;jfif&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;image/jpeg&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;jsl&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;kci&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;la1&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;audio/x-liquid-file&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;lar&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-laplayer-reg&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;latex&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-latex&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;lavs&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;audio/x-liquid-secure&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;lgn&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;lmsff&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;audio/x-la-lms&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;lqt&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;audio/x-la-lqt&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;lst&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;m1v&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;video/mpeg&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;m3u&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;audio/mpegurl&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;m4e&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;video/mpeg4&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;MAC&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;image/x-macpaint&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;mak&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;man&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-troff-man&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;map&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;mda&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/msaccess&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;mdb&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/msaccess&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;mde&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/msaccess&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;mdi&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;image/vnd.ms-modi&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;mfp&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-shockwave-flash&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;mht&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;message/rfc822&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;mhtml&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;message/rfc822&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;mid&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;audio/mid&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;midi&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;audio/mid&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;mk&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;mnd&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;audio/x-musicnet-download&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;mns&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;audio/x-musicnet-stream&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;MP1&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;audio/mp1&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;mp2&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;video/mpeg&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;mp2v&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;video/mpeg&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;mp3&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;audio/mpeg&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;mp4&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;video/mp4&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;mpa&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;video/mpeg&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;mpe&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;video/mpeg&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;mpeg&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;video/mpeg&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;mpf&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.ms-mediapackage&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;mpg&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;video/mpeg&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;mpg4&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;video/mp4&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;mpga&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;audio/rn-mpeg&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;mpv2&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;video/mpeg&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;NMW&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/nmwb&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;nws&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;message/rfc822&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;odc&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/x-ms-odc&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;odh&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;odl&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;p10&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/pkcs10&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;p12&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-pkcs12&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;p7b&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-pkcs7-certificates&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;p7c&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/pkcs7-mime&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;p7m&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/pkcs7-mime&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;p7r&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-pkcs7-certreqresp&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;p7s&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/pkcs7-signature&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;PCT&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;image/pict&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;pdf&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/pdf&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;pdx&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.adobe.pdx&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;pfx&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-pkcs12&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;pic&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;image/pict&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;PICT&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;image/pict&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;pko&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.ms-pki.pko&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;png&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;image/png&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;pnt&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;image/x-macpaint&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;pntg&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;image/x-macpaint&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;pot&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.ms-powerpoint&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;ppa&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.ms-powerpoint&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;pps&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.ms-powerpoint&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;ppt&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.ms-powerpoint&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;prc&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;prf&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/pics-rules&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;ps&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/postscript&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;pub&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.ms-publisher&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;pwz&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.ms-powerpoint&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;qt&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;video/quicktime&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;qti&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;image/x-quicktime&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;qtif&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;image/x-quicktime&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;qtl&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-quicktimeplayer&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;qup&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-quicktimeupdater&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;r1m&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.rn-recording&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;r3t&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/vnd.rn-realtext3d&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;RA&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;audio/vnd.rn-realaudio&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;RAM&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;audio/x-pn-realaudio&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;rat&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/rat-file&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;rc&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;rc2&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;rct&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;rec&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.rn-recording&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;rgs&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;rjs&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.rn-realsystem-rjs&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;rjt&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.rn-realsystem-rjt&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;RM&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.rn-realmedia&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;rmf&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.adobe.rmf&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;rmi&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;audio/mid&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;RMJ&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.rn-realsystem-rmj&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;RMM&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;audio/x-pn-realaudio&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;rms&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.rn-realmedia-secure&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;rmvb&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.rn-realmedia-vbr&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;RMX&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.rn-realsystem-rmx&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;RNX&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.rn-realplayer&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;rp&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;image/vnd.rn-realpix&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;RPM&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;audio/x-pn-realaudio-plugin&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;rqy&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/x-ms-rqy&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;rsml&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.rn-rsml&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;rt&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/vnd.rn-realtext&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;rtf&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/msword&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;rul&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;RV&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;video/vnd.rn-realvideo&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;s&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;sc2&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/schdpl32&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;scd&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/schdpl32&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;sch&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/schdpl32&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;sct&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/scriptlet&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;sd2&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;audio/x-sd2&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;sdp&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/sdp&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;sit&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-stuffit&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;slk&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.ms-excel&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;sln&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/octet-stream&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;SMI&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/smil&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;smil&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/smil&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;snd&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;audio/basic&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;snp&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/msaccess&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;spc&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-pkcs7-certificates&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;spl&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/futuresplash&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;sql&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;srf&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;ssm&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/streamingmedia&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;sst&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.ms-pki.certstore&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;stl&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.ms-pki.stl&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;swf&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-shockwave-flash&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;tab&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;tar&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-tar&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;tdl&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/xml&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;tgz&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-compressed&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;tif&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;image/tiff&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;tiff&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;image/tiff&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;tlh&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;tli&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;torrent&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-bittorrent&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;trg&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;txt&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;udf&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;udt&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;uls&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/iuls&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;user&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;usr&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;vb&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;vcf&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/x-vcard&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;vcproj&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;viw&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;vpg&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-vpeg005&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;vspscc&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;vsscc&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;vssscc&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;wav&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;audio/wav&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;wax&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;audio/x-ms-wax&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;wbk&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/msword&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;wiz&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/msword&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;wm&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;video/x-ms-wm&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;wma&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;audio/x-ms-wma&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;wmd&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-ms-wmd&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;wmv&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;video/x-ms-wmv&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;wmx&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;video/x-ms-wmx&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;wmz&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-ms-wmz&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;wpl&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.ms-wpl&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;wprj&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/webzip&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;wsc&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/scriptlet&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;wvx&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;video/x-ms-wvx&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;XBM&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;image/x-xbitmap&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;xdp&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.adobe.xdp+xml&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;xfd&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.adobe.xfd+xml&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;xfdf&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.adobe.xfdf&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;xla&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.ms-excel&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;xlb&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.ms-excel&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;xlc&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.ms-excel&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;xld&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.ms-excel&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;xlk&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.ms-excel&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;xll&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.ms-excel&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;xlm&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.ms-excel&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;xls&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.ms-excel&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;xlt&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.ms-excel&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;xlv&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.ms-excel&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;xlw&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/vnd.ms-excel&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;xml&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/xml&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;xpl&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;audio/scpls&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;xsl&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;text/xml&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;z&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-compress&amp;quot;&lt;/span&gt;},&lt;br /&gt;   {&lt;span style="color: #006080"&gt;&amp;quot;zip&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;application/x-zip-compressed&amp;quot;&lt;/span&gt;}&lt;br /&gt;  };&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Le code devient alors :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ActionResult Index(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; fileName)&lt;br /&gt;{&lt;br /&gt;    fileName = System.IO.Path.Combine(&lt;span style="color: #006080"&gt;@&amp;quot;c:\images&amp;quot;&lt;/span&gt;, fileName);&lt;br /&gt;    var ext = System.IO.Path.GetExtension(fileName);&lt;br /&gt;    var mime = MIMETypeDictionary.FirstOrDefault(i =&amp;gt; i.Key.Equals(ext, StringComparison.InvariantCultureIgnoreCase));&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.File(fileName, mime.Value);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;A noter il est possible de renvoyer un tableau de byte à la place d’un fichier, d’autre part si IIS6 est utilisé pour héberger le site il faut soit declarer chaque extension d’application possible par type d’image, ou ajouter un wildcard de la manière suivante :&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://lh3.ggpht.com/_vatZwuxxe78/Sh7jD6kF3GI/AAAAAAAAAnk/xG1alD_b3VY/s1600-h/image%5B7%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_vatZwuxxe78/Sh7jE3RH9wI/AAAAAAAAAno/3FImYUs-Xyo/image_thumb%5B3%5D.png?imgmax=800" width="346" height="380" /&gt;&lt;/a&gt; &lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-1391632348383584230?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/1391632348383584230/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=1391632348383584230' title='8 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/1391632348383584230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/1391632348383584230'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2009/05/comment-faire-un-handler-dimage-en.html' title='Comment faire un handler d’image en asp.net mvc'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_vatZwuxxe78/Sh7jE3RH9wI/AAAAAAAAAno/3FImYUs-Xyo/s72-c/image_thumb%5B3%5D.png?imgmax=800' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-2056128226869956973</id><published>2009-05-26T10:37:00.000+02:00</published><updated>2009-09-11T18:00:51.164+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ERP 360'/><title type='text'>ERP 360: Mise à jour du 26 mai 2009 version 2.3 (Build 83)</title><content type='html'>&lt;a href="http://blog.erp360.net/2009/05/mise-jour-du-26-mai-2009-version-23.html"&gt;ERP 360: Mise à jour du 26 mai 2009 version 2.3 (Build 83)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-2056128226869956973?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://blog.erp360.net/2009/05/mise-jour-du-26-mai-2009-version-23.html' title='ERP 360: Mise à jour du 26 mai 2009 version 2.3 (Build 83)'/><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/2056128226869956973/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=2056128226869956973' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/2056128226869956973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/2056128226869956973'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2009/05/erp-360-mise-jour-du-26-mai-2009.html' title='ERP 360: Mise à jour du 26 mai 2009 version 2.3 (Build 83)'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-8985366746924226481</id><published>2009-05-19T16:30:00.001+02:00</published><updated>2009-05-19T16:30:53.917+02:00</updated><title type='text'>Comment nettoyer un projet dotnet avec un controle de code source subversion ?</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;il suffit d’ecrire un fichier cmd à la racine du projet avec ces quelques lignes :&lt;/p&gt;  &lt;div&gt;   &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;dir .svn /s /b /AH &amp;gt; temp.txt&lt;br /&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt; /F %%f &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; (temp.txt) &lt;span style="color: #0000ff"&gt;do&lt;/span&gt; rd %%f /Q /S&lt;br /&gt;del temp.txt&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-8985366746924226481?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/8985366746924226481/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=8985366746924226481' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/8985366746924226481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/8985366746924226481'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2009/05/comment-nettoyer-un-projet-dotnet-avec.html' title='Comment nettoyer un projet dotnet avec un controle de code source subversion ?'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-4587770515593731196</id><published>2009-03-29T17:58:00.001+02:00</published><updated>2009-03-29T17:59:32.945+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Outils'/><category scheme='http://www.blogger.com/atom/ns#' term='Astuce'/><title type='text'>Methode d’extension Zip et Unzip d’une chaine de caractère</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;img style="margin: 0px 10px 5px 0px; display: inline" align="left" src="http://www.autosite.org/image/zip_files.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;Recement je stockais dans une colonne varchar(max) d’une base de données tout un arbre xml, la taille etait montée à pratiquement 500ko, ce qui provoquait des ralentissements lors du chargement des données.&lt;/p&gt;  &lt;p&gt;pour accelerer le chargement j’ai décidé de zipper le contenu au moment de sauvegarder et de dezipper au chargement.&lt;/p&gt;  &lt;p&gt;J’ai utilisé les methodes d’extensions suivantes pour réaliser cette opération :&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div&gt;   &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// zip the base64 input string to string.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;input&amp;quot;&amp;gt;The input.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; GZipToBase64String(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; input)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; result = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (var ms = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; System.IO.MemoryStream())&lt;br /&gt;    {&lt;br /&gt;        var buffer = System.Text.Encoding.UTF8.GetBytes(input);&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (var zip = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; System.IO.Compression.GZipStream(ms, CompressionMode.Compress, &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;))&lt;br /&gt;        {&lt;br /&gt;            zip.Write(buffer, 0, buffer.Length);&lt;br /&gt;            zip.Close();&lt;br /&gt;        }&lt;br /&gt;        result = Convert.ToBase64String(ms.ToArray());&lt;br /&gt;        ms.Close();&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; result;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// UnZip zippedBuffer&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;zippedbuffer&amp;quot;&amp;gt;The zippedbuffer.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; UnGZip(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] zippedbuffer)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; result = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; blockSize = 512;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (var compressedStream = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; System.IO.MemoryStream(zippedbuffer, &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;))&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (compressedStream.CanSeek)&lt;br /&gt;        {&lt;br /&gt;            compressedStream.Seek(0, SeekOrigin.Begin);&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (var uncompressedStream = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; System.IO.MemoryStream())&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (var unzip = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; System.IO.Compression.GZipStream(compressedStream, CompressionMode.Decompress))&lt;br /&gt;            {&lt;br /&gt;                var bf = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[blockSize];&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;while&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color: #008000"&gt;// Bug ! if zippedbuffer smaller than 4096 bytes, read byte one by one&lt;/span&gt;&lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (zippedbuffer.Length &amp;lt;= 4096)&lt;br /&gt;                    {&lt;br /&gt;                        var pos = unzip.ReadByte();&lt;br /&gt;                        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (pos == -1)&lt;br /&gt;                        {&lt;br /&gt;                            &lt;span style="color: #0000ff"&gt;break&lt;/span&gt;;&lt;br /&gt;                        }&lt;br /&gt;                        uncompressedStream.WriteByte((&lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;)pos);&lt;br /&gt;                    }&lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;br /&gt;                    {&lt;br /&gt;                        var count = unzip.Read(bf, 0, blockSize);&lt;br /&gt;                        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (count == 0)&lt;br /&gt;                        {&lt;br /&gt;                            &lt;span style="color: #0000ff"&gt;break&lt;/span&gt;;&lt;br /&gt;                        }&lt;br /&gt;                        uncompressedStream.Write(bf, 0, count);&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;                result = System.Text.Encoding.UTF8.GetString(uncompressedStream.ToArray());&lt;br /&gt;                unzip.Close();&lt;br /&gt;            }&lt;br /&gt;            uncompressedStream.Close();&lt;br /&gt;        }&lt;br /&gt;        compressedStream.Close();&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; result;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// unzip base64 zipped string.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;param name=&amp;quot;input&amp;quot;&amp;gt;The input.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; UnGZipFromBase64String(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; zippedinput)&lt;br /&gt;{&lt;br /&gt;    var buffer = Convert.FromBase64String(zippedinput);&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; buffer.UnGZip();&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Il y a un bug plutot incompréhensible si le contenu à dezipper de inférieur a 4096, alors il faut lire les bytes 1 par 1, pas très efficace au niveau perf.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Exemple d’utilisation des methodes :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;var content = “ceci est un message de test juste pour l’exemple”;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;var zipped = content.GZipToBase64String();&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;retourne une chaine de caractère encodé en base64&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;var unzipped = zipped.UnGZipFromBase64String();&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;retourne la chaine initiale&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-4587770515593731196?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/4587770515593731196/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=4587770515593731196' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/4587770515593731196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/4587770515593731196'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2009/03/methode-dextension-zip-et-unzip-dune.html' title='Methode d’extension Zip et Unzip d’une chaine de caractère'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-1526206316194543110</id><published>2009-02-08T22:42:00.001+01:00</published><updated>2009-08-13T11:28:27.146+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><title type='text'>Asp.net MVC Unity et RenderPartial</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Html.RenderPartial(..) est pratique mais cette methode implique que la vue partielle inserée connaisse à l’avance son controller ou il faut qu’en amont la ViewPage stocke les datas qui seront affichées eventuellement par le controle en les passant en paramètre.&lt;/p&gt;  &lt;p&gt;Voici une methode qui permet de selectionner le controller qui permettra de rendre la vue partielle :&lt;/p&gt;  &lt;div&gt;   &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; RenderPartial&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; HtmlHelper helper, Expression&amp;lt;Action&amp;lt;T&amp;gt;&amp;gt; action)&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; T : Controller&lt;br /&gt;{&lt;br /&gt;    var controller = MvcApplication.Container.Resolve&amp;lt;T&amp;gt;();&lt;br /&gt;    var body = action.Body &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; MethodCallExpression;&lt;br /&gt;    var controllerContext = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ControllerContext(helper.ViewContext.RequestContext, controller);&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; result = controller.ActionInvoker.InvokeAction(controllerContext, body.Method.Name);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Il faut bien sur que MvcApplication ait une propriété statique integrant le container Unity, voici comment appeler la methode :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;lt;% Html.RenderPartial&amp;lt;CatalogController&amp;gt;(i =&amp;gt; i.ShowCategories()); %&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Affiche par exemple la liste des categories d’un catalogue de produits, le controller etant comme ceci :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; CatalogController : Controller&lt;br /&gt;{&lt;br /&gt;    [Dependency]&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ICatalogService CatalogService { get; set; }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ActionResult ShowCategories()&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; View(&lt;span style="color: #006080"&gt;&amp;quot;~/views/catalog/categories.ascx&amp;quot;&lt;/span&gt;, CatalogService.GetCategories());&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;L’avantage de cette methode est que la vue partielle est rendue par le controlleur avec lequel on peut acceder proprement aux couches de services.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Je me suis inspiré de la methode Microsoft.Web.Mvc.HtmlHelpers.RenderAction&amp;lt;&amp;gt; que l’on peut trouver dans le projet aspnet rc futures sur codeplex à l’adresse suivante :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=22359" target="_blank"&gt;http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=22359&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-1526206316194543110?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/1526206316194543110/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=1526206316194543110' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/1526206316194543110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/1526206316194543110'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2009/02/aspnet-mvc-unity-et-renderpartial.html' title='Asp.net MVC Unity et RenderPartial'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-5916710337136227676</id><published>2009-01-31T16:11:00.001+01:00</published><updated>2009-01-31T16:11:30.574+01:00</updated><title type='text'>Petit bug d’affichage sympa avec google</title><content type='html'>&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_vatZwuxxe78/SYRqFrvJKII/AAAAAAAAAnQ/RJP_xKG_H18/s1600-h/image%5B10%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_vatZwuxxe78/SYRqINIgM-I/AAAAAAAAAnU/TFLNaVgIjas/image_thumb%5B6%5D.png?imgmax=800" width="785" height="616" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Finalement c’est peut etre vrai ;) personnelement j’utilise maintenant &lt;a href="http://search.live.com"&gt;http://search.live.com&lt;/a&gt;, essayez donc pendant une semaine, c’est devenu aussi rapide que google&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-5916710337136227676?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/5916710337136227676/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=5916710337136227676' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/5916710337136227676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/5916710337136227676'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2009/01/petit-bug-daffichage-sympa-avec-google.html' title='Petit bug d’affichage sympa avec google'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_vatZwuxxe78/SYRqINIgM-I/AAAAAAAAAnU/TFLNaVgIjas/s72-c/image_thumb%5B6%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-1213249796686699829</id><published>2009-01-13T13:21:00.001+01:00</published><updated>2009-01-13T13:21:03.923+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='Astuce'/><title type='text'>Comment mettre une valeur datetime à zero heure en sql ?</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Voici une petite astuce sql que j’utilise pour placer une date à zero heure :&lt;/p&gt;  &lt;p&gt;DATEADD(day, DATEDIFF(day, 0, [DateTimeColumn]), 0) AS ZeroHourDate&lt;/p&gt;  &lt;p&gt;Utile dans pas mal de cas, notamment avec Analysis Services.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-1213249796686699829?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/1213249796686699829/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=1213249796686699829' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/1213249796686699829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/1213249796686699829'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2009/01/comment-mettre-une-valeur-datetime-zero.html' title='Comment mettre une valeur datetime à zero heure en sql ?'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-4035277323982903</id><published>2009-01-11T11:38:00.001+01:00</published><updated>2009-01-11T11:38:05.684+01:00</updated><title type='text'>Windows Seven impressionnant !</title><content type='html'>&lt;p&gt;Je viens d’installer sur mon portable HP NW9440 windows Seven beta1 (7000), et je dois dire que je suis très agréablement surpris par le nouvel opus de Microsoft, à l’heure actuelle j’utilise Vista qui fonctionne très bien mais est d’une lenteur pitoyable. D’entrée de jeu on vois que l’effort a été justement porté sur la gestion des ressources, beaucoup moins de consomation mémoire, au démarrage 500Mo sans rien tunner , mais surtout beaucoup beaucoup mois de CPU, il reste vraiment bloqué à 1%.&lt;/p&gt;  &lt;p&gt;La detection des periphériques est hallucinante, seule ma carte graphique n’a pas été detectée nvidia FX4000, en revanche detection immediate du wifi, de la livebox, de la souris bluetooth de mon smartphone.&lt;/p&gt;  &lt;p&gt;Très prometteur !&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_vatZwuxxe78/SWnMB2l_jTI/AAAAAAAAAmU/nr1K20_76uQ/s1600-h/image%5B4%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_vatZwuxxe78/SWnMDDWGciI/AAAAAAAAAmY/XZMGdwifBZk/image_thumb%5B2%5D.png?imgmax=800" width="611" height="426" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://technet.microsoft.com/en-us/evalcenter/dd353205.aspx"&gt;http://technet.microsoft.com/en-us/evalcenter/dd353205.aspx&lt;/a&gt; (ce lien permet d’obtenir une clé)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-4035277323982903?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/4035277323982903/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=4035277323982903' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/4035277323982903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/4035277323982903'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2009/01/windows-seven-impressionnant.html' title='Windows Seven impressionnant !'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_vatZwuxxe78/SWnMDDWGciI/AAAAAAAAAmY/XZMGdwifBZk/s72-c/image_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-3741751571144142274</id><published>2009-01-10T00:55:00.001+01:00</published><updated>2009-08-13T11:28:42.592+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Architecture'/><title type='text'>Demystifions Unity Application Block</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_vatZwuxxe78/SWfj87_rr6I/AAAAAAAAAmM/8yXNIOEtrew/s1600-h/pag_logo%5B1%5D%5B6%5D.gif"&gt;&lt;strong&gt;&lt;img style="border-right-width: 0px; margin: 0px 10px 10px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="pag_logo[1]" border="0" alt="pag_logo[1]" align="left" src="http://lh5.ggpht.com/_vatZwuxxe78/SWfj9usbCgI/AAAAAAAAAmQ/uZtqZVuTQZc/pag_logo%5B1%5D_thumb%5B4%5D.gif?imgmax=800" width="352" height="110" /&gt;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; Unity&lt;/strong&gt; est un conteneur léger qui permet de réaliser de l’inversion de controle au niveau de l’architecture des applications&lt;/p&gt;  &lt;p&gt;La dernière version téléchargeable est la version 1.2 que l’on peut trouver ici : &lt;a href="http://www.codeplex.com/unity" target="_blank"&gt;http://www.codeplex.com/unity&lt;/a&gt;, c’est un bloc d’application de la libraire d’entreprise de Microsoft V4.1 et peut etre téléchargé individuellement.&lt;/p&gt;  &lt;p&gt;Le gros avantage de cet application block est la façon dont on va pouvoir architecturer de manière beaucoup plus agile une application, pour démontrer ça je vais partir d’un exemple très simple basé sur une application dont le but est la gestion de produits&lt;/p&gt;  &lt;p&gt;Aussi pour cela je vais mettre en place une entité du modele :&lt;/p&gt;  &lt;div&gt;   &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Product&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Product()&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Name { get; set; }&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;decimal&lt;/span&gt; SalePrice { get; set; }&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;decimal&lt;/span&gt; PurchasePrice { get; set; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;L’interface du repository pour acceder a cette entité se presente comme ceci :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;interface&lt;/span&gt; IProductRepository&lt;br /&gt;{&lt;br /&gt;    Product GetProductByName(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; name);&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; SaveProduct(Product product);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Le repository concret est le suivant (il est basé sur SQL Linq), au préalable le datacontext vient d’etre généré :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;p&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; SqlProductRepository : IProductRepository&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; SqlData.DataContext m_DataContext;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; SqlProductRepository(SqlData.DataContext dataContext)&lt;br /&gt;        {&lt;br /&gt;            m_DataContext = dataContext;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; IQueryable&amp;lt;Product&amp;gt; GetAll()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; from productData &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; m_DataContext.Product&lt;br /&gt;                   select &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Product()&lt;br /&gt;                   {&lt;br /&gt;                       Name = productData.Name,&lt;br /&gt;                       SalePrice = Convert.ToDecimal(productData.SalePrice / 1000000.0),&lt;br /&gt;                       PurchasePrice = Convert.ToDecimal(productData.PurchasePrice / 1000000.0)&lt;br /&gt;                   };&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Product GetProductByName(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; name)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; GetAll().SingleOrDefault(i =&amp;gt; i.Name.ToLower() == name.ToLower());&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; SaveProduct(Product product)&lt;br /&gt;        {&lt;br /&gt;            SqlData.Product productData = m_DataContext.Product.SingleOrDefault(i =&amp;gt; i.Name.ToLower() == product.Name.ToLower());&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (productData == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                productData = new SqlData.Product; m_DataContext.Product.InsertOnSubmit(productData);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            productData.Name = product.Name;&lt;br /&gt;            productData.SalePrice = Convert.ToInt64(product.SalePrice * 1000000);&lt;br /&gt;            productData.PurchasePrice = Convert.ToInt64(product.PurchasePrice * 1000000);&lt;br /&gt;&lt;br /&gt;            m_DataContext.SubmitChanges();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;/p&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;D’une manière “classique” voici le code qui peut etre mis en place pour inserer un produit :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;var connectionString = System.Configuration.ConfigurationManager.ConnectionStrings[&lt;span style="color: #006080"&gt;&amp;quot;CS&amp;quot;&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;SqlData.DataContext dataContext = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; UnitySample.SqlData.DataContext(connectionString.ConnectionString);&lt;br /&gt;&lt;br /&gt;IProductRepository repository = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SqlProductRepository(dataContext);&lt;br /&gt;&lt;br /&gt;Product product = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Product();&lt;br /&gt;product.Name = &lt;span style="color: #006080"&gt;&amp;quot;Test&amp;quot;&lt;/span&gt;;&lt;br /&gt;product.SalePrice = 10;&lt;br /&gt;product.PurchasePrice = 5;&lt;br /&gt;&lt;br /&gt;repository.SaveProduct(product);&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Maintenant la meme chose avec Unity :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;var container = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; UnityContainer();&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;// Enregistrement du type&lt;/span&gt;&lt;br /&gt;container.RegisterType&amp;lt;IProductRepository, SqlProductRepository&amp;gt;(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Microsoft.Practices.Unity.ContainerControlledLifetimeManager());&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;// injections de la chaine de connexion dans le constructeur du datacontext&lt;/span&gt;&lt;br /&gt;var connectionString = System.Configuration.ConfigurationManager.ConnectionStrings[&lt;span style="color: #006080"&gt;&amp;quot;CS&amp;quot;&lt;/span&gt;];&lt;br /&gt;InjectionMember injectedConnectionString = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; InjectionConstructor(connectionString.ConnectionString);&lt;br /&gt;container.RegisterType&amp;lt;SqlData.DataContext&amp;gt;(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Microsoft.Practices.Unity.ContainerControlledLifetimeManager()&lt;br /&gt;    , &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; InjectionMember[] { injectedConnectionString });&lt;br /&gt;&lt;br /&gt;var repository = container.Resolve&amp;lt;IProductRepository&amp;gt;();&lt;br /&gt;&lt;br /&gt;Product product = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Product();&lt;br /&gt;product.Name = &lt;span style="color: #006080"&gt;&amp;quot;Test&amp;quot;&lt;/span&gt;;&lt;br /&gt;product.SalePrice = 10;&lt;br /&gt;product.PurchasePrice = 5;&lt;br /&gt;&lt;br /&gt;repository.SaveProduct(product);&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Quelques remarques, dans un premier temps il va falloir indiquer au container comment mapper le repository, pour cela il existe la methode RegisterType&amp;lt;&amp;gt;, elle permet d’indiquer d’une part l’interface et le mapping vers la classe concrete d’autre part, dans le parametre de la methode on indique comment est controlée la durée de vie de l’instance. Unity permet d’indiquer un singleton (le cas ici) mais aussi par thread ou custom.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Ensuite on enregistre le datacontext, ici il n’y a pas d’interface , unity le gere, nous indiquons la durée de vie et nous injectons en parametre du constructeur la chaine de connexion.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;pour obtenir une instance du repository il suffit alors d’appeler la methode générique Resolve&amp;lt;&amp;gt;, au passage elle aura retrouvé la classe concrete du repository comme indiqué plus haut, elle aura passé au constructeur une instance du datacontext ayant lui meme été crée en passant en parametre de son constructeur la chaine de connexion. c’est magique ;)&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;la configuration du container peut se faire via un fichier de configuration de la manière suivante :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;lt;configSections&amp;gt;&lt;br /&gt;        &amp;lt;section name=&lt;span style="color: #006080"&gt;&amp;quot;unity&amp;quot;&lt;/span&gt; type=&lt;span style="color: #006080"&gt;&amp;quot;Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35&amp;quot;&lt;/span&gt;/&amp;gt;&lt;br /&gt;    &amp;lt;/configSections&amp;gt;&lt;br /&gt;    &amp;lt;unity&amp;gt;&lt;br /&gt;        &amp;lt;typeAliases&amp;gt;&lt;br /&gt;            &amp;lt;typeAlias alias=&lt;span style="color: #006080"&gt;&amp;quot;singleton&amp;quot;&lt;/span&gt;&lt;br /&gt;         type=&lt;span style="color: #006080"&gt;&amp;quot;Microsoft.Practices.Unity.ContainerControlledLifetimeManager, &lt;br /&gt;               Microsoft.Practices.Unity&amp;quot;&lt;/span&gt; /&amp;gt;&lt;br /&gt;        &amp;lt;/typeAliases&amp;gt;&lt;br /&gt;        &amp;lt;containers&amp;gt;&lt;br /&gt;            &amp;lt;container&amp;gt;&lt;br /&gt;                &amp;lt;types&amp;gt;&lt;br /&gt;                    &amp;lt;type type=&lt;span style="color: #006080"&gt;&amp;quot;UnitySample.IProductRepository,UnitySample&amp;quot;&lt;/span&gt;&lt;br /&gt;                                mapTo=&lt;span style="color: #006080"&gt;&amp;quot;UnitySample.SqlProductRepository,UnitySample&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;lifetime type=&lt;span style="color: #006080"&gt;&amp;quot;singleton&amp;quot;&lt;/span&gt; /&amp;gt;&lt;br /&gt;                    &amp;lt;/type&amp;gt;&lt;br /&gt;                    &amp;lt;type type=&lt;span style="color: #006080"&gt;&amp;quot;UnitySample.SqlData.DataContext,UnitySample&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;                        &amp;lt;typeConfig&amp;gt;&lt;br /&gt;                            &amp;lt;constructor&amp;gt;&lt;br /&gt;                                &amp;lt;param name=&lt;span style="color: #006080"&gt;&amp;quot;connection&amp;quot;&lt;/span&gt; parameterType=&lt;span style="color: #006080"&gt;&amp;quot;System.String&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;                                    &amp;lt;&lt;span style="color: #0000ff"&gt;value&lt;/span&gt; &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;=&lt;span style="color: #006080"&gt;&amp;quot;...&amp;quot;&lt;/span&gt;/&amp;gt;&lt;br /&gt;                                &amp;lt;/param&amp;gt;&lt;br /&gt;                            &amp;lt;/constructor&amp;gt;&lt;br /&gt;                        &amp;lt;/typeConfig&amp;gt;&lt;br /&gt;                        &amp;lt;lifetime type=&lt;span style="color: #006080"&gt;&amp;quot;singleton&amp;quot;&lt;/span&gt; /&amp;gt;&lt;br /&gt;                    &amp;lt;/type&amp;gt;&lt;br /&gt;                &amp;lt;/types&amp;gt;&lt;br /&gt;            &amp;lt;/container&amp;gt;&lt;br /&gt;        &amp;lt;/containers&amp;gt;&lt;br /&gt;    &amp;lt;/unity&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;La configuration du container devient alors :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;var container = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; UnityContainer();&lt;br /&gt;&lt;br /&gt;UnityConfigurationSection section&lt;br /&gt;  = (UnityConfigurationSection)System.Configuration.ConfigurationManager.GetSection(&lt;span style="color: #006080"&gt;&amp;quot;unity&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;section.Containers.Default.Configure(container);&lt;br /&gt;&lt;br /&gt;var repository = container.Resolve&amp;lt;IProductRepository&amp;gt;();&lt;br /&gt;&lt;br /&gt;Product product = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Product();&lt;br /&gt;product.Name = &lt;span style="color: #006080"&gt;&amp;quot;Test&amp;quot;&lt;/span&gt;;&lt;br /&gt;product.SalePrice = 10;&lt;br /&gt;product.PurchasePrice = 5;&lt;br /&gt;&lt;br /&gt;repository.SaveProduct(product);&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;L’enorme avantage de cette architecture est sa modularité, je n’ai plus besoin de referencer SqlData, je peux le remplacer par un autre repository en changeant la valeur dans le fichier de configuration.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;il est possible aussi de faire de l’injection sur des propriétés, par exemple nous allons mettre en place la possibilité de logger , voici l’interface :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;interface&lt;/span&gt; ILogger&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Write(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; message);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Sa classe concrete :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; ConsoleLogger : ILogger&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #cc6633"&gt;#region&lt;/span&gt; ILogger Members&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Write(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; message)&lt;br /&gt;    {&lt;br /&gt;        Console.WriteLine(message);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #cc6633"&gt;#endregion&lt;/span&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Il suffit alors de referencer cette classe dans notre fichier de config :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&amp;lt;type type=&lt;span style="color: #006080"&gt;&amp;quot;UnitySample.ILogger,UnitySample&amp;quot;&lt;/span&gt;&lt;br /&gt;            mapTo=&lt;span style="color: #006080"&gt;&amp;quot;UnitySample.ConsoleLogger,UnitySample&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;lifetime type=&lt;span style="color: #006080"&gt;&amp;quot;singleton&amp;quot;&lt;/span&gt; /&amp;gt;&lt;br /&gt;&amp;lt;/type&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;puis dans le repository sql ajouter la propriété suivante :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;[Dependency]&lt;br /&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ILogger Logger { get; set; }&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;il sera alos possible de logger des information a l’interieur de la classe. l’attribut [Dependency] indique à Unity qu’il faut injecter une instance du logger sur cette propriété , il aurait aussi été possible de definir ceci dans le fichier de configuration.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Logger par la suite dans une base de donnée ou autre devient un jeu d’enfant, il suffit de creer sa propre classe concrète implementant ILogger et de modifier le mapping dans le fichier de configuration.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Donc on l’a bien compris Unity permet toute sorte d’injections, constructeur , propriété, possibilité de tunner finement la durée de vie des instance grace au&amp;#160; lifemanager.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Mais ce n’est pas tout, Unity permet aussi l’interception, dans notre exemple nous voulons valider qu’un produit à bien un nom avant de l’inserer, pour cela, il faut referencer l’assembly “Microsoft.Practices.Unity.Interception” puis nous allons creer un attribut “Validator”, il doit heriter de la classe HandlerAttribute.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; ValidatorAttribute : HandlerAttribute&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; ICallHandler CreateHandler(Microsoft.Practices.Unity.IUnityContainer container)&lt;br /&gt;    {&lt;br /&gt;        var validateCallHandler = container.Resolve&amp;lt;ValidateCallHandler&amp;gt;();&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; validateCallHandler;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Puis nous creons une classe implémentant l’interface ICallHandler, c’est cette classe qui sera appelée lors de l’execution de la methode :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; ValidateCallHandler : ICallHandler&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #cc6633"&gt;#region&lt;/span&gt; ICallHandler Members&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; Order { get; set; }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)&lt;br /&gt;    {&lt;br /&gt;        Product product = (Product)input.Arguments[0];&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.IsNullOrEmpty(product.Name))&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ArgumentException(&lt;span style="color: #006080"&gt;&amp;quot;Le nom du produit doit etre renseigné&amp;quot;&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; getNext()(input, getNext);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #cc6633"&gt;#endregion&lt;/span&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;le parametre input est la methode invoquée, il suffit alors de recuperer le seule parametre de la methode et de le caster en Product puis verifier le nom&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;L’interception dans le modele Unity est une extension il va donc falloir configurer cette extension pour le repository de la manière suivante :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;container.Configure&amp;lt;Interception&amp;gt;().SetDefaultInterceptorFor&amp;lt;IProductRepository&amp;gt;(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; TransparentProxyInterceptor());&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;il faut aussi indiquer via un attribut quelle methode il faut intercepter :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;[Validate]&lt;br /&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; SaveProduct(Product product)&lt;br /&gt;{&lt;br /&gt;...&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Cela aura pour effet l’appel de la methode Invoke de l’intercepteur ValidateCallHandler avant l’execution du corps de la methode SaveProduct, on peut imaginer des choses comme le chronometrage de l’execution d’une methode, ou la mise en place d’une strategie de securité basée sur ce principe.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Pour conclure, d’une manière générale a l’utilisation on a tendance à oublier les patterns Singleton , Facade, Provider et autres Methodes statiques, il s’agit d’une methode de programmation basée sur du “tissage” qui peut rendre une architecture particulièrement agile, je n’ai pas eu l’occasion de tester cet application block sur de très gros projets, il faudra regarder comment il se comporte avec des centaines de services et repository. Mais c’est très prometteur.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Ci-joint le code source du sample :&lt;/p&gt;&lt;br /&gt;&lt;iframe style="border-bottom: #dde5e9 1px solid; border-left: #dde5e9 1px solid; padding-bottom: 0px; background-color: #ffffff; margin: 3px; padding-left: 0px; width: 240px; padding-right: 0px; height: 66px; border-top: #dde5e9 1px solid; border-right: #dde5e9 1px solid; padding-top: 0px" marginheight="0" src="http://cid-a458279ec363307a.skydrive.live.com/embedrowdetail.aspx/Public/UnitySample.zip" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/111658602890372617-3741751571144142274?l=marc-chouteau.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://marc-chouteau.blogspot.com/feeds/3741751571144142274/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=111658602890372617&amp;postID=3741751571144142274' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/3741751571144142274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/111658602890372617/posts/default/3741751571144142274'/><link rel='alternate' type='text/html' href='http://marc-chouteau.blogspot.com/2009/01/demistifions-unity-application-block.html' title='Demystifions Unity Application Block'/><author><name>Marc Chouteau</name><uri>https://profiles.google.com/104816641109976449447</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-BAmmWBTfUUQ/AAAAAAAAAAI/AAAAAAAAAAA/RNhWWZ3j_RA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_vatZwuxxe78/SWfj9usbCgI/AAAAAAAAAmQ/uZtqZVuTQZc/s72-c/pag_logo%5B1%5D_thumb%5B4%5D.gif?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-111658602890372617.post-7990976570127408974</id><published>2008-12-23T00:30:00.001+01:00</published><updated>2008-12-23T00:30:58.100+01:00</updated><title type='text'>Liste code NAF 2008 format SQL 2005</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Voici un dump sql 2005 qui genere une table des codes NAF 2008 avec la compatibilité 2003&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_vatZwuxxe78/SVAjI8dep0I/AAAAAAAAAmE/_3_KoSmFpGk/s1600-h/image%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_vatZwuxxe78/SVAjJziKCUI/AAAAAAAAAmI/7y4Yso0XoHY/image_thumb%5B1%5D.png?imgmax=800" width="440" height="316" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;le fichier est téléchargeable ici :&lt;/p&gt; &lt;iframe style="border-bottom: #dde5e9 1px solid; border-left: #dde5e9 1px solid; padding-bottom: 0px; background-color: #ffffff; margin: 3px; padding-left: 0px; width: 240px; padding-right: 0px; height: 66px; border-top: #dde5e9 1px solid; border-right: #dde5e9 1px solid; padding-top: 0px" marginheight="0" src="http://cid-a458279ec363307a.skydrive.live.com/embedrowdetail.aspx/Public/NAF2008.sql" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;  &lt;p&gt;voici le détail du script :&lt;/p&gt;  &lt;div&gt;   &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; exists(Select * from sysobjects &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; name = &lt;span style="color: #006080"&gt;'NAF'&lt;/span&gt; and xtype = &lt;span style="color: #006080"&gt;'U'&lt;/span&gt;)&lt;br /&gt;Begin&lt;br /&gt;    drop table dbo.NAF&lt;br /&gt;End&lt;br /&gt;Go&lt;br /&gt;&lt;br /&gt;Create table NAF&lt;br /&gt;(&lt;br /&gt;    Code varchar(10) not &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;br /&gt;    , Name varchar(1000) not &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;br /&gt;    , LevelName varchar(50) not &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;br /&gt;    , ParentCode varchar(10) &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;br /&gt;    , Code2003 varchar(10) &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;br /&gt;)&lt;br /&gt;Go&lt;br /&gt;&lt;br /&gt;alter table NAF add Constraint PK_NAF_Code primary key (Code)&lt;br /&gt;Go&lt;br /&gt;&lt;br /&gt;alter table NAF Add constraint FK_NAF_ParentCode foreign key (ParentCode) references NAF(Code)&lt;br /&gt;Go&lt;br /&gt;&lt;br /&gt;create index IX_NAF_Code2003 on NAF(Code2003)&lt;br /&gt;Go&lt;br /&gt;&lt;br /&gt;create index IX_NAF_ParentCode on NAF(ParentCode)&lt;br /&gt;Go&lt;br /&gt;&lt;br /&gt;-- Section&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'A'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Agriculture, chasse, sylviculture'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Section'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'B'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Industries extractives'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Section'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'C'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Industrie manufacturière'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Section'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'D'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Production et distribution d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'électricité, de gaz, de vapeur et d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'air conditionné'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Section'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'E'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Production et distribution d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'eau ; assainissement, gestion des déchets et dépollution'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Section'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'F'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Construction'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Section'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'G'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Commerce ; réparation d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'automobiles et de motocycles'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Section'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'H'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Transports et entreposage'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Section'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'I'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Hébergement et restauration'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Section'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'J'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Information et communication'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Section'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'K'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités financières et d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'assurance'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Section'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'L'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités immobilières'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Section'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'M'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités spécialisées, scientifiques et techniques'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Section'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'N'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités de services administratifs et de soutien'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Section'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'O'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Administration publique'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Section'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'P'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Enseignement'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Section'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'Q'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Santé humaine et action sociale'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Section'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'R'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Arts, spectacles et activités récréatives'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Section'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'S'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Autres activités de services'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Section'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'T'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités des ménages en tant qu'&lt;/span&gt;&lt;span style="color: #006080"&gt;'employeurs ; activités indifférenciées des ménages en tant que producteurs de biens et services pour usage propre'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Section'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'U'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités extra-territoriales'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Section'&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;-- Division&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Culture et production animale, chasse et services annexes'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Sylviculture et exploitation forestière'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Pêche et aquaculture'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'5'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Extraction de houille et de lignite'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'6'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Extraction d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'hydrocarbures'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'7'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Extraction de minerais métalliques'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'8'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Autres industries extractives'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'9'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Services de soutien aux industries extractives'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'10'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Industries alimentaires'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'11'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de boissons'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'12'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de produits à base de tabac'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'13'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de textiles'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'14'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Industrie de l'&lt;/span&gt;&lt;span style="color: #006080"&gt;'habillement'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'15'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Industrie du cuir et de la chaussure'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'16'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Travail du bois et fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'articles en bois et en liège, à l'&lt;/span&gt;&lt;span style="color: #006080"&gt;'exception des meubles ; fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'articles en vannerie et sparterie'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'17'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Industrie du papier et du carton'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'18'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Imprimerie et reproduction d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'enregistrements'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'19'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Cokéfaction et raffinage'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'20'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Industrie chimique'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'21'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Industrie pharmaceutique'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'22'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de produits en caoutchouc et en plastique'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'23'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'autres produits minéraux non métalliques'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'24'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Métallurgie'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'25'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de produits métalliques, à l'&lt;/span&gt;&lt;span style="color: #006080"&gt;'exception des machines et des équipements'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'26'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de produits informatiques, électroniques et optiques'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'27'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'équipements électriques'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'28'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de machines et équipements n.c.a.'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'29'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Industrie automobile'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'30'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'autres matériels de transport'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'31'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de meubles'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'32'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Autres industries manufacturières'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'33'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Réparation et installation de machines et d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'équipements'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'35'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Production et distribution d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'électricité, de gaz, de vapeur et d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'air conditionné'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'36'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Captage, traitement et distribution d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'eau'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'37'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Collecte et traitement des eaux usées'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'38'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Collecte, traitement et élimination des déchets ; récupération'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'39'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Dépollution et autres services de gestion des déchets'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'41'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Construction de bâtiments'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'42'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Génie civil'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'43'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Travaux de construction spécialisés'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'45'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Commerce et réparation d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'automobiles et de motocycles'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'46'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Commerce de gros, à l'&lt;/span&gt;&lt;span style="color: #006080"&gt;'exception des automobiles et des motocycles'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'47'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Commerce de détail, à l'&lt;/span&gt;&lt;span style="color: #006080"&gt;'exception des automobiles et des motocycles'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'49'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Transports terrestres et transport par conduites'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'50'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Transports par eau'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'51'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Transports aériens'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'52'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Entreposage et services auxiliaires des transports'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'53'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités de poste et de courrier'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'55'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Hébergement'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'56'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Restauration'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'58'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Édition'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'59'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Production de films cinématographiques, de vidéo et de programmes de télévision ; enregistrement sonore et édition musicale'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'60'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Programmation et diffusion'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'61'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Télécommunications'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'62'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Programmation, conseil et autres activités informatiques'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'63'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Services d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'information'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'64'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités des services financiers, hors assurance et caisses de retraite'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'65'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Assurance'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'66'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités auxiliaires de services financiers et d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'assurance'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'68'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités immobilières'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'69'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités juridiques et comptables'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'70'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités des sièges sociaux ; conseil de gestion'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'71'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'architecture et d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'ingénierie ; activités de contrôle et analyses techniques'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'72'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Recherche-développement scientifique'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'73'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Publicité et études de marché'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'74'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Autres activités spécialisées, scientifiques et techniques'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'75'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités vétérinaires'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'77'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités de location et location-bail'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'78'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités liées à l'&lt;/span&gt;&lt;span style="color: #006080"&gt;'emploi'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'79'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités des agences de voyage, voyagistes, services de réservation et activités connexes'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'80'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Enquêtes et sécurité'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'81'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Services relatifs aux bâtiments et aménagement paysager'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'82'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités administratives et autres activités de soutien aux entreprises'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'84'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Administration publique et défense ; sécurité sociale obligatoire'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'85'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Enseignement'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'86'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités pour la santé humaine'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'87'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Hébergement médico-social et social'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'88'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Action sociale sans hébergement'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'90'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités créatives, artistiques et de spectacle'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'91'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Bibliothèques, archives, musées et autres activités culturelles'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'92'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Organisation de jeux de hasard et d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'argent'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'93'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités sportives, récréatives et de loisirs'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'94'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités des organisations associatives'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'95'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Réparation d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'ordinateurs et de biens personnels et domestiques'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'96'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Autres services personnels'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'97'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités des ménages en tant qu'&lt;/span&gt;&lt;span style="color: #006080"&gt;'employeurs de personnel domestique'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'98'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités indifférenciées des ménages en tant que producteurs de biens et services pour usage propre'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'99'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités des organisations et organismes extraterritoriaux'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Division'&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;-- Groupe&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'01.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Cultures non permanentes'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'01.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Cultures permanentes'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'01.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Reproduction de plantes'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'01.4'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Production animale'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'01.5'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Culture et élevage associés'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'01.6'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités de soutien à l'&lt;/span&gt;&lt;span style="color: #006080"&gt;'agriculture et traitement primaire des récoltes'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'01.7'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Chasse, piégeage et services annexes'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'02.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Sylviculture et autres activités forestières'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'02.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Exploitation forestière'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'02.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Récolte de produits forestiers non ligneux poussant à l'&lt;/span&gt;&lt;span style="color: #006080"&gt;'état sauvage'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'02.4'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Services de soutien à l'&lt;/span&gt;&lt;span style="color: #006080"&gt;'exploitation forestière'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'03.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Pêche'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'03.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Aquaculture'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'05.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Extraction de houille'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'05.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Extraction de lignite'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'06.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Extraction de pétrole brut'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'06.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Extraction de gaz naturel'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'07.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Extraction de minerais de fer'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'07.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Extraction de minerais de métaux non ferreux'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'08.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Extraction de pierres, de sables et d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'argiles'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'08.9'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités extractives n.c.a.'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'09.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités de soutien à l'&lt;/span&gt;&lt;span style="color: #006080"&gt;'extraction d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'hydrocarbures'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'09.9'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités de soutien aux autres industries extractives'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'10.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Transformation et conservation de la viande et préparation de produits à base de viande'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'10.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Transformation et conservation de poisson, de crustacés et de mollusques'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'10.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Transformation et conservation de fruits et légumes'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'10.4'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'huiles et graisses végétales et animales'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'10.5'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de produits laitiers'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'10.6'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Travail des grains ; fabrication de produits amylacés'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'10.7'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de produits de boulangerie-pâtisserie et de pâtes alimentaires'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'10.8'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'autres produits alimentaires'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'10.9'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'aliments pour animaux'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'11.0'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de boissons'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'12.0'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de produits à base de tabac'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'13.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Préparation de fibres textiles et filature'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'13.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Tissage'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'13.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Ennoblissement textile'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'13.9'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'autres textiles'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'14.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de vêtements, autres qu'&lt;/span&gt;&lt;span style="color: #006080"&gt;'en fourrure'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'14.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'articles en fourrure'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'14.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'articles à mailles'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'15.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Apprêt et tannage des cuirs ; préparation et teinture des fourrures ; fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'articles de voyage, de maroquinerie et de sellerie'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'15.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de chaussures'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'16.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Sciage et rabotage du bois'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'16.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'articles en bois, liège, vannerie et sparterie'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'17.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de pâte à papier, de papier et de carton'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'17.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'articles en papier ou en carton'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'18.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Imprimerie et services annexes'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'18.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Reproduction d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'enregistrements'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'19.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Cokéfaction'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'19.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Raffinage du pétrole'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'20.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de produits chimiques de base, de produits azotés et d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'engrais, de matières plastiques de base et de caoutchouc synthétique'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'20.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de pesticides et d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'autres produits agrochimiques'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'20.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de peintures, vernis, encres et mastics'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'20.4'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de savons, de produits d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'entretien et de parfums'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'20.5'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'autres produits chimiques'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'20.6'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de fibres artificielles ou synthétiques'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'21.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de produits pharmaceutiques de base'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'21.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de préparations pharmaceutiques'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'22.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de produits en caoutchouc'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'22.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de produits en plastique'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'23.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de verre et d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'articles en verre'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'23.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de produits réfractaires'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'23.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de matériaux de construction en terre cuite'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'23.4'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'autres produits en céramique et en porcelaine'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'23.5'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de ciment, chaux et plâtre'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'23.6'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'ouvrages en béton, en ciment ou en plâtre'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'23.7'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Taille, façonnage et finissage de pierres'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'23.9'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de produits abrasifs et de produits minéraux non métalliques n.c.a.'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'24.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Sidérurgie'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'24.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de tubes, tuyaux, profilés creux et accessoires correspondants en acier'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'24.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'autres produits de première transformation de l'&lt;/span&gt;&lt;span style="color: #006080"&gt;'acier'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'24.4'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Production de métaux précieux et d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'autres métaux non ferreux'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'24.5'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fonderie'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'25.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'éléments en métal pour la construction'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'25.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de réservoirs, citernes et conteneurs métalliques'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'25.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de générateurs de vapeur, à l'&lt;/span&gt;&lt;span style="color: #006080"&gt;'exception des chaudières pour le chauffage central'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'25.4'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'armes et de munitions'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'25.5'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Forge, emboutissage, estampage ; métallurgie des poudres'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'25.6'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Traitement et revêtement des métaux ; usinage'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'25.7'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de coutellerie, d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'outillage et de quincaillerie'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'25.9'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'autres ouvrages en métaux'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'26.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de composants et cartes électroniques'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'26.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'ordinateurs et d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'équipements périphériques'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'26.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'équipements de communication'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'26.4'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de produits électroniques grand public'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'26.5'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'instruments et d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'appareils de mesure, d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'essai et de navigation ; horlogerie'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'26.6'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'équipements d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'irradiation médicale, d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'équipements électromédicaux et électrothérapeutiques'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'26.7'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de matériels optique et photographique'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'26.8'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de supports magnétiques et optiques'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'27.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de moteurs, génératrices et transformateurs électriques et de matériel de distribution et de commande électrique'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'27.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de piles et d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'accumulateurs électriques'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'27.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de fils et câbles et de matériel d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'installation électrique'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'27.4'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'appareils d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'éclairage électrique'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'27.5'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'appareils ménagers'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'27.9'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'autres matériels électriques'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'28.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de machines d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'usage général'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'28.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'autres machines d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'usage général'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'28.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de machines agricoles et forestières'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'28.4'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de machines de formage des métaux et de machines-outils'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'28.9'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'autres machines d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'usage spécifique'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'29.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Construction de véhicules automobiles'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'29.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de carrosseries et remorques'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'29.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'équipements automobiles'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'30.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Construction navale'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'30.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Construction de locomotives et d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'autre matériel ferroviaire roulant'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'30.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Construction aéronautique et spatiale'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'30.4'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Construction de véhicules militaires de combat'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'30.9'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de matériels de transport n.c.a.'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'31.0'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de meubles'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'32.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'articles de joaillerie, bijouterie et articles similaires'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'32.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'instruments de musique'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'32.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'articles de sport'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'32.4'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication de jeux et jouets'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'32.5'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fabrication d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'instruments et de fournitures à usage médical et dentaire'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'32.9'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités manufacturières n.c.a.'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'33.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Réparation d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'ouvrages en métaux, de machines et d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'équipements'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'33.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Installation de machines et d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'équipements industriels'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'35.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Production, transport et distribution d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'électricité'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'35.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Production et distribution de combustibles gazeux'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'35.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Production et distribution de vapeur et d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'air conditionné'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'36.0'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Captage, traitement et distribution d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'eau'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'37.0'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Collecte et traitement des eaux usées'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'38.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Collecte des déchets'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'38.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Traitement et élimination des déchets'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'38.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Récupération'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'39.0'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Dépollution et autres services de gestion des déchets'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'41.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Promotion immobilière'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'41.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Construction de bâtiments résidentiels et non résidentiels'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'42.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Construction de routes et de voies ferrées'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'42.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Construction de réseaux et de lignes'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'42.9'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Construction d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'autres ouvrages de génie civil'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'43.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Démolition et préparation des sites'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'43.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Travaux d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'installation électrique, plomberie et autres travaux d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'installation'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'43.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Travaux de finition'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'43.9'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Autres travaux de construction spécialisés'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'45.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Commerce de véhicules automobiles'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'45.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Entretien et réparation de véhicules automobiles'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'45.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Commerce d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'équipements automobiles'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'45.4'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Commerce et réparation de motocycles'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'46.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Intermédiaires du commerce de gros'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'46.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Commerce de gros de produits agricoles bruts et d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'animaux vivants'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'46.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Commerce de gros de produits alimentaires, de boissons et de tabac'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'46.4'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Commerce de gros de biens domestiques'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'46.5'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Commerce de gros d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'équipements de l'&lt;/span&gt;&lt;span style="color: #006080"&gt;'information et de la communication'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'46.6'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Commerce de gros d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'autres équipements industriels'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'46.7'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Autres commerces de gros spécialisés'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'46.9'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Commerce de gros non spécialisé'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'47.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Commerce de détail en magasin non spécialisé'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'47.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Commerce de détail alimentaire en magasin spécialisé'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'47.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Commerce de détail de carburants en magasin spécialisé'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'47.4'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Commerce de détail d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'équipements de l'&lt;/span&gt;&lt;span style="color: #006080"&gt;'information et de la communication en magasin spécialisé'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'47.5'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Commerce de détail d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'autres équipements du foyer en magasin spécialisé'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'47.6'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Commerce de détail de biens culturels et de loisirs en magasin spécialisé'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'47.7'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Autres commerces de détail en magasin spécialisé'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'47.8'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Commerce de détail sur éventaires et marchés'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'47.9'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Commerce de détail hors magasin, éventaires ou marchés'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'49.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Transport ferroviaire interurbain de voyageurs'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'49.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Transports ferroviaires de fret'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'49.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Autres transports terrestres de voyageurs'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'49.4'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Transports routiers de fret et services de déménagement'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'49.5'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Transports par conduites'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'50.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Transports maritimes et côtiers de passagers'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'50.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Transports maritimes et côtiers de fret'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'50.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Transports fluviaux de passagers'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'50.4'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Transports fluviaux de fret'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'51.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Transports aériens de passagers'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'51.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Transports aériens de fret et transports spatiaux'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'52.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Entreposage et stockage'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'52.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Services auxiliaires des transports'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'53.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités de poste dans le cadre d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'une obligation de service universel'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'53.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Autres activités de poste et de courrier'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'55.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Hôtels et hébergement similaire'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'55.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Hébergement touristique et autre hébergement de courte durée'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'55.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Terrains de camping et parcs pour caravanes ou véhicules de loisirs'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'55.9'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Autres hébergements'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'56.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Restaurants et services de restauration mobile'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'56.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Traiteurs et autres services de restauration'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'56.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Débits de boissons'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'58.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Édition de livres et périodiques et autres activités d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'édition'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'58.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Édition de logiciels'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'59.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités cinématographiques, vidéo et de télévision'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'59.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Enregistrement sonore et édition musicale'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'60.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Édition et diffusion de programmes radio'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'60.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Programmation de télévision et télédiffusion'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'61.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Télécommunications filaires'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'61.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Télécommunications sans fil'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'61.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Télécommunications par satellite'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'61.9'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Autres activités de télécommunication'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'62.0'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Programmation, conseil et autres activités informatiques'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'63.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Traitement de données, hébergement et activités connexes ; portails Internet'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'63.9'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Autres services d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'information'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'64.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Intermédiation monétaire'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'64.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités des sociétés holding'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'64.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Fonds de placement et entités financières similaires'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'64.9'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Autres activités des services financiers, hors assurance et caisses de retraite'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'65.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Assurance'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'65.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Réassurance'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'65.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Caisses de retraite'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'66.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités auxiliaires de services financiers, hors assurance et caisses de retraite'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'66.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités auxiliaires d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'assurance et de caisses de retraite'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'66.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Gestion de fonds'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'68.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités des marchands de biens immobiliers'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'68.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Location et exploitation de biens immobiliers propres ou loués'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'68.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités immobilières pour compte de tiers'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'69.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités juridiques'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'69.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités comptables'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'70.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités des sièges sociaux'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'70.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Conseil de gestion'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'71.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'architecture et d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'ingénierie'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'71.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités de contrôle et analyses techniques'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'72.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Recherche-développement en sciences physiques et naturelles'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'72.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Recherche-développement en sciences humaines et sociales'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'73.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Publicité'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'73.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Études de marché et sondages'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'74.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités spécialisées de design'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'74.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités photographiques'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'74.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Traduction et interprétation'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'74.9'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Autres activités spécialisées, scientifiques et techniques n.c.a.'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'75.0'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités vétérinaires'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'77.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Location et location-bail de véhicules automobiles'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'77.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Location et location-bail de biens personnels et domestiques'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'77.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Location et location-bail d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'autres machines, équipements et biens'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'77.4'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Location-bail de propriété intellectuelle et de produits similaires, à l'&lt;/span&gt;&lt;span style="color: #006080"&gt;'exception des œuvres soumises à copyright'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'78.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités des agences de placement de main-d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'œuvre'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'78.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités des agences de travail temporaire'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'78.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Autre mise à disposition de ressources humaines'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'79.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités des agences de voyage et voyagistes'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'79.9'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Autres services de réservation et activités connexes'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'80.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités de sécurité privée'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'80.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités liées aux systèmes de sécurité'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'80.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'enquête'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'81.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités combinées de soutien lié aux bâtiments'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'81.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités de nettoyage'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'81.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Services d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'aménagement paysager'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'82.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités administratives'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'82.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités de centres d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'appels'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'82.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Organisation de salons professionnels et congrès'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'82.9'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités de soutien aux entreprises n.c.a.'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'84.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Administration générale, économique et sociale'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'84.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Services de prérogative publique'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'84.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Sécurité sociale obligatoire'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'85.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Enseignement pré-primaire'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'85.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Enseignement primaire'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'85.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Enseignement secondaire'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'85.4'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Enseignement supérieur et post-secondaire non supérieur'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'85.5'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Autres activités d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'enseignement'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'85.6'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités de soutien à l'&lt;/span&gt;&lt;span style="color: #006080"&gt;'enseignement'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'86.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités hospitalières'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'86.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activité des médecins et des dentistes'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'86.9'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Autres activités pour la santé humaine'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'87.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Hébergement médicalisé'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'87.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Hébergement social pour personnes handicapées mentales, malades mentales et toxicomanes'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'87.3'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Hébergement social pour personnes âgées ou handicapées physiques'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'87.9'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Autres activités d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'hébergement social'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'88.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Action sociale sans hébergement pour personnes âgées et pour personnes handicapées'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'88.9'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Autre action sociale sans hébergement'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'90.0'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités créatives, artistiques et de spectacle'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'91.0'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Bibliothèques, archives, musées et autres activités culturelles'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'92.0'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Organisation de jeux de hasard et d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'argent'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'93.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités liées au sport'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'93.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités récréatives et de loisirs'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'94.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités des organisations économiques, patronales et professionnelles'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'94.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités des syndicats de salariés'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'94.9'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités des autres organisations associatives'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'95.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Réparation d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'ordinateurs et d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'équipements de communication'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'95.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Réparation de biens personnels et domestiques'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'96.0'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Autres services personnels'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'97.0'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités des ménages en tant qu'&lt;/span&gt;&lt;span style="color: #006080"&gt;'employeurs de personnel domestique'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'98.1'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités indifférenciées des ménages en tant que producteurs de biens pour usage propre'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'98.2'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités indifférenciées des ménages en tant que producteurs de services pour usage propre'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'99.0'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Activités des organisations et organismes extraterritoriaux'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Groupe'&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;-- Classe&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'01.11'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Culture de céréales (à l'&lt;/span&gt;&lt;span style="color: #006080"&gt;'exception du riz), de légumineuses et de graines oléagineuses'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Classe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'01.12'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Culture du riz'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Classe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'01.13'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Culture de légumes, de melons, de racines et de tubercules'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Classe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'01.14'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Culture de la canne à sucre'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Classe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'01.15'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Culture du tabac'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Classe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'01.16'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Culture de plantes à fibres'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Classe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'01.19'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Autres cultures non permanentes'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Classe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'01.21'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Culture de la vigne'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Classe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'01.22'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Culture de fruits tropicaux et subtropicaux'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Classe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'01.23'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Culture d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'agrumes'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Classe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'01.24'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Culture de fruits à pépins et à noyau'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Classe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'01.25'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Culture d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'autres fruits d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'arbres ou d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'arbustes et de fruits à coque'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Classe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'01.26'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Culture de fruits oléagineux'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Classe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'01.27'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Culture de plantes à boissons'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Classe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'01.28'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Culture de plantes à épices, aromatiques, médicinales et pharmaceutiques'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Classe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'01.29'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Autres cultures permanentes'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Classe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'01.30'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Reproduction de plantes'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Classe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'01.41'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Élevage de vaches laitières'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Classe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'01.42'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Élevage d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'autres bovins et de buffles'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Classe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, LevelName) values (&lt;span style="color: #006080"&gt;'01.43'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'Élevage de chevaux et d'&lt;/span&gt;&lt;span style="color: #006080"&gt;'autres équidés'&lt;/span&gt;,&lt;span style="color: #006080"&gt;'Classe'&lt;/span&gt;)&lt;br /&gt;insert into NAF (Code, Name, Lev
