<?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-5619051591853320584</id><updated>2011-11-28T00:54:14.178+01:00</updated><category term='MVC 2'/><category term='Navigateurs'/><category term='Visual Studio'/><category term='MVC'/><category term='CSS'/><category term='BDC'/><category term='TFS'/><category term='Article'/><category term='Opera'/><category term='SigmaT'/><category term='Sécurité'/><category term='blog'/><category term='Ajax'/><category term='XNA'/><category term='ASP.NET'/><category term='Job'/><category term='Windows Phone'/><category term='Bewise'/><category term='Regex'/><category term='3D'/><category term='Linq'/><category term='HTML'/><category term='Internet Explorer'/><category term='JavaScript'/><category term='.NET'/><category term='Silverlight'/><title type='text'>La casa del .Net</title><subtitle type='html'>Développement web et .net ! ASP.NET, MVC, HTML et JavaScript</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.adhess.net/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>63</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-3387503874211231055</id><published>2011-08-23T16:39:00.001+02:00</published><updated>2011-08-23T16:45:01.441+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><title type='text'>WP7 : “Unspecified error” lorsqu’on modifie un template, depuis la mise à jour Mango</title><content type='html'>&lt;p&gt;J’ai eu une erreur dans un de mes projets WP7 lors du passage au SDK 7.1 (Mango), sur un code qui fonctionnait très bien avec le SDK 7.0, avec un message d’erreur très précis, comme on les aime :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-rqLUrVkc08M/TlO7ju3XmiI/AAAAAAAAB0s/vCx2pfAyYFo/s1600-h/image%25255B5%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-6uudeRTxTLA/TlO7kLb-nII/AAAAAAAAB0w/Zmb7E-PVb_E/image_thumb%25255B3%25255D.png?imgmax=800" width="452" height="269" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Evidemment, pas moyen de trouver la moindre personne sur le net ayant déjà rencontré (et corrigé) l’erreur (quelqu’un a finalement posé la question sur &lt;a href="http://stackoverflow.com/questions/7132232/wp7-mango-retemplating-phoneapplicationframe-created-unspecified-error-excepti/7162283#7162283" target="_blank"&gt;StackOverflow&lt;/a&gt; ce week-end, ayant déjà trouvé la réponse entre temps j’espère lui avoir été utile).&lt;/p&gt;  &lt;p&gt;J’ai donc investigué pour trouver l’origine de ce bug, qui venait d’une Listbox, dont les templates des items avaient été redéfinis :&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; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; 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; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ListBox&lt;/span&gt;  &lt;span style="color: #ff0000"&gt;x:Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;lstUsers&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ListBox.ItemContainerStyle&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Style&lt;/span&gt; &lt;span style="color: #ff0000"&gt;TargetType&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;ListBoxItem&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setter&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Property&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Template&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setter.Value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ControlTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ContentControl&lt;/span&gt; &lt;span style="color: #ff0000"&gt;x:Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;ContentContainer&amp;quot;&lt;/span&gt; &lt;br /&gt;                                        &lt;span style="color: #ff0000"&gt;VerticalContentAlignment&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;{TemplateBinding VerticalContentAlignment}&amp;quot;&lt;/span&gt; &lt;br /&gt;                                        &lt;span style="color: #ff0000"&gt;HorizontalContentAlignment&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;{TemplateBinding HorizontalContentAlignment}&amp;quot;&lt;/span&gt; &lt;br /&gt;                                        &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;{TemplateBinding Padding}&amp;quot;&lt;/span&gt; &lt;br /&gt;                                        &lt;span style="color: #ff0000"&gt;Content&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;{TemplateBinding Content}&amp;quot;&lt;/span&gt; &lt;br /&gt;                                        &lt;span style="color: #ff0000"&gt;ContentTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;{TemplateBinding ContentTemplate}&amp;quot;&lt;/span&gt; &lt;br /&gt;                                        &lt;span style="color: #ff0000"&gt;Foreground&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;{TemplateBinding Foreground}&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ControlTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Setter.Value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Setter&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Style&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ListBox.ItemContainerStyle&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ListBox&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;La solution : il faut définir la propriété TargetType sur le ControlTemplate : &lt;br /&gt;  &lt;br /&gt;&amp;lt;ControlTemplate TargetType=&amp;quot;ListBoxItem&amp;quot;&amp;gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&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; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; 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; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ListBox&lt;/span&gt;  &lt;span style="color: #ff0000"&gt;x:Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;lstUsers&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ListBox.ItemContainerStyle&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Style&lt;/span&gt; &lt;span style="color: #ff0000"&gt;TargetType&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;ListBoxItem&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setter&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Property&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Template&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setter.Value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ControlTemplate&lt;/span&gt; &lt;span style="color: #ff0000"&gt;TargetType&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;ListBoxItem&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;                        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ContentControl&lt;/span&gt; &lt;span style="color: #ff0000"&gt;x:Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;ContentContainer&amp;quot;&lt;/span&gt; &lt;br /&gt;                                        &lt;span style="color: #ff0000"&gt;VerticalContentAlignment&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;{TemplateBinding VerticalContentAlignment}&amp;quot;&lt;/span&gt; &lt;br /&gt;                                        &lt;span style="color: #ff0000"&gt;HorizontalContentAlignment&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;{TemplateBinding HorizontalContentAlignment}&amp;quot;&lt;/span&gt; &lt;br /&gt;                                        &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;{TemplateBinding Padding}&amp;quot;&lt;/span&gt; &lt;br /&gt;                                        &lt;span style="color: #ff0000"&gt;Content&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;{TemplateBinding Content}&amp;quot;&lt;/span&gt; &lt;br /&gt;                                        &lt;span style="color: #ff0000"&gt;ContentTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;{TemplateBinding ContentTemplate}&amp;quot;&lt;/span&gt; &lt;br /&gt;                                        &lt;span style="color: #ff0000"&gt;Foreground&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;{TemplateBinding Foreground}&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;                    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ControlTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Setter.Value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Setter&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Style&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ListBox.ItemContainerStyle&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ListBox&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Maintenant ça fonctionne aussi bien avec l’ancien qu’avec le nouveau SDK :)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-3387503874211231055?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/3387503874211231055/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=3387503874211231055' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/3387503874211231055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/3387503874211231055'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2011/08/wp7-unspecified-error-lorsquon-modifie.html' title='WP7 : “Unspecified error” lorsqu’on modifie un template, depuis la mise à jour Mango'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/-6uudeRTxTLA/TlO7kLb-nII/AAAAAAAAB0w/Zmb7E-PVb_E/s72-c/image_thumb%25255B3%25255D.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-3521117448678620324</id><published>2011-05-20T15:30:00.001+02:00</published><updated>2011-05-20T15:30:33.967+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='Bewise'/><title type='text'>Découvrez les Bewise Phone Controls</title><content type='html'>&lt;p&gt;Bonjour tout le monde ! Aujourd’hui je fais un billet pour vous présenter les &lt;a href="http://bewisephonecontrols.codeplex.com/" target="_blank"&gt;Bewise Phone Controls&lt;/a&gt;, une librairie de contrôles pour développeurs Windows Phone ; projet que je gère avec &lt;a href="http://www.maneu.fr" target="_blank"&gt;Christopher Maneu&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;La version 2 de la librairie est disponible, et vous pouvez trouver plein de contrôles bien sympa. Mes préférés :&lt;/p&gt;  &lt;p&gt;La &lt;strong&gt;JumpList&lt;/strong&gt; :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1fIQLbpqRAw/TdZs5H1yIFI/AAAAAAAAB0I/nZ3h3Hi29ag/s1600-h/image%5B17%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_1fIQLbpqRAw/TdZs5iatsRI/AAAAAAAAB0M/leuMg1LAZYg/image_thumb%5B7%5D.png?imgmax=800" width="232" height="416" /&gt;&lt;/a&gt;&lt;a href="http://lh6.ggpht.com/_1fIQLbpqRAw/TdZs6ZNusKI/AAAAAAAAB0Q/SfTiFv0ATVs/s1600-h/image%5B18%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_1fIQLbpqRAw/TdZs6-fmETI/AAAAAAAAB0U/lU5F3STiCEI/image_thumb%5B8%5D.png?imgmax=800" width="230" height="412" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;L’&lt;strong&gt;OrderableList&lt;/strong&gt; :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1fIQLbpqRAw/TdZs7boflpI/AAAAAAAAB0Y/KgS6Ey5-FU8/s1600-h/image%5B22%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_1fIQLbpqRAw/TdZs9Y0WTMI/AAAAAAAAB0c/_mC_0-y4coo/image_thumb%5B10%5D.png?imgmax=800" width="322" height="225" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Le &lt;strong&gt;TileButton&lt;/strong&gt; :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1fIQLbpqRAw/TdZs96IsItI/AAAAAAAAB0g/BquDxXM_S2E/s1600-h/image%5B26%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_1fIQLbpqRAw/TdZs-P0rIjI/AAAAAAAAB0k/rBx3FdvrGeQ/image_thumb%5B12%5D.png?imgmax=800" width="156" height="255" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Il y en a bien d’autres, je vous laisse aller sur &lt;a href="http://bewisephonecontrols.codeplex.com/" target="_blank"&gt;le site officiel du projet&lt;/a&gt; pour les découvrir.&lt;/p&gt;  &lt;p&gt;Ces contrôles là ont été travaillés au niveau du rendu et des animations pour permettre aux développeurs d’offrir une expérience utilisateur la plus fluide et la plus agréable possible. C’est difficile à montrer en quelques captures d’écran, mais je vous assure que ça a été travaillé, et j’espère que vous les essaierez et que vous les apprécierez.&lt;/p&gt;  &lt;p&gt;Pour utiliser les Bewise Phone Controls dans votre projet, vous pouvez soit télécharger la dll, soit l’installer en cherchant “Bewise” dans NuGet. &lt;/p&gt;  &lt;p&gt;Vous pouvez aussi utiliser la ligne de commande NuGet suivante :&lt;/p&gt;  &lt;p&gt;Install-Package BewisePhoneControls&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-3521117448678620324?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/3521117448678620324/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=3521117448678620324' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/3521117448678620324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/3521117448678620324'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2011/05/decouvrez-les-bewise-phone-controls.html' title='Découvrez les Bewise Phone Controls'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_1fIQLbpqRAw/TdZs5iatsRI/AAAAAAAAB0M/leuMg1LAZYg/s72-c/image_thumb%5B7%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-303545514772783462</id><published>2011-03-25T22:57:00.001+01:00</published><updated>2011-03-25T22:57:35.368+01:00</updated><title type='text'>Mes applications WP7</title><content type='html'>&lt;p&gt;Bonsoir tout le monde !&lt;/p&gt;  &lt;p&gt;Aujourd’hui je ne blogue pas pour parler d’un point technique, je veux juste vous parler de l’ouverture de mon site web sur mes applications Windows Phone.&lt;/p&gt;  &lt;p&gt;J’ai activé la fonction blog dessus, histoire d’avoir un endroit où parler de Windows Phone, il n’y aura certainement pas grand chose d’intéressant, mais je ne force personne à le lire.&lt;/p&gt;  &lt;p&gt;Le lien : &lt;a href="http://wp7.adhess.net"&gt;http://wp7.adhess.net&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;(et si vous aimez mes applications, n’ayez pas peur d’en faire la pub)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-303545514772783462?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/303545514772783462/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=303545514772783462' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/303545514772783462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/303545514772783462'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2011/03/mes-applications-wp7.html' title='Mes applications WP7'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-4515400515976503002</id><published>2011-03-01T17:08:00.001+01:00</published><updated>2011-03-01T17:24:52.210+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BDC'/><category scheme='http://www.blogger.com/atom/ns#' term='Bewise'/><title type='text'>Rendez-vous à la Bewise Day Conference 2011</title><content type='html'>&lt;p&gt;Encore une fois cette année Bewise organise une conférence sur les technologies de développement de Microsoft, &lt;a href="http://bdc2011.bewise.fr/?canal=blog"&gt;la Bewise Day Conference&lt;/a&gt;. Réservez donc votre journée le 7 avril prochain, et en attendant, prenez note de la règle n°1 :&lt;/p&gt; &lt;iframe title="YouTube video player" height="390" src="http://www.youtube.com/embed/Jw3Fg9-LqMA?rel=0" frameborder="0" width="640" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;  &lt;p&gt;Rendez-vous donc au Casino Barrière à Toulouse le 7 avril 2011 pour cette nouvelle édition de la BDC.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-4515400515976503002?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/4515400515976503002/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=4515400515976503002' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/4515400515976503002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/4515400515976503002'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2011/03/rendez-vous-la-bewise-day-conference.html' title='Rendez-vous à la Bewise Day Conference 2011'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/Jw3Fg9-LqMA/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-3663783580477455560</id><published>2011-02-24T11:33:00.001+01:00</published><updated>2011-02-24T11:33:19.917+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>Installation et utilisation de NuGet</title><content type='html'>&lt;p&gt;A force d’en entendre parler, je me suis dit que j’allais quand même essayer NuGet, pour voir si ça marche bien.&lt;/p&gt;  &lt;p&gt;Pour ceux qui ne connaissent pas, NuGet est un gestionnaire de paquets pour le framework .Net, qui se présente sous la forme d’une extension de Visual Studio 2010.&lt;/p&gt;  &lt;p&gt;Il parait que c’est super simple à utiliser, alors je vais écrire cet article en live, en même temps que je découvre :o)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;L’installation&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Pour installer NuGet, 2 options s’offrent à nous :&lt;/p&gt;  &lt;p&gt;- Aller sur &lt;a href="http://nuget.org/"&gt;le site web officiel de NuGet&lt;/a&gt;, et cliquer sur le bouton “Install Nuget”     &lt;br /&gt;- L’installer depuis l’Extension Manager de Visual Studio 2010. On recherche “Nuget”, et on clique sur le bouton “Download”&lt;/p&gt;  &lt;p&gt;Dans la fenêtre d’installation, on a juste à cliquer sur “Install”&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1fIQLbpqRAw/TWYz44FtTHI/AAAAAAAABzs/_vpKTCjF0kY/s1600-h/image%5B4%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_1fIQLbpqRAw/TWYz5VRyATI/AAAAAAAABzw/mBUqDYN1PyM/image_thumb%5B2%5D.png?imgmax=800" width="450" height="334" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Une fois l’extension installée, on redémarre Visual Studio, et en avant !&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Utilisation de NuGet&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;J’ai décidé de créer un nouveau projet ASP.NET MVC 3 (au hasard ^^), dans lequel je vais essayer d’installer mes packages.&lt;/p&gt;  &lt;p&gt;Dans le menu “Tools”, j’ai une nouvelle option : “Library Package Manager”. C’est lui notre fameux NuGet.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1fIQLbpqRAw/TWYz53SjzDI/AAAAAAAABz0/SEvoN6nNVa8/s1600-h/image%5B9%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_1fIQLbpqRAw/TWYz6aapkTI/AAAAAAAABz4/Bcre7yJ54h0/image_thumb%5B5%5D.png?imgmax=800" width="658" height="375" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Je choisis l’option “Add Library Package Reference”, et je vais chercher mes packages.&lt;/p&gt;  &lt;p&gt;Je fais une recherche par nom, je clique sur “Install” :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1fIQLbpqRAw/TWYz6-VRl2I/AAAAAAAABz8/r5B1TsX_ubw/s1600-h/image%5B14%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_1fIQLbpqRAw/TWYz7wxYG-I/AAAAAAAAB0A/W6jnDl-OjF8/image_thumb%5B8%5D.png?imgmax=800" width="899" height="598" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Et voilà, rien de plus à faire, T4MVC est automatiquement téléchargé et ajouté à mon projet.&lt;/p&gt;  &lt;p&gt;Pour supprimer, c’est pas plus compliqué : dans la liste des paquets installés, on en choisit un et on clique sur “Uninstall”, et tout est nettoyé.&lt;/p&gt;  &lt;p&gt;Bilan : c’est tellement simple que j’ai presque honte d’en faire un article sur mon blog, mais si comme moi vous hésitiez à l’installer, n’hésitez plus, c’est vraiment très pratique :o)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-3663783580477455560?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/3663783580477455560/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=3663783580477455560' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/3663783580477455560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/3663783580477455560'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2011/02/installation-et-utilisation-de-nuget.html' title='Installation et utilisation de NuGet'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_1fIQLbpqRAw/TWYz5VRyATI/AAAAAAAABzw/mBUqDYN1PyM/s72-c/image_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-8169340881793819967</id><published>2011-02-21T17:18:00.001+01:00</published><updated>2011-02-24T10:59:22.605+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sécurité'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>ASP.NET - Peut-on cliquer sur un bouton invisible ?</title><content type='html'>&lt;p&gt;Contrairement à ce que &lt;a href="http://blogs.dotnet-france.com/juliend/post/ASPNET-Manque-de-rigueur-3d-faille-de-securite.aspx"&gt;nous affirme Julien Dollon&lt;/a&gt;, ce n’est pas possible. En effet, parmis les options de sécurité d’asp.net, on en a une qui vérifie qu’un évènement est bien levé par un contrôle existant. Voyons comment ça fonctionne.&lt;/p&gt;  &lt;p&gt;Premier test : on crée un bouton asp.net avec un évènement serveur associé :    &lt;br /&gt;&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Button&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Button1&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Button&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;onclick&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Button1_Click&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Voyons le HTML généré pour ce bouton:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;input&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;submit&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ctl00$MainContent$Button1&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Faux Button&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;MainContent_Button1&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Je décide de remettre cet input dans ma page web, pour pouvoir effectuer mes tests :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Button&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Button1&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Button&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;onclick&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Button1_Click&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;input&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;submit&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ctl00$MainContent$Button1&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Faux Button&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;MainContent_Button1&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;(Bon, d’un point de vue strictement html, ce n’est pas correct puisqu’on a 2 fois le même id, mais ce n’est pas grave, ça nous permets quand même de tester)&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Vous pouvez maintenant relancer la page, et cliquer sur les 2 boutons : les 2 fonctionnent et appellent le même évènement serveur.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Second test : je masque mon bouton serveur, et je n’ai donc que l’input, qui est censé faire la même chose. Je clique dessus, et paf :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1fIQLbpqRAw/TWKQQNFRoCI/AAAAAAAABzk/S50Try0WDmU/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/_1fIQLbpqRAw/TWKQQ2Ra8rI/AAAAAAAABzo/w_a6zk0PXN8/image_thumb%5B1%5D.png?imgmax=800" width="900" height="348" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Cette fois, on a une exception. Comme je vous le disais en introduction (et comme c’est expliqué dans l’exception), asp.net vérifie que l’appel d’un évènement est bien fait pas le contrôle qui est censé le faire. Ici, le contrôle est invisible, donc il sait qu’on ne doit pas pouvoir cliquer dessus. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Comment ça fonctionne ? Si on va voir dans le code html de la page, on a ça :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;input&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;hidden&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;__EVENTVALIDATION&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;__EVENTVALIDATION&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;/wEWAgK/nJySCALU8MqYCAhBiRxDmDNQ9n9ZcocpixkidLmpXhA4hY5aUcMhNlh9&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;La plupart des développeurs asp.net connaissent le viewstate, beaucoup moins connaissent ce champ caché nommé __EVENTVALIDATION. Comme son nom l’indique, il permets de valider les évènements. Il s’agit de données chiffrées permettant de savoir quels sont les boutons cliquables. Donc impossible pour un pirate de simuler un clic sur un bouton invisible !&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Pour plus d’informations, je vous renvoie à &lt;a href="http://blogs.codes-sources.com/cyril/archive/2007/01/09/validation-d-evenement-en-asp-net-2-0-eventvalidation.aspx"&gt;l’article de Cyril Durand sur la validation d’évènements&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Il n’en reste pas moins que sur le fond, Julien a raison : même si asp.net nous facilite le travail, ne déléguez jamais la sécurité ;) il ne faut surtout pas se baser sur la visibilité d’un bouton pour donner des droits d’administration, les vérifications doivent impérativement être faites au niveau métier.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-8169340881793819967?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/8169340881793819967/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=8169340881793819967' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/8169340881793819967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/8169340881793819967'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2011/02/aspnet-peut-on-cliquer-sur-un-bouton.html' title='ASP.NET - Peut-on cliquer sur un bouton invisible ?'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_1fIQLbpqRAw/TWKQQ2Ra8rI/AAAAAAAABzo/w_a6zk0PXN8/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-5619051591853320584.post-6800684000140576266</id><published>2011-01-11T17:21:00.001+01:00</published><updated>2011-01-11T17:21:30.201+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Regex'/><title type='text'>Les assertions dans les expressions régulières</title><content type='html'>&lt;p&gt;Bonjour tout le monde !&lt;/p&gt;  &lt;p&gt;Me voilà de retour pour une nouvelle année de blogging, qu’on espère tous plus chargée que la précédente, mais connaissant ma flemme légendaire, c’est pas gagné.   &lt;br /&gt;Afin de ne pas passer pour un rustre, je vous souhaite quand même à tous une excellente année 2011, mais on va passer rapidement les voeux, parce que mine de rien, on a du boulot.&lt;/p&gt;  &lt;p&gt;Aujourd’hui, cours de Regex, on va voir les assertions.&lt;/p&gt;  &lt;p&gt;Je suppose beaucoup de monde connait déjà les Regex, et sais en faire un usage basique pour faire des recherches ou remplacements dans une chaine de caractères. Mais tout le monde ne connait pas forcément, ou ne sait pas utiliser les assertions. Nous allons donc remédier à ça ensemble.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Le besoin :&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;J’ai une chaine de caractères dans laquelle je veux remplacer toutes les occurrences d’une apostrophe suivie d’un caractère alphanumérique.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;La première solution (dite « du noob »):&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;1- On fait une recherche d’une apostrophe suivie d’un caractère alphanum:   &lt;br /&gt;&lt;b&gt;'[a-z0-9]&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;2- On remplace par notre valeur   &lt;br /&gt;Regex.Replace(texte, @&amp;quot;&lt;b&gt;'[a-z0-9]&lt;/b&gt;&amp;quot;, @&amp;quot;&lt;b&gt;&amp;amp;apos;&lt;/b&gt;&amp;quot;);&lt;/p&gt;  &lt;p&gt;3- On se rend compte qu’on a effacé le caractère suivant, et on se débrouille pour le récupérer afin de le réafficher   &lt;br /&gt;Regex.Replace(texte, @&amp;quot;&lt;b&gt;'([a-z0-9])&lt;/b&gt;&amp;quot;, @&amp;quot;&lt;b&gt;&amp;amp;apos;$1&lt;/b&gt;&amp;quot;);&lt;/p&gt;  &lt;p&gt;Alors ça fonctionne, oui, mais c’est tout moche. On va faire autrement&lt;/p&gt;  &lt;p&gt;&lt;u&gt;La solution qui roxxe&amp;#160; (ou « la Lacasa’s ») :&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;1- On utilise une assertion pour trouver nos apostrophes :   &lt;br /&gt;&lt;b&gt;'(?=[a-z0-9])&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;2- On fait notre remplacement   &lt;br /&gt;Regex.Replace(texte, @&amp;quot;&lt;b&gt;'(?=[a-z0-9])&lt;/b&gt;&amp;quot;, @&amp;quot;&lt;b&gt;&amp;amp;apos;&lt;/b&gt;&amp;quot;);&lt;/p&gt;  &lt;p&gt;Et cette fois, ça fonctionne aussi, mais en plus propre et plus performant.&lt;/p&gt;  &lt;p&gt;La différence entre les 2 solutions :&lt;/p&gt;  &lt;p&gt;Dans le premier cas, notre pattern comprend une apostrophe, et le caractère se trouvant après. Si on fait un remplacement, le pattern a récupéré 2 caractères et les remplace tous les deux ; ce qui nous oblige à faire une capture sur le second caractère pour pouvoir le remettre (le $1).&lt;/p&gt;  &lt;p&gt;Dans le second cas, nous avons une assertion qui va lire le second caractère, mais n’en tient pas compte pour le motif. L’assertion qui s’écrit avec ?= permets de dire « je veux que mon apostrophe soit suivie d’un caractère alphanum, mais je ne veux QUE l’apostrophe ».&lt;/p&gt;  &lt;p&gt;Nous avons plusieurs types d’assertions :&lt;/p&gt;  &lt;p&gt;- Les assertions avant ou arrière (pour dire si on cherche quelque chose qui suit ou qui précède notre apostrophe)&lt;/p&gt;  &lt;p&gt;- Les assertions positives ou négatives (pour dire si on cherche un quelque chose qui suit, ou quelque chose qui ne doit pas être là. On utilisera par exemple une assertion négative si on veut toutes les apostrophes qui ne sont pas précédé d’un “=”)&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Syntaxe :     &lt;br /&gt;&lt;/b&gt;&lt;b&gt;Assertion avant positive&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (?=motif)     &lt;br /&gt;&lt;/b&gt;&lt;b&gt;Assertion avant negative&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (?!motif)     &lt;br /&gt;Assertion arrière positive&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (?&amp;lt;=motif)      &lt;br /&gt;&lt;/b&gt;&lt;b&gt;Assertion arrière négative&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (?&amp;lt;!motif) &lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Donc si je veux les apostrophes non précédées d’un =, je ferai ça :   &lt;br /&gt;Regex.Replace(texte, @&amp;quot;&lt;b&gt;(?&amp;lt;!=)'&lt;/b&gt;&amp;quot;, @&amp;quot;&lt;b&gt;&amp;amp;apos;&lt;/b&gt;&amp;quot;);&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-6800684000140576266?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/6800684000140576266/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=6800684000140576266' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/6800684000140576266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/6800684000140576266'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2011/01/les-assertions-dans-les-expressions.html' title='Les assertions dans les expressions régulières'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-5315501081629706040</id><published>2010-09-15T16:51:00.001+02:00</published><updated>2010-09-15T16:53:00.306+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><title type='text'>Découvrez le Speak-O-Matic sur Windows Phone 7</title><content type='html'>&lt;p&gt;Je vous avais déjà parlé le mois dernier de l’application faite par David Catuhe sur Windows Phone, &lt;a href="http://blog.adhess.net/2010/08/de-la-3d-sur-windows-phone-7.html"&gt;le fameux moteur 3D Nova4Phone&lt;/a&gt;, qui participe au concours Windows Phone sur Facebook.&lt;/p&gt;  &lt;p&gt;Et bien, aujourd’hui c’est moi qui me lance dans le concours, avec une application d’aide à la conversation : le Speak-O-Matic.&lt;/p&gt;  &lt;p&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/_1fIQLbpqRAw/TJDdfIaAuQI/AAAAAAAABzI/wJXv8nWme9g/image%5B5%5D.png?imgmax=800" width="831" height="457" /&gt; &lt;/p&gt;  &lt;p&gt;Le principe : le logiciel vous génère des phrases que vous pouvez replacer dans vos discussions, selon l’un des 4 thèmes :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Le parler creux, génère des phrases creuses pour les apprentis démagos et autres étudiants de sciencs-po.&lt;/li&gt;    &lt;li&gt;Ta mère : un générateur d’insultes, très utile dans les cités&lt;/li&gt;    &lt;li&gt;Le philosophe : générateur de proverbes, pleins de bon sens (au moins autant que les vrais)&lt;/li&gt;    &lt;li&gt;Le dragueur : l’indispensable pour séduire les filles&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Plus de détails en vidéo sur Facebook :   &lt;br /&gt;&lt;a title="http://www.facebook.com/video/video.php?v=430590738926&amp;amp;ref=mf" href="http://www.facebook.com/video/video.php?v=430590738926&amp;amp;ref=mf"&gt;http://www.facebook.com/video/video.php?v=430590738926&amp;amp;ref=mf&lt;/a&gt;    &lt;br /&gt;(notez le jeu d’acteur ;)&lt;/p&gt;  &lt;p&gt;Si vous aimez ma vidéo, que vous m’aimez moi, et que vous voulez me voir en finale, vous pouvez voter pour ma vidéo. Pour ce faire, c’est tout simple : devenez fan de la page &lt;a href="http://www.facebook.com/Developpeurs.net"&gt;Developpeurs&lt;/a&gt;, puis retourner voir ma vidéo et cliquez sur “J’aime”.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-5315501081629706040?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/5315501081629706040/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=5315501081629706040' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/5315501081629706040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/5315501081629706040'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2010/09/decouvrez-le-speak-o-matic-sur-windows.html' title='Découvrez le Speak-O-Matic sur Windows Phone 7'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_1fIQLbpqRAw/TJDdfIaAuQI/AAAAAAAABzI/wJXv8nWme9g/s72-c/image%5B5%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-8168985867569550574</id><published>2010-08-30T12:10:00.002+02:00</published><updated>2011-01-30T11:15:27.003+01:00</updated><title type='text'>10 vérités sur moi</title><content type='html'>&lt;p&gt;&lt;a href="http://www.catuhe.com/post/10-trucs-sur-ma-vie.aspx"&gt;Kosh&lt;/a&gt; a lancé il y a quelques temps un petit jeu pour les blogueurs : il faut dire 10 vérités sur soi, et demander à quelqu’un d’enchainer. Je pensais pouvoir éviter la corvée, jusqu’à ce que &lt;a href="http://blogs.developpeur.org/vko/archive/2010/08/26/10-trucs-sur-moi.aspx"&gt;Vko&lt;/a&gt; se souvienne de moi… Voilà donc 10 vérités totalement futiles et inintéressantes sur moi, profitez-en bien !&lt;/p&gt;  &lt;p&gt;- Je déteste parler de moi. L'écriture de ce billet va être pour moi une effroyable torture.&lt;/p&gt;  &lt;p&gt;- Mon nom de famille est "Lacasa". C'est un nom d'origine espagnole qui se prononce donc "lacassa", et non "lacaza". Il s'agit d'un nom très répandu en Aragon, région d'où étaient originaires mes grands parents, un chocolat très réputé porte d'ailleurs ce nom en Espagne.&lt;/p&gt;  &lt;p&gt;- Je n'aime pas WoW. J'évite en général de m'en vanter au bureau, mais c'est hélas vrai.&lt;/p&gt;  &lt;p&gt;- J'ai écris mes premières lignes de code en Turbo Pascal, alors que je venais de rentrer au collège. Lorsque j'ai eu des cours de programmation au lycée (en Turbo Pascal toujours), il m'est arrivé de donner la correction d'un exercice à la prof, sa version étant incorrecte. Elle ne m'a d'ailleurs jamais rendu ma disquette.&lt;/p&gt;  &lt;p&gt;- Même si j'aime à me faire passer pour un ariégeois, je n'ai réellement vécu à Pamiers que 10 mois. Mon accent vient en fait de Carcassonne, où j'ai passé toute mon enfance.  &lt;br /&gt;Il n'empêche que toute ma famille vit en Ariège, et que j'y passe régulièrement mes week-ends. &lt;/p&gt;  &lt;p&gt;- Je n'aime pas la bière. C'est quand même pas ma faute si c'est pas bon ! Et j'aimerais bien qu'on arrête de me prendre pour un extra-terrestre à chaque fois que je le dis...&lt;/p&gt;  &lt;p&gt;- Lorsque j'étais jeune, je voulais devenir PDG de Microsoft pour être aussi riche que Bill Gates. Ce projet n'est plus d'actualité, mais je ne désespère pas de devenir riche par d'autres moyens.&lt;/p&gt;  &lt;p&gt;- Je n'ai qu'un rein. Mais il est plus gros que la moyenne, donc je ne complexe pas. 23 ans plus tard, la cicatrice de l'opération de l'ablation du rein gauche est toujours visible sur mon ventre.&lt;/p&gt;  &lt;p&gt;- Je ne suis pas un grand amateur de musique... ça surprend souvent les gens, mais je n'achète pas de CD, et je n'ai pas de lecteur mp3. Je n'ai rien contre la musique, j'en écoute lorsque je suis avec d'autres personnes, mais globalement en bruit de fond je préfère entendre des gens qui parlent (des radios d'info en général).&lt;/p&gt;  &lt;p&gt;- Je suis bien content d'avoir fini de dire mes 10 trucs sur moi (si, si, c'est ça la 10ème vérité sur ma vie)&lt;/p&gt;  &lt;p&gt;Et maintenant, au tour de &lt;a href="http://blog.maneu.net/"&gt;Chris&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/5619051591853320584-8168985867569550574?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/8168985867569550574/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=8168985867569550574' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/8168985867569550574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/8168985867569550574'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2010/08/10-verites-sur-moi.html' title='10 vérités sur moi'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-8222916803725630769</id><published>2010-08-17T11:55:00.001+02:00</published><updated>2010-08-17T11:55:22.150+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><title type='text'>De la 3D sur Windows Phone 7</title><content type='html'>&lt;p&gt;Pour changer un peu du développement web, on peut aller voir ce qui se fait sur Windows Phone. &lt;/p&gt;  &lt;p&gt;Aujourd’hui, je vous propose de découvrir le moteur 3D fait par David Catuhe pour Windows Phone : c’est juste impressionnant. Pour voir la démo, ça se passe sur facebook : &lt;a title="http://www.facebook.com/video/video.php?v=1413141241316&amp;amp;oid=129459787073480" href="http://www.facebook.com/video/video.php?v=1413141241316&amp;amp;oid=129459787073480"&gt;http://www.facebook.com/video/video.php?v=1413141241316&amp;amp;oid=129459787073480&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;N’hésitez pas à “liker” la vidéo si vous aimez !&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-8222916803725630769?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/8222916803725630769/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=8222916803725630769' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/8222916803725630769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/8222916803725630769'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2010/08/de-la-3d-sur-windows-phone-7.html' title='De la 3D sur Windows Phone 7'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-405407762936343727</id><published>2010-08-17T11:45:00.001+02:00</published><updated>2010-08-17T11:45:36.711+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVC 2'/><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 : gestion dynamique des droits d’accès aux pages</title><content type='html'>&lt;p&gt;Si vous lisez mon blog régulièrement, vous avez du vous rendre compte qu’ASP.NET MVC n’est pas vraiment terrible, puisque je passe mon temps à refaire tout ce qu’il fait déjà. Je continue aujourd’hui avec la gestion des droits d’accès aux pages.&lt;/p&gt;  &lt;p&gt;ASP.NET MVC, tout comme les WebForms, se base sur les Membership providers pour la gestion des utilisateurs. Mais contrairement aux WebForms, on ne pourra pas utiliser le web.config pour définir quelles pages sont accessibles ; pour ça, MVC utilise les DataAnnotations sur les contrôleurs et les actions.    &lt;br /&gt;On va décorer nos contrôleurs (ou nos actions) avec un petit [Authorize] pour définir que l’utilisateur doit être logué pour accéder au contrôleur (ou à l’action).&lt;/p&gt;  &lt;p&gt;Pour donner les autorisations par utilisateur ou par rôle (groupes basés sur le Role Provider), on va pouvoir définir les utilisateurs et rôles autorisés.    &lt;br /&gt;En pratique, ça donnera quelque chose comme ça :&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; max-height: 200px; 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: #606060" id="lnum1"&gt;   1:&lt;/span&gt; [Authorize]&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;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ActionResult UserDetail()&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: #606060" id="lnum3"&gt;   3:&lt;/span&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: #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;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;     var userData = GetCurrentUserData();&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: #606060" id="lnum5"&gt;   5:&lt;/span&gt;&amp;#160; &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;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; View(userData);&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: #606060" id="lnum7"&gt;   7:&lt;/span&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: #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;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;&amp;#160; &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: #606060" id="lnum9"&gt;   9:&lt;/span&gt; [Authorize(Roles=&lt;span style="color: #006080"&gt;&amp;quot;Administrateurs&amp;quot;&lt;/span&gt;, Users=&lt;span style="color: #006080"&gt;&amp;quot;Guigui&amp;quot;&lt;/span&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: #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;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ActionResult Admin()&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: #606060" id="lnum11"&gt;  11:&lt;/span&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: #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;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; View();&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: #606060" id="lnum13"&gt;  13:&lt;/span&gt; }&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Voilà, c’est bien beau tout ça, mais comme j’ai dis en introduction, ça me suffit pas. Oui, je suis exigeant (qui a dit “chieur” ?), et moi ce que je veux, c’est pouvoir définir les droits dynamiquement. Par exemple, j’aurai dans ma base de données ma liste de contrôleurs, d’actions, et de rôles associés qui seraient autorisés à y accéder… et ça, ben je peux pas le faire avec le AuthorizeAttribute.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Qu’à celà ne tienne, je vais faire mon attribut à moi ! Et comme j’ai pas envie de tout refaire, je vais directement hériter du AuthorizeAttribute, et faire mes vérifications à la mimine. Pour les vérifications, j’aurai juste à redéfinir la méthode “AuthorizeCore” qui renverra true si l’utilisateur a accès, ou false s’il n’y a pas accès… Voilà le résultat :&lt;/p&gt;&lt;br /&gt;&lt;br /&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; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&lt;br /&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;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: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; MyDbAuthorizeAttribute : AuthorizeAttribute&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;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&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: #606060" id="lnum3"&gt;   3:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; AuthorizeCore(HttpContextBase httpContext)&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;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&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: #606060" id="lnum5"&gt;   5:&lt;/span&gt;         MvcHandler handler = httpContext.CurrentHandler &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; MvcHandler;&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;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;         RouteValueDictionary routeValues = handler.RequestContext.RouteData.Values;&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: #606060" id="lnum7"&gt;   7:&lt;/span&gt;&amp;#160; &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;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;         String controller = routeValues[&lt;span style="color: #006080"&gt;&amp;quot;controller&amp;quot;&lt;/span&gt;].ToString();&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: #606060" id="lnum9"&gt;   9:&lt;/span&gt;         String action = routeValues[&lt;span style="color: #006080"&gt;&amp;quot;action&amp;quot;&lt;/span&gt;].ToString();&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;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;         IPrincipal user = httpContext.User;&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: #606060" id="lnum11"&gt;  11:&lt;/span&gt;&amp;#160; &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;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; CheckAuthorization(user, controller, action);&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: #606060" id="lnum13"&gt;  13:&lt;/span&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: #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;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;&amp;#160; &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: #606060" id="lnum15"&gt;  15:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; CheckAuthorization(System.Security.Principal.IPrincipal iPrincipal, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; controller, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; action)&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;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&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: #606060" id="lnum17"&gt;  17:&lt;/span&gt;         &lt;span style="color: #008000"&gt;// Ici je vais pouvoir interroger ma base de données&lt;/span&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: #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;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;true&lt;/span&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: #606060" id="lnum19"&gt;  19:&lt;/span&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: #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;span style="color: #606060" id="lnum20"&gt;  20:&lt;/span&gt; }&lt;/pre&gt;&lt;br /&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Une fois qu’on a définit notre attribut, on n’a plus qu’à taguer tous nos contrôleurs avec un [MyDbAuthorize] pour que la vérification des droits se fasse dans notre méthode de vérification.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-405407762936343727?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/405407762936343727/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=405407762936343727' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/405407762936343727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/405407762936343727'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2010/08/aspnet-mvc-gestion-dynamique-des-droits.html' title='ASP.NET MVC : gestion dynamique des droits d’accès aux pages'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-5532596519218780723</id><published>2010-06-07T12:34:00.001+02:00</published><updated>2010-06-07T12:39:11.033+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><title type='text'>ASP.NET MVC : Actions avec des listes en paramètres</title><content type='html'>&lt;p&gt;Y’a rien à faire, j’arrive pas à m’y habituer… Je suis à chaque fois épaté de voir avec quelle facilité MVC gère les paramètres dans les contrôleurs. Après &lt;a href="http://blog.adhess.net/2010/01/upload-de-fichiers-avec-aspnet-mvc.html"&gt;l’envoi de fichiers&lt;/a&gt;, je me suis demandé comment cette fois récupérer une liste dans mon modèle.&lt;/p&gt;  &lt;p&gt;La première pensée que j’ai eue était “non, ça doit pas être possible”. La seconde “non, voyons, ou alors les mecs qui ont fait MVC c’est des Dieux”. Puis à la 3ème, qui était “il me semble qu’en PHP on peut, si en MVC on peut pas c’est la honte quand même”, je me suis décidé à effectuer quelques tests. Et je n’ai pas été déçu, puisqu’effectivement, c’est tout à fait possible de binder directement les paramètres à une liste.&lt;/p&gt;  &lt;p&gt;Pour cela, c’est très simple : on définit notre action avec un paramètre de type liste (ou un tableau, ça marche aussi)&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: #dcdcdc; white-space: nowrap; overflow: scroll"&gt;&lt;font face=" Consolas"&gt;&lt;font size="1"&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;ActionResult&lt;/font&gt;&lt;font color="#000000"&gt; ActionQuiVeutUneListe(&lt;/font&gt;&lt;font color="#2b91af"&gt;List&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#2b91af"&gt;String&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt; laListe)         &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;et on peut appeler la page en lui passant plusieurs paramètres du même nom ; chacun des paramètres sera un des élément de la liste.    &lt;br /&gt;L’URL sera du type: &lt;font color="#400000"&gt;/Home/ActionQuiVeutUneListe?laListe=elmt1&amp;amp;laListe=elmt2&amp;amp;laListe=elmt3&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;En plus de ça, on a aussi la possibilité d’ordonner les éléments de la liste en mettant leur position entre crochets. La numérotation doit se faire de 0 au nombre d’éléments, s’il y a un trou dans le compte les éléments suivants ne seront pas pris.&lt;/p&gt;  &lt;p&gt;&lt;font color="#400000"&gt;/Home/ActionQuiVeutUneListe?laListe[2]=elmtC&amp;amp;laListe[0]=elmtA&amp;amp;laListe[1]=elmtB&lt;/font&gt;     &lt;br /&gt;En tapant cette URL, on aura les éléments dans l’ordre : “elmtA”, “elmtB”, “elmtC”.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1fIQLbpqRAw/TAzMSji8xBI/AAAAAAAAByo/fS7p9jYiBtA/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://lh3.ggpht.com/_1fIQLbpqRAw/TAzMTWqRKdI/AAAAAAAABys/VIpduzDV2gc/image_thumb%5B2%5D.png?imgmax=800" width="685" height="198" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Maintenant, il ne vous reste plus qu’à faire vos liens vers cette page. Pour cela, comme d’habitude, deux façons de faire :&lt;/p&gt;  &lt;p&gt;Si vous êtes dans un formulaire, pas de soucis, il suffit de faire plusieurs input avec le même nom (ou en mettant l’index entre crochets dans les noms).    &lt;br /&gt;Par contre, si vous voulez faire un simple lien, vous ne pourrez pas utiliser les Html Helper, il vous faudra construire le lien à la main ou bien faire votre propre Helper (à moins que j’aie mal regardé leur fonctionnement, si quelqu’un a des infos je suis à votre écoute)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-5532596519218780723?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/5532596519218780723/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=5532596519218780723' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/5532596519218780723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/5532596519218780723'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2010/06/aspnet-mvc-actions-avec-des-listes-en.html' title='ASP.NET MVC : Actions avec des listes en paramètres'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_1fIQLbpqRAw/TAzMTWqRKdI/AAAAAAAABys/VIpduzDV2gc/s72-c/image_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-3028937324176227198</id><published>2010-06-02T10:28:00.001+02:00</published><updated>2010-06-02T14:49:05.641+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><title type='text'>Non, ASP.NET n’ajoute pas de fonctionnalités aux navigateurs</title><content type='html'>&lt;p&gt;On m’a récemment posé la question suivante : “est-ce qu’il est possible en asp.net de faire une liste de choix éditable ?” (si vous avez lu le titre du post, vous vous doutez déjà de la réponse, mais je vais quand même expliquer un peu)&lt;/p&gt;  &lt;p&gt;Quand je me pose une question comme ça, j’ai plusieurs réflexes :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Regarder si il existe une propriété dans ma DropDownList dont le nom ressemble à ce que je veux faire. Si les noms ne sont pas suffisamment explicites, on peut toujours faire un petit tour sur &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.dropdownlist_members.aspx"&gt;msdn&lt;/a&gt;… &lt;/li&gt;    &lt;li&gt;Faire une recherche Google (j’y reviendrai) &lt;/li&gt;    &lt;li&gt;Réfléchir au html qu’on veut voir générer. Si ça ne se fait pas tout seul, il va bien falloir trouver comment le faire nous même. Certains oublient parfois que ce qu’asp.net génère sera affiché dans des navigateurs webs (et pas seulement Internet Explorer, quoi qu’en disent certaines mauvaises langues) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Et c’est là tout le problème : le contrôle DropDownList en asp.net va générer une balise &amp;lt;select&amp;gt; en html… Et cette balise en html n’est pas éditable, quelles que soient les options qu’on y mette dedans ; pas besoin d’être un spécialiste asp.net pour en arriver à cette conclusion. Cette option n’est pas possible en html, asp.net ne peut pas l’inventer.&lt;/p&gt;  &lt;p&gt;Et donc, n’y a-t-il pas de solution ? Bien sûr que si, comme avec n’importe quel autre langage serveur qui ne propose pas cette option : faire du JavaScript.    &lt;br /&gt;Il existe énormément de possibilité pour avoir un comportement similaire, et de toute façon d’autres personnes l’ont déjà fait avant : &lt;a href="http://www.google.fr/search?hl=fr&amp;amp;source=hp&amp;amp;q=html+editable+select&amp;amp;aq=0&amp;amp;aqi=g1&amp;amp;aql=&amp;amp;oq=html+editable+sel&amp;amp;gs_rfai="&gt;une recherche Google&lt;/a&gt; vous donnera plusieurs codes touts faits.     &lt;br /&gt;Peut-être même qu’en cherchant un peu plus quelqu’un a écrit un contrôle serveur asp.net qui fera tout le javascript pour vous (après c’est selon vos préférences, à vous de voir si la perte de temps dans la recherche de la solution miracle est nécessaire, ou bien si vos yeux pourront supporter de voir quelques lignes de JavaScript).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-3028937324176227198?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/3028937324176227198/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=3028937324176227198' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/3028937324176227198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/3028937324176227198'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2010/06/non-aspnet-najoute-pas-de.html' title='Non, ASP.NET n’ajoute pas de fonctionnalités aux navigateurs'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-5090637451742135602</id><published>2010-06-01T12:49:00.001+02:00</published><updated>2010-06-01T12:49:53.672+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BDC'/><category scheme='http://www.blogger.com/atom/ns#' term='Bewise'/><title type='text'>La Bewise Day Conference : quand y’en a plus, y’en a encore !</title><content type='html'>&lt;p&gt;Avis à la population : Bewise vient d’ouvrir son site “After BDC”, où vous pourrez trouver les photos de l’évènement, ainsi que des slides et démos des différentes sessions et ATE.&lt;/p&gt;  &lt;p&gt;Le contenu se remplira petit à petit au fil des semaines, soyez à l’écoute ! &lt;/p&gt;  &lt;p&gt;L’adresse ? c’est par là : &lt;a title="http://afterbdc.bewise.fr/" href="http://afterbdc.bewise.fr/"&gt;http://afterbdc.bewise.fr/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Notez aussi que si vous utilisez Twitter, vous pouvez suivre le flux de l’after BDC par ici : &lt;a title="http://twitter.com/afterbdc" href="http://twitter.com/afterbdc"&gt;http://twitter.com/afterbdc&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/5619051591853320584-5090637451742135602?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/5090637451742135602/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=5090637451742135602' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/5090637451742135602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/5090637451742135602'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2010/06/la-bewise-day-conference-quand-yen-plus.html' title='La Bewise Day Conference : quand y’en a plus, y’en a encore !'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-7341620196544335462</id><published>2010-05-10T17:54:00.001+02:00</published><updated>2010-05-10T18:00:37.406+02:00</updated><title type='text'>La librairie Microsoft Ajax abandonnée, au profit de jQuery</title><content type='html'>&lt;p&gt;Vous vous souvenez de la librairie Microsoft Ajax ? J’en avais parlé l’an dernier lors de la Bewise Day Conference (et aussi dans &lt;a href="http://blog.adhess.net/2009/04/bdc-2009-aspnet-40-javascript.html"&gt;un post&lt;/a&gt; quelques temps après). Pour mémoire, il s’agissait d’une librairie pur JavaScript qui proposait notamment un repeater et du databinding en JavaScript, qui n’est jamais sorti du stade de la beta (voire même preview, je me souviens plus très bien)&lt;/p&gt;&lt;p&gt;Eh bien j’ai été surpris en voyant Scott Guthrie nous parler &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/05/07/jquery-templates-and-data-linking-and-microsoft-contributing-to-jquery.aspx"&gt;des contributions de Microsoft à jQuery&lt;/a&gt;. Au programme : templates clients et data binding (renommés data linking pour l’occasion, jQuery ayant déjà une fonction nommée “bind”), des fonctionnalités déjà présentes dans la librairie de Microsoft. J’ai donc eu un petit doute : cette librairie ne devait-elle pas être fournie avec le framework 4 ? Pourquoi n’est-elle pas dans Visual Studio 2010 alors qu’elle était dans les beta ? Une vérification sur la page &lt;a href="http://aspnet.codeplex.com"&gt;codeplex d’asp.net&lt;/a&gt; m’a confirmé ce que je pensais : plus la moindre trace de cette librairie.&lt;/p&gt;&lt;p&gt;C’est donc jQuery qui va hériter de ces fonctionnalités plus qu’intéressantes, et finalement, c’est loin d’être une mauvaise nouvelle : même si les 2 librairies cohabitaient très bien, on n’aura finalement besoin de connaitre qu’une seule librairie, plus de risque de se perdre avec les syntaxes différentes utilisées par jQuery et MS Ajax. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;jQuery Templates&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Au programme donc, nous avons les templates : une version JavaScript des repeaters.   &lt;br /&gt;Comment ça fonctionne ? Eh bien de la manière suivante :   &lt;br /&gt;Il nous faut définir un template (ici dans la balise script, afin de ne pas l’afficher tel quel dans la page), et un container dans lequel jQuery injectera le html généré depuis le template :&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; max-height: 200px; 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: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;div&lt;/span&gt; &lt;span style="color: #ff0000"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;contactContainer&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&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;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&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: #606060" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;script&lt;/span&gt; &lt;span style="color: #ff0000"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;contactTemplate&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;text/html&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&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;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&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: #606060" id="lnum5"&gt;   5:&lt;/span&gt;     Name: {{= name }}&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;br&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&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;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;     Phone: {{= phone }}&lt;/pre&gt;&lt;!--CRLF--&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: #606060" id="lnum7"&gt;   7:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&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;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Une fois le template défini, on va lui associer nos données, par exemple un tableau JavaScript dans notre exemple, mais il pourrait être intéressant de l’associer au résultat d’un appel Ajax, par exemple.&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; max-height: 200px; 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: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &amp;lt;script type=&lt;span style="color: #006080"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;!--CRLF--&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;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; contacts = [&lt;/pre&gt;&lt;!--CRLF--&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: #606060" id="lnum3"&gt;   3:&lt;/span&gt;         { name: &lt;span style="color: #006080"&gt;&amp;quot;Scott Guthrie&amp;quot;&lt;/span&gt;, phone: &lt;span style="color: #006080"&gt;&amp;quot;415-555-2222&amp;quot;&lt;/span&gt; },&lt;/pre&gt;&lt;!--CRLF--&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;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;         { name: &lt;span style="color: #006080"&gt;&amp;quot;Guillaume Lacasa&amp;quot;&lt;/span&gt;, phone: &lt;span style="color: #006080"&gt;&amp;quot;05 11 22 33 44&amp;quot;&lt;/span&gt; }&lt;/pre&gt;&lt;!--CRLF--&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: #606060" id="lnum5"&gt;   5:&lt;/span&gt;     ];&lt;/pre&gt;&lt;!--CRLF--&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;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;!--CRLF--&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: #606060" id="lnum7"&gt;   7:&lt;/span&gt;     $(&lt;span style="color: #006080"&gt;&amp;quot;#contactTemplate&amp;quot;&lt;/span&gt;).render(contacts).appendTo(&lt;span style="color: #006080"&gt;&amp;quot;#contactContainer&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;!--CRLF--&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;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt; &amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Data-linking&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Seconde nouveauté, le data-linking. L’idée est de lier une propriété d’un objet avec une propriété d’un autre objet : quand on en modifie un, l’autre est modifié automatiquement. Pas de code pour cette fonctionnalité, mais vous pouvez retrouver un exemple d’utilisation sur &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/05/07/jquery-templates-and-data-linking-and-microsoft-contributing-to-jquery.aspx"&gt;le blog de maître Gu&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Je reviendrai plus en détail sur chacune de ces fonctionnalités, qui offrent des possibilités plus poussées que le peu que j’ai exploré à ce jour : boucles, conditions, linking mono et bi-directionnel, et combinaisons du linking avec les templates. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-7341620196544335462?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/7341620196544335462/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=7341620196544335462' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/7341620196544335462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/7341620196544335462'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2010/05/la-librairie-microsoft-ajax-abandonnee.html' title='La librairie Microsoft Ajax abandonnée, au profit de jQuery'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-676717905403716923</id><published>2010-05-04T14:34:00.001+02:00</published><updated>2010-05-04T14:34:49.066+02:00</updated><title type='text'>Bewise recrute un admin système et réseaux</title><content type='html'>&lt;p&gt;Et oui, Bewise recrute encore. Tu aimes Exchange ? Tu maitrises Active Directory ? La nuit, tu rêves de trames IP ? Et tu as envie de travailler à Toulouse, la ville où il fait toujours beau (ou presque…) ? Alors lis les détails de l’annonce :&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;&lt;b&gt;&lt;i&gt;Bewise,&lt;/i&gt;&lt;/b&gt;&lt;i&gt; basée à Toulouse&lt;b&gt;,&lt;/b&gt; est spécialisée sur les technologies Microsoft. Nous sommes donc aujourd'hui fortement engagés sur l'ensemble des technologies Microsoft (plate-forme .NET, plate-forme applicative, serveurs, etc.). &lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;Nous recherchons actuellement un &lt;b&gt;&lt;u&gt;Administrateur Système et Réseaux h/f&lt;/u&gt;&lt;/b&gt;.&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;Rattaché au Directeur Technique, vous aurez la gestion complète et autonome de l'infrastructure technique de Bewise.&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;i&gt;&lt;u&gt;Vos missions : &lt;/u&gt;&lt;/i&gt;&lt;/b&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;i&gt;Garantir le bon fonctionnement du système d'information et le niveau de service attendu&lt;/i&gt;&lt;i&gt;&lt;/i&gt; &lt;/li&gt;    &lt;li&gt;&lt;i&gt;Assister les utilisateurs et les consultants&lt;/i&gt;&lt;i&gt;&lt;/i&gt; &lt;/li&gt;    &lt;li&gt;&lt;i&gt;Gérer le parc de téléphonie mobile et fixe&lt;/i&gt;&lt;i&gt;&lt;/i&gt; &lt;/li&gt;    &lt;li&gt;&lt;i&gt;Gérer la salle de formation&lt;/i&gt;&lt;i&gt;&lt;/i&gt; &lt;/li&gt;    &lt;li&gt;&lt;i&gt;Mettre en œuvre les produits serveurs du catalogue de Microsoft&lt;/i&gt;&lt;i&gt;&lt;/i&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;i&gt;Vous êtes autonome, rigoureux, organisé et passionné par la technologie.&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;Vous avez 1 an d'expérience sur les systèmes Microsoft.&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;Vous avez une bonne connaissance des technologies suivantes:&lt;/i&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;b&gt;&lt;i&gt;Windows 2008 &lt;/i&gt;&lt;/b&gt;&lt;i&gt;&lt;/i&gt;&lt;/li&gt;    &lt;li&gt;&lt;b&gt;&lt;i&gt;Active Directory&lt;/i&gt;&lt;/b&gt;&lt;i&gt;&lt;/i&gt; &lt;/li&gt;    &lt;li&gt;&lt;b&gt;&lt;i&gt;Exchange&lt;/i&gt;&lt;/b&gt;&lt;i&gt;&lt;/i&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;i&gt;La connaissance d'autres produits du catalogue Microsoft serait un plus.&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;Rémunération selon profil.&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.bewise.fr/fr-FR/presentation/Pages/Administrateur-Système-Réseaux.aspx" href="http://www.bewise.fr/fr-FR/presentation/Pages/Administrateur-Syst&amp;egrave;me-R&amp;eacute;seaux.aspx"&gt;http://www.bewise.fr/fr-FR/presentation/Pages/Administrateur-Système-Réseaux.aspx&lt;/a&gt;&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;Bewise recrute aussi des consultants .NET, Sharepoint et BI, sur Toulouse et Aix-en-Provence : &lt;a title="http://www.bewise.fr/fr-FR/presentation/Pages/jobs.aspx" href="http://www.bewise.fr/fr-FR/presentation/Pages/jobs.aspx"&gt;http://www.bewise.fr/fr-FR/presentation/Pages/jobs.aspx&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/5619051591853320584-676717905403716923?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/676717905403716923/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=676717905403716923' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/676717905403716923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/676717905403716923'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2010/05/bewise-recrute-un-admin-systeme-et.html' title='Bewise recrute un admin système et réseaux'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-4896616133489704286</id><published>2010-04-29T10:53:00.001+02:00</published><updated>2010-04-29T14:05:38.040+02:00</updated><title type='text'>La BDC était trop courte ? Elle revient à Aix le 18 mai !</title><content type='html'>&lt;p&gt;Vous êtes nombreux à avoir apprécié la Bewise Day Conference le 1er avril dernier… Mais certains d’entre vous n’ont peut-être pas pu venir, ou ont peut-être envie d’y retourner.&lt;/p&gt;  &lt;p&gt;Eh bien pas de problème, la BDC est de retour, l’équipe de Bewise Sud-Est vous accueillera au &lt;a href="http://www.casinoaix.com/"&gt;Pasino d’Aix en Provence&lt;/a&gt; pour une BDC au son des cigales.&lt;/p&gt;  &lt;p&gt;Plus d’informations et inscriptions sur le site de &lt;a href="http://bse.bewise.fr/BDC2010/?f=af7fc6f4-f8f6-4a54-b489-d414ae555d2e"&gt;la Bewise Day Conference d’Aix en Provence&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/5619051591853320584-4896616133489704286?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/4896616133489704286/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=4896616133489704286' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/4896616133489704286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/4896616133489704286'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2010/04/la-bdc-etait-trop-courte-elle-revient.html' title='La BDC était trop courte ? Elle revient à Aix le 18 mai !'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-8592735363568315667</id><published>2010-03-31T13:47:00.001+02:00</published><updated>2010-03-31T13:47:37.383+02:00</updated><title type='text'>Au fait, j’avais pas quelque chose de prévu pour demain moi ?</title><content type='html'>&lt;p&gt;Et oui, demain c’est le premier avril. Comme chaque année vous allez pouvoir vous amuser à accrocher des poissons aux dos de vos amis, et éplucher les informations pour trouver les plus improbables… Mais cette année, Bewise vous propose encore mieux !&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://lh3.ggpht.com/_1fIQLbpqRAw/S7M2VvuBkbI/AAAAAAAAByg/AJ-fIUPBnkQ/s1600-h/IMAGE_303%5B2%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="IMAGE_303" border="0" alt="IMAGE_303" src="http://lh5.ggpht.com/_1fIQLbpqRAw/S7M2WBepHsI/AAAAAAAAByk/zZ5BSRnr69U/IMAGE_303_thumb.jpg?imgmax=800" width="184" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Et oui, &lt;a href="http://bdc2010.bewise.fr/?f=A56BC4FC-9B40-4e60-A8D5-B188D54819BC"&gt;la Bewise Day Conference&lt;/a&gt; est de retour dès demain, avec tout plein de technos, du développement, de l’IT, et des tables Surface !&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-8592735363568315667?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/8592735363568315667/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=8592735363568315667' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/8592735363568315667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/8592735363568315667'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2010/03/au-fait-javais-pas-quelque-chose-de.html' title='Au fait, j’avais pas quelque chose de prévu pour demain moi ?'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_1fIQLbpqRAw/S7M2WBepHsI/AAAAAAAAByk/zZ5BSRnr69U/s72-c/IMAGE_303_thumb.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-4618716879920034760</id><published>2010-03-26T13:38:00.002+01:00</published><updated>2010-03-27T14:54:00.006+01:00</updated><title type='text'>[BDC2010] Venez rencontrer Hyper D, notre super héros admin réseau</title><content type='html'>&lt;p&gt;Cher ami, lecteur assidu de mon blog, tu sais déjà que la &lt;a href="http://bdc2010.bewise.fr/?f=A56BC4FC-9B40-4e60-A8D5-B188D54819BC"&gt;Bewise Day Conference&lt;/a&gt; aura lieu le 1er avril prochain à Toulouse… Mais malheureusement, pour une raison qui m’échappe, tu ne t’es peut-être pas encore inscrit.&lt;/p&gt;  &lt;p&gt;C’est vraiment dommage, puisque la BDC sera pour toi une occasion unique de rencontrer Hyper D, notre super héros admin réseau ! Voici un petit aperçu de ses pouvoirs :&lt;/p&gt; &lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/KPecQKsvpF8&amp;amp;hl=fr_FR&amp;amp;fs=1&amp;amp;rel=0"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/KPecQKsvpF8&amp;amp;hl=fr_FR&amp;amp;fs=1&amp;amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;  &lt;p&gt;Si tu veux savoir comment notre admin réseau arrive faire plusieurs choses à la fois, viens découvrir la virtualisation avec Hyper-V à &lt;a href="http://bdc2010.bewise.fr/?f=A56BC4FC-9B40-4e60-A8D5-B188D54819BC"&gt;la BDC 2010&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/5619051591853320584-4618716879920034760?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/4618716879920034760/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=4618716879920034760' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/4618716879920034760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/4618716879920034760'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2010/03/bdc2010-venez-rencontrer-hyper-d-notre.html' title='[BDC2010] Venez rencontrer Hyper D, notre super héros admin réseau'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-633486956248139696</id><published>2010-03-17T12:14:00.001+01:00</published><updated>2010-03-17T12:26:08.340+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><title type='text'>La manière propre de faire des roll-over en html/css</title><content type='html'>&lt;p&gt;Aujourd’hui, on va faire du html, et du css. Pas d’asp, pas de JavaScript, on fait du web pur et dur. Je vous propose de faire un effet de roll-over sur une image.&lt;/p&gt;  &lt;p&gt;Alors je vous entend tous râler, comme quoi c’est trop simple, qu’on a 10000 codes sources qui fonctionnent sur Google, et que je vous avais habitué à mieux. Certes, on a des codes sources qui fonctionnent, mais ils ne sont pas toujours très propres… Comme j’ai dis en introduction, on va faire ici un roll-over uniquement avec du css, pas de javascript. Et petit bonus, ma technique va éviter un problème qu’on rencontre souvent sur des images en roll-over : pas besoin d’attendre que la souris passe sur l’image pour charger la seconde image.&lt;/p&gt;  &lt;p&gt;Mais fini de papoter, voyons comment faire :&lt;/p&gt;  &lt;p&gt;Pour commencer, il me faut mes deux images : celle affichée normalement, et celle affichée lorsque la souris passera dessus. Et attention, c’est là qu’est toute l’astuce, on va mettre le 2 dans un seul fichier image, comme ça :&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="rollover" border="0" alt="rollover" src="http://lh5.ggpht.com/_1fIQLbpqRAw/S6C5oKzkR6I/AAAAAAAAByc/yVvuI4eIU90/rollover%5B9%5D.png?imgmax=800" width="80" height="100" /&gt; &lt;/p&gt;  &lt;p&gt;(je n’accepterai aucune remarque sur le bon goût de mes images, et je rappelle que je n’ai jamais prétendu être designer ;)&lt;/p&gt;  &lt;p&gt;Maintenant, on va afficher ça dans notre page. D’un point de vue HTML, on va tout simplement faire un lien (pas de balise &amp;lt;img&amp;gt; ici) :&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: #dcdcdc; white-space: nowrap; overflow: scroll"&gt;&lt;font face=" Courier New"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#a31515"&gt;a&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#ff0000"&gt;class&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;rolloverLink&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#ff0000"&gt;href&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;journuit.html&amp;quot;&amp;gt;          &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; aller vers la page jour / nuit&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#a31515"&gt;a&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/font&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Et on va afficher notre image à l’aide de CSS. Pour ça, on a plusieurs étapes :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Faire passer le lien en affichage de type block, et définir sa taille de manière à n’afficher que la moitié de notre fichier image. &lt;/li&gt;    &lt;li&gt;Mettre l’image en fond, et l’aligner en haut. &lt;/li&gt;    &lt;li&gt;Sur le hover, changer l’alignement pour qu’on voie l’autre moitié de l’image. &lt;/li&gt;    &lt;li&gt;Et pour ne pas qu’on voie le texte, on va le décaler loin en dehors de la page. Notez qu’il est tout de même important de laisser un texte pour des raisons d’accessibilité (pensez aux mal-voyants qui utilisent des navigateurs spécifiques) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;On a donc notre CSS :&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: #dcdcdc; white-space: nowrap; overflow: scroll"&gt;&lt;font face=" Courier New"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;font color="#a31515"&gt;a.rolloverLink&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160; &lt;br /&gt;{           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#ff0000"&gt;text-indent&lt;/font&gt;&lt;font color="#000000"&gt;:&lt;/font&gt;&lt;font color="#0000ff"&gt;-10000px&lt;/font&gt;&lt;font color="#000000"&gt;;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#ff0000"&gt;display&lt;/font&gt;&lt;font color="#000000"&gt;:&lt;/font&gt;&lt;font color="#0000ff"&gt;block&lt;/font&gt;&lt;font color="#000000"&gt;;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#ff0000"&gt;width&lt;/font&gt;&lt;font color="#000000"&gt;:&lt;/font&gt;&lt;font color="#0000ff"&gt;80px&lt;/font&gt;&lt;font color="#000000"&gt;;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#ff0000"&gt;height&lt;/font&gt;&lt;font color="#000000"&gt;:&lt;/font&gt;&lt;font color="#0000ff"&gt;50px&lt;/font&gt;&lt;font color="#000000"&gt;;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#ff0000"&gt;background-image&lt;/font&gt;&lt;font color="#000000"&gt;:&lt;/font&gt;&lt;font color="#0000ff"&gt;url('rollover.png')&lt;/font&gt;&lt;font color="#000000"&gt;;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#ff0000"&gt;background-position&lt;/font&gt;&lt;font color="#000000"&gt;:&lt;/font&gt;&lt;font color="#0000ff"&gt;top&lt;/font&gt;&lt;font color="#000000"&gt;;          &lt;br /&gt;}           &lt;br /&gt;          &lt;br /&gt;&lt;/font&gt;&lt;font color="#a31515"&gt;a.rolloverLink:hover          &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;{          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#ff0000"&gt;background-position&lt;/font&gt;&lt;font color="#000000"&gt;: &lt;/font&gt;&lt;font color="#0000ff"&gt;bottom&lt;/font&gt;&lt;font color="#000000"&gt;;          &lt;br /&gt;}&lt;/font&gt;&lt;/font&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Ce qui nous donne le résultat suivant :&lt;/p&gt;  &lt;p align="center"&gt;&lt;a class="rolloverLink" href="javascript:void(0)"&gt;aller vers la page jour / nuit&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Un grand merci à Jocelyn, responsable du domaine métier SWA (Solutions Web Avancées) chez Bewise, pour l’astuce ! &lt;/p&gt;  &lt;p&gt;Au passage, je vous rappelle que vous pourrez nous retrouver tous les deux, ainsi que toute l’équipe de Bewise et de Vertice, le 1er avril prochain lors de &lt;a href="http://bdc2010.bewise.fr/?f=A56BC4FC-9B40-4e60-A8D5-B188D54819BC"&gt;la Bewise Day Conference&lt;/a&gt;. N’hésitez pas à vous inscrire.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-633486956248139696?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/633486956248139696/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=633486956248139696' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/633486956248139696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/633486956248139696'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2010/03/la-maniere-propre-de-faire-des-roll.html' title='La manière propre de faire des roll-over en html/css'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_1fIQLbpqRAw/S6C5oKzkR6I/AAAAAAAAByc/yVvuI4eIU90/s72-c/rollover%5B9%5D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-7802525142989137278</id><published>2010-03-03T12:22:00.001+01:00</published><updated>2010-03-03T12:22:15.250+01:00</updated><title type='text'>En avant pour la Bewise Day Conference 2010 !</title><content type='html'>&lt;p&gt;A la demande générale, la Bewise Day Conference est de retour pour une 4ème édition ! Encore une fois, venez découvrir ce qui se fait de mieux dans les technologies Microsoft.&lt;/p&gt;  &lt;p&gt;Cette année, beaucoup de nouveautés, puisque Microsoft lance la gamme 2010 de ses produits, notamment Visual Studio, Sharepoint, mais lance aussi la version 4 de son framework .net, MVC 2, Azure, et bien d’autres choses.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://bdc2010.bewise.fr?f=A56BC4FC-9B40-4e60-A8D5-B188D54819BC"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" border="0" alt="BDC 2009" src="http://www.bewise.fr/fr-FR/PublishingImages/anim_bdc%202010.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Je vous donne donc rendez-vous au stade Ernest Wallon, pour vous présenter ASP.NET, dans sa version 4, ainsi que ASP.NET MVC, et jQuery. &lt;/p&gt;  &lt;p&gt;Pour les inscriptions, rendez-vous sur &lt;a href="http://bdc2010.bewise.fr?f=A56BC4FC-9B40-4e60-A8D5-B188D54819BC"&gt;le site officiel de la BDC 2010&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/5619051591853320584-7802525142989137278?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/7802525142989137278/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=7802525142989137278' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/7802525142989137278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/7802525142989137278'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2010/03/en-avant-pour-la-bewise-day-conference.html' title='En avant pour la Bewise Day Conference 2010 !'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-7814178453934938348</id><published>2010-01-28T14:31:00.001+01:00</published><updated>2010-02-03T17:59:26.107+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><title type='text'>Upload de fichiers avec ASP.NET MVC</title><content type='html'>&lt;p&gt;Pour envoyer des fichiers avec ASP.NET MVC, c’est pas compliqué, mais encore faut-il savoir comment faire. Si en ASP.NET WebForm on a un contrôle qui le fait, avec MVC, on commence à en avoir l’habitude, il va falloir le faire à la pougne.&lt;/p&gt;  &lt;p&gt;On arrête de râler, les assistés, c’est pas plus compliqué qu’avant !&lt;/p&gt;  &lt;p&gt;Pour envoyer un fichier, on va utiliser l’élément HTML Input, de type “file”. On le mets dans notre formulaire, et on envoie. Attention, pour que ça fonctionne, il va falloir ajouter un attribut à notre formulaire : enctype=&amp;quot;multipart/form-data&amp;quot;. Scott Hanselman nous explique pourquoi sur &lt;a href="http://www.hanselman.com/blog/CommentView.aspx?guid=bc137b6b-d8d0-47d1-9795-f8814f7d1903"&gt;son blog&lt;/a&gt;.&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: #dcdcdc; white-space: nowrap; overflow: scroll"&gt;&lt;font face=" Courier New"&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;% &lt;/font&gt;&lt;font color="#0000ff"&gt;using&lt;/font&gt;&lt;font color="#000000"&gt; (Html.BeginForm(&lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;SendFile&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;, &lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;Home&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;, &lt;/font&gt;&lt;font color="#2b91af"&gt;FormMethod&lt;/font&gt;&lt;font color="#000000"&gt;.Post, &lt;/font&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;font color="#000000"&gt; { enctype = &lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;multipart/form-data&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt; }))          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { %&amp;gt;           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#a31515"&gt;input&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#ff0000"&gt;type&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;file&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#ff0000"&gt;name&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;fileSent&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;          &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#a31515"&gt;input&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#ff0000"&gt;type&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;submit&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#ff0000"&gt;value&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;Send&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;          &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;% } %&amp;gt; &lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Ensuite, lorsqu’on va poster notre formulaire, le fichier sera directement accessible dans notre Request :&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: #dcdcdc; white-space: nowrap; overflow: scroll"&gt;&lt;font face=" Courier New"&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160; [&lt;/font&gt;&lt;font color="#2b91af"&gt;AcceptVerbs&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2b91af"&gt;HttpVerbs&lt;/font&gt;&lt;font color="#000000"&gt;.Post)]          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;ActionResult&lt;/font&gt;&lt;font color="#000000"&gt; SendFile()          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#2b91af"&gt;HttpPostedFileBase&lt;/font&gt;&lt;font color="#000000"&gt; file = Request.Files[&lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;fileSent&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;];          &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#008000"&gt;//TODO : Gerer le fichier&amp;#160; &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; file.SaveAs(filePath);          &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;font color="#000000"&gt; View();          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Et parce que c’est de l’ASP.NET MVC, et qu’ASP.NET MVC ça poutre, on a même une solution encore plus simple ! Il suffit de le mettre en paramètre de notre action (n’oubliez pas que le nom du paramètre doit correspondre au “name” du input)&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: #dcdcdc; white-space: nowrap; overflow: scroll"&gt;&lt;font face=" Courier New"&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160; [&lt;/font&gt;&lt;font color="#2b91af"&gt;AcceptVerbs&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2b91af"&gt;HttpVerbs&lt;/font&gt;&lt;font color="#000000"&gt;.Post)]          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;ActionResult&lt;/font&gt;&lt;font color="#000000"&gt; SendFile(&lt;/font&gt;&lt;font color="#2b91af"&gt;HttpPostedFileBase&lt;/font&gt;&lt;font color="#000000"&gt; fileSent)          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#008000"&gt;//TODO : Gerer le fichier&amp;#160; &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fileSent.SaveAs(filePath);          &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;font color="#000000"&gt; View();          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt; &lt;/div&gt; &lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-7814178453934938348?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/7814178453934938348/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=7814178453934938348' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/7814178453934938348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/7814178453934938348'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2010/01/upload-de-fichiers-avec-aspnet-mvc.html' title='Upload de fichiers avec ASP.NET MVC'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-3135430140435538927</id><published>2009-12-15T17:13:00.001+01:00</published><updated>2009-12-15T19:55:26.034+01:00</updated><title type='text'>Optimisation du référencement avec le SEO Toolkit</title><content type='html'>&lt;p&gt;Je viens de découvrir grâce à &lt;a href="http://weblogs.asp.net/scottgu/archive/2009/12/15/search-engine-optimization-seo-toolkit.aspx"&gt;Scott Guthrie&lt;/a&gt; un outil qui va vite devenir indispensable à tout développeur de sites web : le SEO toolkit. SEO, pour ceux qui ne le savent pas, signifie “Search Engine Optimisation”. Il s’agit d’optimiser son site web pour que les moteurs de recherche en indexent mieux le contenu, afin d’apparaitre plus haut dans les résultats de recherche.&lt;/p&gt;  &lt;p&gt;Le SEO toolkit peut être téléchargé sur &lt;a href="http://www.microsoft.com/web/page.aspx?templang=en-us&amp;amp;chunkfile=seo.html"&gt;le site de Microsoft&lt;/a&gt;, ou bien directement à partir de l’outil “Web Platform Installer” (qu’il vous faudra de toute façon utiliser pour l’installer). &lt;/p&gt;  &lt;p&gt;Une fois installé, le principe est simple : vous mettez l’URL de la page d’accueil de votre site, et l’outil va parcourir tout votre site et vous signaler tout ce que vous pourriez améliorer. Vous pouvez l’utiliser avec n’importe quel site, pas besoin d’avoir d’utiliser IIS : le programme agit comme un bot qui va télécharger les pages de votre site web, comme le ferait n’importe quel moteur de recherche.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1fIQLbpqRAw/Sye1tuJ85_I/AAAAAAAAByM/XWb-qidkAT4/s1600-h/image%5B4%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://lh4.ggpht.com/_1fIQLbpqRAw/Sye1uSPzipI/AAAAAAAAByQ/wDwALa5915o/image_thumb%5B2%5D.png?imgmax=800" width="762" height="451" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Une fois l’analyse du site terminée, vous aurez de nombreuses informations sur le site analysé, de différents types. Ainsi, cet outil est très utile pour, entre autres, retrouver les liens cassés à l’intérieur de vos pages.&lt;/p&gt;  &lt;p&gt;Je ne saurai trop vous conseiller de le tester de suite afin de vous faire votre propre idée.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-3135430140435538927?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/3135430140435538927/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=3135430140435538927' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/3135430140435538927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/3135430140435538927'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2009/12/optimisation-du-referencement-avec-le.html' title='Optimisation du référencement avec le SEO Toolkit'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_1fIQLbpqRAw/Sye1uSPzipI/AAAAAAAAByQ/wDwALa5915o/s72-c/image_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-978722883363182789</id><published>2009-12-07T17:17:00.001+01:00</published><updated>2009-12-07T17:46:08.418+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SigmaT'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><category scheme='http://www.blogger.com/atom/ns#' term='Job'/><category scheme='http://www.blogger.com/atom/ns#' term='Bewise'/><title type='text'>Des nouvelles de Bewise</title><content type='html'>&lt;p&gt;Je ne vais pas parler d’asp.net aujourd’hui (et c’est pourtant pas l’envie qui m’en manque), mais vous donner quelques nouvelles de Bewise.&lt;/p&gt;  &lt;p&gt;Pour commencer, je vous informe que Bewise sera présent au prochain SigmaT, qui se déroulera ce vendredi 11 décembre à l’IRIT, à l’université Paul Sabatier de Toulouse. Ionut Milhalcea vous y présentera une session “Pratiques agiles avec Team Foundation Server 2010”. Pour plus d’informations, le programme se trouve à cette adresse : &lt;a title="http://www.sigmat.fr/dotclear/index.php?post/2009/11/24/Programme-du-SigmaT12" href="http://www.sigmat.fr/dotclear/index.php?post/2009/11/24/Programme-du-SigmaT12"&gt;http://www.sigmat.fr/dotclear/index.php?post/2009/11/24/Programme-du-SigmaT12&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Allez-y nombreux, et pensez à &lt;a href="http://www.sigmat.fr/dotclear/index.php?form/inscription"&gt;vous inscrire&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;En toute logique, après ce séminaire vous devriez être pris d’une envie irrésistible de venir travailler avec nous ! ;) Eh bien, sachez que c’est maintenant chose possible, puisque Bewise recrute ! Regardez les offres ci-dessous, et si vous pensez correspondre aux profils demandés n’hésitez pas à postuler.&lt;/p&gt;  &lt;h3&gt;Consultant Sharepoint&lt;/h3&gt;  &lt;p&gt;Bewise est une structure en forte expansion. Pour l’accompagner, nous recherchons un&amp;#160; &lt;b&gt;&lt;u&gt;consultant(e) Sharepoint&lt;/u&gt;&lt;/b&gt; ayant une bonne connaissance sur les technologies Microsoft maîtrisant les points suivants :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1fIQLbpqRAw/Sx0p9W_GhAI/AAAAAAAABsE/GHQ80dtaOHs/s1600-h/clip_image002%5B51%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://lh3.ggpht.com/_1fIQLbpqRAw/Sx0p9p8_VQI/AAAAAAAABsI/1sfH0K2GTZY/clip_image002_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; WSS / MOSS&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1fIQLbpqRAw/Sx0p-PXGOBI/AAAAAAAABsM/fGVhNGy-7H8/s1600-h/clip_image002%5B1%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[1]" border="0" alt="clip_image002[1]" src="http://lh6.ggpht.com/_1fIQLbpqRAw/Sx0p-U2fueI/AAAAAAAABsQ/PsTXFV0Jukk/clip_image002%5B1%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; ASP.NET&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1fIQLbpqRAw/Sx0p-2XtEyI/AAAAAAAABsU/UuopOmu4yXM/s1600-h/clip_image002%5B2%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[2]" border="0" alt="clip_image002[2]" src="http://lh5.ggpht.com/_1fIQLbpqRAw/Sx0p_OnvYII/AAAAAAAABsY/yJyyYl8yhSI/clip_image002%5B2%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; SQL Server 2008&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1fIQLbpqRAw/Sx0p_hOWlAI/AAAAAAAABsc/bXNyJuElKpI/s1600-h/clip_image002%5B3%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[3]" border="0" alt="clip_image002[3]" src="http://lh4.ggpht.com/_1fIQLbpqRAw/Sx0qAPAif-I/AAAAAAAABsg/8fc-UdpPmPk/clip_image002%5B3%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; Architecture logicielle&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1fIQLbpqRAw/Sx0qAbrVRWI/AAAAAAAABsk/loTbeBEwgJo/s1600-h/clip_image002%5B4%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[4]" border="0" alt="clip_image002[4]" src="http://lh6.ggpht.com/_1fIQLbpqRAw/Sx0qAxnBGgI/AAAAAAAABso/rx1fZtMnbVI/clip_image002%5B4%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; Microsoft .NET 2.0, 3.0, 3.5&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1fIQLbpqRAw/Sx0qBD2mFOI/AAAAAAAABss/Gga_1YgVeF0/s1600-h/clip_image002%5B5%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[5]" border="0" alt="clip_image002[5]" src="http://lh4.ggpht.com/_1fIQLbpqRAw/Sx0qBgWsSZI/AAAAAAAABsw/kFV2bmhH05c/clip_image002%5B5%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; Visual C#.NET&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1fIQLbpqRAw/Sx0qBwLlJSI/AAAAAAAABs0/FnU05fBPvDI/s1600-h/clip_image002%5B6%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[6]" border="0" alt="clip_image002[6]" src="http://lh6.ggpht.com/_1fIQLbpqRAw/Sx0qCap36uI/AAAAAAAABs4/eAAPgbLTSO4/clip_image002%5B6%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; Visual Studio 2008&lt;/p&gt;  &lt;p&gt;La connaissance de Sharepoint 2010 ou de MS CRM 4.0 serait un plus.&lt;/p&gt;  &lt;p&gt;Principales missions : &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1fIQLbpqRAw/Sx0qCqXIHNI/AAAAAAAABs8/Vd7xk5AKzJk/s1600-h/clip_image002%5B7%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[7]" border="0" alt="clip_image002[7]" src="http://lh5.ggpht.com/_1fIQLbpqRAw/Sx0qDH_rNBI/AAAAAAAABtA/HSNxOa4BGok/clip_image002%5B7%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; Architecture et Conception d’applications Web et portail collaboratifs&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1fIQLbpqRAw/Sx0qDRxmPaI/AAAAAAAABtE/pkWSQKIBub8/s1600-h/clip_image002%5B8%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[8]" border="0" alt="clip_image002[8]" src="http://lh4.ggpht.com/_1fIQLbpqRAw/Sx0qD4hbH5I/AAAAAAAABtI/1oJ5z_U56_A/clip_image002%5B8%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; Développement, tests et livraison de solutions&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1fIQLbpqRAw/Sx0qEOK5g_I/AAAAAAAABtM/ezQr-uhnzKc/s1600-h/clip_image002%5B9%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[9]" border="0" alt="clip_image002[9]" src="http://lh6.ggpht.com/_1fIQLbpqRAw/Sx0qErPCKYI/AAAAAAAABtQ/mQNOkNrEQW0/clip_image002%5B9%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; Animation de formation et de séminaires&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1fIQLbpqRAw/Sx0qE6RHcbI/AAAAAAAABtU/ejdvi1iMLIg/s1600-h/clip_image002%5B10%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[10]" border="0" alt="clip_image002[10]" src="http://lh3.ggpht.com/_1fIQLbpqRAw/Sx0qFKG5FhI/AAAAAAAABtY/PHVuDZULRtw/clip_image002%5B10%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; Consulting sur les technologies Microsoft auprès de nos clients&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1fIQLbpqRAw/Sx0qFW2nsoI/AAAAAAAABtc/sgFqlULUNmU/s1600-h/clip_image002%5B11%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[11]" border="0" alt="clip_image002[11]" src="http://lh4.ggpht.com/_1fIQLbpqRAw/Sx0qF8abjDI/AAAAAAAABtg/ZPOpGYylOJw/clip_image002%5B11%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; Gestion de projets&lt;/p&gt;  &lt;p&gt;Vous êtes autonome, rigoureux, pédagogue avec un bon sens du relationnel et passionné par les technologies Microsoft. &lt;/p&gt;  &lt;p&gt;Rémunération : selon profil&lt;/p&gt;  &lt;p&gt;Votre profil correspond à notre poste ? Vous avez envie de rejoindre une équipe dynamique à taille humaine dans le Sud Ouest ? Bewise a besoin de vous. &lt;/p&gt;  &lt;p&gt;Envoyez votre CV à &lt;a href="mailto:job@bewise.fr"&gt;job@bewise.fr&lt;/a&gt; en indiquant « [ConsultantMOSS2010] » dans le sujet du mail.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Consultant Business Intelligence Microsoft&lt;/h3&gt;  &lt;p&gt;Bewise est une structure en forte expansion. Pour l’accompagner, nous recherchons un &lt;b&gt;&lt;u&gt;consultant(e) décisionnel&lt;/u&gt;&lt;/b&gt; ayant une bonne connaissance sur les technologies Microsoft maîtrisant les points suivants :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1fIQLbpqRAw/Sx0qGVF6txI/AAAAAAAABtk/pubJAlK7RSU/s1600-h/clip_image002%5B12%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[12]" border="0" alt="clip_image002[12]" src="http://lh4.ggpht.com/_1fIQLbpqRAw/Sx0qGgY4BeI/AAAAAAAABto/Mq-nvB0ToKc/clip_image002%5B12%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; L’ensemble des technologies décisionnelles de Microsoft&lt;/p&gt;  &lt;p&gt;o SQL Server 2008 R2&lt;/p&gt;  &lt;p&gt;o Analysis Services&lt;/p&gt;  &lt;p&gt;o Integration Services&lt;/p&gt;  &lt;p&gt;o Reporting Services&lt;/p&gt;  &lt;p&gt;o Monitoring Server&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1fIQLbpqRAw/Sx0qHMx8_eI/AAAAAAAABts/tyubXssDvlI/s1600-h/clip_image002%5B13%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[13]" border="0" alt="clip_image002[13]" src="http://lh3.ggpht.com/_1fIQLbpqRAw/Sx0qHbE4OMI/AAAAAAAABtw/gY82pbI_Ya4/clip_image002%5B13%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; MOSS&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1fIQLbpqRAw/Sx0qHw2t6CI/AAAAAAAABt0/3x6uoC6PMkE/s1600-h/clip_image002%5B14%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[14]" border="0" alt="clip_image002[14]" src="http://lh5.ggpht.com/_1fIQLbpqRAw/Sx0qIElf_PI/AAAAAAAABt4/najlfiZ6GDM/clip_image002%5B14%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; Architecture logicielle&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1fIQLbpqRAw/Sx0qIi9JHGI/AAAAAAAABt8/T8s7MNpC1Io/s1600-h/clip_image002%5B15%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[15]" border="0" alt="clip_image002[15]" src="http://lh4.ggpht.com/_1fIQLbpqRAw/Sx0qI4NzarI/AAAAAAAABuA/eR9pnTdte6s/clip_image002%5B15%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; Microsoft .NET&lt;/p&gt;  &lt;p&gt;Principales missions : &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1fIQLbpqRAw/Sx0qJZJ7agI/AAAAAAAABuE/v1Q0gtatBEw/s1600-h/clip_image002%5B16%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[16]" border="0" alt="clip_image002[16]" src="http://lh3.ggpht.com/_1fIQLbpqRAw/Sx0qJofbI9I/AAAAAAAABuI/AZWnLin_V-w/clip_image002%5B16%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; Architecture et Conception de solutions décisionnelles&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1fIQLbpqRAw/Sx0qKFfU7rI/AAAAAAAABuM/S8P_chktE2c/s1600-h/clip_image002%5B17%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[17]" border="0" alt="clip_image002[17]" src="http://lh3.ggpht.com/_1fIQLbpqRAw/Sx0qKVvQa4I/AAAAAAAABuQ/r3YSS6hl7xY/clip_image002%5B17%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; Développement, tests et livraison de solutions&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1fIQLbpqRAw/Sx0qK-fN-wI/AAAAAAAABuU/qp65mV4g3u0/s1600-h/clip_image002%5B18%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[18]" border="0" alt="clip_image002[18]" src="http://lh6.ggpht.com/_1fIQLbpqRAw/Sx0qLKYAroI/AAAAAAAABuY/RM9j6xzpsD8/clip_image002%5B18%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; Animation de formation et de séminaires&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1fIQLbpqRAw/Sx0qLdy0j3I/AAAAAAAABuc/nuI5xYLPciQ/s1600-h/clip_image002%5B19%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[19]" border="0" alt="clip_image002[19]" src="http://lh4.ggpht.com/_1fIQLbpqRAw/Sx0qL6crejI/AAAAAAAABug/KFc4qL3f2R0/clip_image002%5B19%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; Consulting sur les technologies Microsoft auprès de nos clients&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1fIQLbpqRAw/Sx0qMFdZpzI/AAAAAAAABuk/EDVpmCsXvtw/s1600-h/clip_image002%5B20%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[20]" border="0" alt="clip_image002[20]" src="http://lh3.ggpht.com/_1fIQLbpqRAw/Sx0qMrgXgjI/AAAAAAAABuo/Rgh7y_uYL3A/clip_image002%5B20%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; Gestion de projets&lt;/p&gt;  &lt;p&gt;Vous êtes autonome, rigoureux, pédagogue avec un bon sens du relationnel et passionné par les technologies Microsoft. &lt;/p&gt;  &lt;p&gt;Rémunération : selon profil&lt;/p&gt;  &lt;p&gt;Votre profil correspond à notre poste ? Vous avez envie de rejoindre une équipe dynamique à taille humaine dans le Sud Ouest ? Bewise a besoin de vous. &lt;/p&gt;  &lt;p&gt;Envoyez votre CV à &lt;a href="mailto:job@bewise.fr"&gt;job@bewise.fr&lt;/a&gt; en indiquant « [ConsultantBI2010] » dans le sujet du mail.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Consultant sur les technologies Microsoft&lt;/h3&gt;  &lt;p&gt;Bewise est une structure en forte expansion. Pour l’accompagner, nous recherchons un&amp;#160; consultant(e) ayant une bonne connaissance sur les technologies de développement Microsoft maîtrisant les points suivants :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1fIQLbpqRAw/Sx0qM0WA7mI/AAAAAAAABus/HPO6mjh2QzQ/s1600-h/clip_image002%5B21%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[21]" border="0" alt="clip_image002[21]" src="http://lh6.ggpht.com/_1fIQLbpqRAw/Sx0qN3jlqNI/AAAAAAAABuw/VuR6oX1lgkc/clip_image002%5B21%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; SQL Server 2008&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1fIQLbpqRAw/Sx0qOHefTqI/AAAAAAAABu0/Rqha44a9A_c/s1600-h/clip_image002%5B22%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[22]" border="0" alt="clip_image002[22]" src="http://lh6.ggpht.com/_1fIQLbpqRAw/Sx0qOl5G-1I/AAAAAAAABu4/K9PbuEV37-I/clip_image002%5B22%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; Architecture logicielle&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1fIQLbpqRAw/Sx0qO69iHVI/AAAAAAAABu8/bsKPH50muHA/s1600-h/clip_image002%5B23%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[23]" border="0" alt="clip_image002[23]" src="http://lh5.ggpht.com/_1fIQLbpqRAw/Sx0qPJXLuhI/AAAAAAAABvA/YfBE0i34ohU/clip_image002%5B23%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; Microsoft .NET 2.0, 3.0, 3.5, 4.0&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1fIQLbpqRAw/Sx0qPtaM1jI/AAAAAAAABvE/B30d2TwwmCI/s1600-h/clip_image002%5B24%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[24]" border="0" alt="clip_image002[24]" src="http://lh5.ggpht.com/_1fIQLbpqRAw/Sx0qP_TkmkI/AAAAAAAABvI/eL3s129hmiM/clip_image002%5B24%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; ASP.NET, Ajax&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1fIQLbpqRAw/Sx0qQCvfBHI/AAAAAAAABvM/eBimP3PPFMU/s1600-h/clip_image002%5B25%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[25]" border="0" alt="clip_image002[25]" src="http://lh5.ggpht.com/_1fIQLbpqRAw/Sx0qQoEdSBI/AAAAAAAABvQ/7KNEgvHrWyg/clip_image002%5B25%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; WPF&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1fIQLbpqRAw/Sx0qQyuouvI/AAAAAAAABvU/hZ3aZ-Qe0Oo/s1600-h/clip_image002%5B26%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[26]" border="0" alt="clip_image002[26]" src="http://lh6.ggpht.com/_1fIQLbpqRAw/Sx0qRTuHjYI/AAAAAAAABvY/-LL2jxpD0RI/clip_image002%5B26%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; WCF&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1fIQLbpqRAw/Sx0qR9BFonI/AAAAAAAABvc/yJJfxLDCkcc/s1600-h/clip_image002%5B27%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[27]" border="0" alt="clip_image002[27]" src="http://lh6.ggpht.com/_1fIQLbpqRAw/Sx0qSBBwBvI/AAAAAAAABvg/A4--MWkr7fw/clip_image002%5B27%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; C#/VB&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1fIQLbpqRAw/Sx0qSqBDCOI/AAAAAAAABvk/k06uRi8Y7uE/s1600-h/clip_image002%5B28%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[28]" border="0" alt="clip_image002[28]" src="http://lh5.ggpht.com/_1fIQLbpqRAw/Sx0qS8GsFmI/AAAAAAAABvo/kD4vYBqLv6U/clip_image002%5B28%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; Visual Studio 2008, 2010&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1fIQLbpqRAw/Sx0qTedVtwI/AAAAAAAABvs/33Me-Cx-BdQ/s1600-h/clip_image002%5B29%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[29]" border="0" alt="clip_image002[29]" src="http://lh4.ggpht.com/_1fIQLbpqRAw/Sx0qTrPUYII/AAAAAAAABvw/NenFEAXwgHk/clip_image002%5B29%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; TFS 2008, 2010&lt;/p&gt;  &lt;p&gt;La connaissance de C++, DirectX ou GDI serait un plus.&lt;/p&gt;  &lt;p&gt;Principales missions : &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1fIQLbpqRAw/Sx0qUKKq6jI/AAAAAAAABv0/hUodqVoM3e8/s1600-h/clip_image002%5B30%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[30]" border="0" alt="clip_image002[30]" src="http://lh5.ggpht.com/_1fIQLbpqRAw/Sx0qUSDCW2I/AAAAAAAABv4/sWLbMXQ7wyk/clip_image002%5B30%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; Architecture et Conception de solutions décisionnelles&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1fIQLbpqRAw/Sx0qU4scahI/AAAAAAAABv8/KgrXwdn4xxc/s1600-h/clip_image002%5B31%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[31]" border="0" alt="clip_image002[31]" src="http://lh6.ggpht.com/_1fIQLbpqRAw/Sx0qVBC8XaI/AAAAAAAABwA/eevlnfjPgfs/clip_image002%5B31%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; Développement, tests et livraison de solutions&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1fIQLbpqRAw/Sx0qVX0RfWI/AAAAAAAABwE/4iyDpcYm03o/s1600-h/clip_image002%5B32%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[32]" border="0" alt="clip_image002[32]" src="http://lh4.ggpht.com/_1fIQLbpqRAw/Sx0qVwzXQ9I/AAAAAAAABwI/KBmIjfIPLj0/clip_image002%5B32%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; Animation de formation et de séminaires&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1fIQLbpqRAw/Sx0qWMXLslI/AAAAAAAABwM/BVRYFrYMNd4/s1600-h/clip_image002%5B33%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[33]" border="0" alt="clip_image002[33]" src="http://lh3.ggpht.com/_1fIQLbpqRAw/Sx0qWqUjo1I/AAAAAAAABwQ/Yn7WN9BeVFA/clip_image002%5B33%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; Consulting sur les technologies Microsoft auprès de nos clients&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1fIQLbpqRAw/Sx0qW2aKpiI/AAAAAAAABwU/pVlYTtQ9E8M/s1600-h/clip_image002%5B34%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[34]" border="0" alt="clip_image002[34]" src="http://lh3.ggpht.com/_1fIQLbpqRAw/Sx0qXGGB9JI/AAAAAAAABwY/04CHdt2s6iI/clip_image002%5B34%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; Gestion de projets&lt;/p&gt;  &lt;p&gt;Vous êtes autonome, rigoureux, pédagogue avec un bon sens du relationnel et passionné par les technologies Microsoft. &lt;/p&gt;  &lt;p&gt;Rémunération : selon profil&lt;/p&gt;  &lt;p&gt;Votre profil correspond à notre poste ? Vous avez envie de rejoindre une équipe dynamique à taille humaine dans le Sud Ouest ? Bewise a besoin de vous. &lt;/p&gt;  &lt;p&gt;Envoyez votre CV à &lt;a href="mailto:job@bewise.fr"&gt;job@bewise.fr&lt;/a&gt; en indiquant « [ConsultantNET2010] » dans le sujet du mail.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Consultant fonctionnel sur les technologies Microsoft&lt;/h3&gt;  &lt;p&gt;Bewise est une structure en forte expansion. Pour l’accompagner, nous recherchons un&amp;#160; &lt;b&gt;&lt;u&gt;consultant(e) fonctionnel&lt;/u&gt;&lt;/b&gt; ayant une bonne connaissance des technologies Microsoft. &lt;/p&gt;  &lt;p&gt;Vous connaissez les produits Microsoft suivants :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1fIQLbpqRAw/Sx0qXunl0pI/AAAAAAAABwc/vDIqHJZQGbQ/s1600-h/clip_image002%5B35%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[35]" border="0" alt="clip_image002[35]" src="http://lh6.ggpht.com/_1fIQLbpqRAw/Sx0qX6CZDDI/AAAAAAAABwg/GnK9xvWhX2s/clip_image002%5B35%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; MOSS&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1fIQLbpqRAw/Sx0qYes1-pI/AAAAAAAABwk/hkJKX5b13p8/s1600-h/clip_image002%5B36%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[36]" border="0" alt="clip_image002[36]" src="http://lh4.ggpht.com/_1fIQLbpqRAw/Sx0qYuPEj5I/AAAAAAAABwo/03xTLxDOwiA/clip_image002%5B36%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; MS CRM 4.0&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1fIQLbpqRAw/Sx0qZCAS3TI/AAAAAAAABws/vOMn1_swpZw/s1600-h/clip_image002%5B37%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[37]" border="0" alt="clip_image002[37]" src="http://lh3.ggpht.com/_1fIQLbpqRAw/Sx0qZgI7WiI/AAAAAAAABww/Kin4iCMYuIw/clip_image002%5B37%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; SQL Server Business Intelligence&lt;/p&gt;  &lt;p&gt;La connaissance des autres produits serveur de Microsoft (BizTalk Server, Team Foundation Server, etc.) serait un plus.&lt;/p&gt;  &lt;p&gt;Principales missions : &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1fIQLbpqRAw/Sx0qZx7AJhI/AAAAAAAABw0/eEEYPXT8WLI/s1600-h/clip_image002%5B38%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[38]" border="0" alt="clip_image002[38]" src="http://lh4.ggpht.com/_1fIQLbpqRAw/Sx0qadFZuWI/AAAAAAAABw4/i6nT1e0IRhk/clip_image002%5B38%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; traduction des besoins utilisateurs en cahiers des charges, écriture de spécifications&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1fIQLbpqRAw/Sx0qapIo5JI/AAAAAAAABw8/8UpgKrRVnE4/s1600-h/clip_image002%5B39%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[39]" border="0" alt="clip_image002[39]" src="http://lh6.ggpht.com/_1fIQLbpqRAw/Sx0qa8zd_2I/AAAAAAAABxA/hyJuIVRdiH0/clip_image002%5B39%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; assistance à la définition des besoins et des solutions &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1fIQLbpqRAw/Sx0qbDhGa0I/AAAAAAAABxE/q4e8WqMm7wk/s1600-h/clip_image002%5B40%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[40]" border="0" alt="clip_image002[40]" src="http://lh3.ggpht.com/_1fIQLbpqRAw/Sx0qbgOzAZI/AAAAAAAABxI/AtAjj_TFx_U/clip_image002%5B40%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; accompagnement des utilisateurs sur la prise en main et la maîtrise des outils&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1fIQLbpqRAw/Sx0qb7IWDJI/AAAAAAAABxM/m0rlEak4jpA/s1600-h/clip_image002%5B41%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[41]" border="0" alt="clip_image002[41]" src="http://lh3.ggpht.com/_1fIQLbpqRAw/Sx0qcX5QD0I/AAAAAAAABxQ/rbyFqgw02q0/clip_image002%5B41%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; conseil en processus, en conduite de changement&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1fIQLbpqRAw/Sx0qcvwPnVI/AAAAAAAABxU/n4MXyVcNwh4/s1600-h/clip_image002%5B42%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[42]" border="0" alt="clip_image002[42]" src="http://lh3.ggpht.com/_1fIQLbpqRAw/Sx0qdGr1cbI/AAAAAAAABxY/gVhLVxTBarQ/clip_image002%5B42%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; animation de séminaires autour des technologies &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1fIQLbpqRAw/Sx0qdWeCfaI/AAAAAAAABxc/sis-TNMLrgk/s1600-h/clip_image002%5B43%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[43]" border="0" alt="clip_image002[43]" src="http://lh4.ggpht.com/_1fIQLbpqRAw/Sx0qdqtIIoI/AAAAAAAABxg/NE6cvexDLsc/clip_image002%5B43%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; participation aux avant-ventes. &lt;/p&gt;  &lt;p&gt;Vous avez un bon sens du relationnel, vous êtes pédagogue, vous avez de bonnes qualités rédactionnelles ?    &lt;br /&gt;Vous avez le sens du service, vous êtes méthodique et organisé ?     &lt;br /&gt;Vous êtes attiré par les technologies Microsoft ?&lt;/p&gt;  &lt;p&gt;Votre profil correspond à notre poste ? Vous avez envie de rejoindre une équipe dynamique à taille humaine dans le Sud Ouest ? Bewise a besoin de vous. &lt;/p&gt;  &lt;p&gt;Rémunération : selon profil&lt;/p&gt;  &lt;p&gt;Envoyez votre CV à &lt;a href="mailto:job@bewise.fr"&gt;job@bewise.fr&lt;/a&gt; en indiquant « [ConsultantFONC2010] » dans le sujet du mail.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Stagiaire&lt;/h3&gt;  &lt;p&gt;Bewise est une structure en forte expansion. Pour l’accompagner, nous recherchons un stagiaire qui travaillera sur les technologies de développement Microsoft, à savoir :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1fIQLbpqRAw/Sx0qeNCeqRI/AAAAAAAABxk/KQfDHwPnLM0/s1600-h/clip_image002%5B44%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[44]" border="0" alt="clip_image002[44]" src="http://lh4.ggpht.com/_1fIQLbpqRAw/Sx0qecC90oI/AAAAAAAABxo/-8R2hRyp6U4/clip_image002%5B44%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; Microsoft .NET 4.0&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1fIQLbpqRAw/Sx0qegflgKI/AAAAAAAABxs/8011NSx8bhU/s1600-h/clip_image002%5B45%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[45]" border="0" alt="clip_image002[45]" src="http://lh6.ggpht.com/_1fIQLbpqRAw/Sx0qfA8Ac7I/AAAAAAAABxw/u3Ub5pSdUPw/clip_image002%5B45%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; ASP.NET, WPF, WCF&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1fIQLbpqRAw/Sx0qfR0difI/AAAAAAAABx0/gjdllBSA_u0/s1600-h/clip_image002%5B46%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[46]" border="0" alt="clip_image002[46]" src="http://lh3.ggpht.com/_1fIQLbpqRAw/Sx0qf1iKtmI/AAAAAAAABx4/F6wcy1Xv31U/clip_image002%5B46%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; Visual Studio .NET 2010&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1fIQLbpqRAw/Sx0qgJphgfI/AAAAAAAABx8/iomO_GdWYKk/s1600-h/clip_image002%5B47%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[47]" border="0" alt="clip_image002[47]" src="http://lh6.ggpht.com/_1fIQLbpqRAw/Sx0qgjI6hmI/AAAAAAAAByA/IOaQu_5drLQ/clip_image002%5B47%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; SQL Server 2008R2&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1fIQLbpqRAw/Sx0qg4A-qiI/AAAAAAAAByE/KrnKk6r8YLA/s1600-h/clip_image002%5B48%5D%5B2%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[48]" border="0" alt="clip_image002[48]" src="http://lh6.ggpht.com/_1fIQLbpqRAw/Sx0qhZBPzzI/AAAAAAAAByI/wefoS9m6MCQ/clip_image002%5B48%5D_thumb.gif?imgmax=800" width="24" height="23" /&gt;&lt;/a&gt; Sharepoint 2010&lt;/p&gt;  &lt;p&gt;Qualités attendues : autonomie, rigueur, passionné par les technologies et forte motivation.&lt;/p&gt;  &lt;p&gt;A l’heure actuelle le sujet de stage n’est pas complètement défini, mais fera intervenir plusieurs des technologies précédentes.&lt;/p&gt;  &lt;p&gt;La durée minimale du stage est de 3 mois ETP (stage de fin d’étude, contrat de professionnalisation en alternance). Le poste est à pourvoir en 2010.&lt;/p&gt;  &lt;p&gt;Vous avez envie de rejoindre une équipe sympa, jeune et dynamique ? Envoyez votre CV et votre lettre de motivation à &lt;a href="mailto:job@bewise.fr"&gt;job@bewise.fr&lt;/a&gt; en indiquant [StagiaireQ12010] dans le sujet du mail.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-978722883363182789?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/978722883363182789/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=978722883363182789' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/978722883363182789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/978722883363182789'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2009/12/des-nouvelles-de-bewise.html' title='Des nouvelles de Bewise'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_1fIQLbpqRAw/Sx0p9p8_VQI/AAAAAAAABsI/1sfH0K2GTZY/s72-c/clip_image002_thumb.gif?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-2242180640574693740</id><published>2009-11-13T15:28:00.001+01:00</published><updated>2009-11-13T15:44:26.790+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><title type='text'>ASP.NET MVC : Changer de ViewEngine (2/2)</title><content type='html'>&lt;p&gt;Nous avons vu dans mon précédent post comment apporter des modifications au ViewEngine utilisé par défaut par MVC. Aujourd’hui, ça va se compliquer puisque nous allons voir ce qu’il est nécessaire de savoir pour créer un ViewEngine complet.&lt;/p&gt;  &lt;p&gt;Contrairement à ce que nous avons vu précédemment, où nous ne faisions qu’apporter des modification au WebFormViewEngine, cette fois nous aurons un contrôle total du code HTML qui sera généré, libre à vous d’utiliser des pages PHP ou de créer votre propre langage serveur ! Par contre, je ne vous cache pas que mettre ça en place vous demandera un peu plus de boulot que d’utiliser les webforms.&lt;/p&gt;  &lt;p&gt;Pour créer un nouveau View Engine from scratch, il va nous falloir implémenter 2 interfaces: IView, qui représentera nos vues (ce qui nous permettre de renvoyer le code html au client), et IViewEngine, qui nous servira à charger la vue correcte en fonction du contexte et du nom de la vue.&lt;/p&gt;  &lt;p&gt;Commençons par la vue : l’interface IView nous demande de faire une méthode Render, qui reçoit des informations dans le viewContext, et devra écrire le code HTML à renvoyer au client dans un TextWriter.&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: #dcdcdc; white-space: nowrap; overflow: scroll"&gt;&lt;font face=" Consolas"&gt;&lt;font size="1"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;MyCompletelySpecificView&lt;/font&gt;&lt;font color="#000000"&gt; : &lt;/font&gt;&lt;font color="#2b91af"&gt;IView&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {           &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region&lt;/font&gt;&lt;font color="#000000"&gt; IView Members          &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;font color="#000000"&gt; Render(&lt;/font&gt;&lt;font color="#2b91af"&gt;ViewContext&lt;/font&gt;&lt;font color="#000000"&gt; viewContext, System.IO.&lt;/font&gt;&lt;font color="#2b91af"&gt;TextWriter&lt;/font&gt;&lt;font color="#000000"&gt; writer)          &lt;br /&gt;&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; &lt;/font&gt;&lt;font color="#008000"&gt;// on va faire notre rendu ici&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }           &lt;br /&gt;          &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }           &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Nous avons ici toute liberté pour faire ce que nous voulons ! Nous allons par exemple aller chercher notre vue en base de données : pour cela, nous avons une table toute simple avec 2 colonnes : le nom de la vue, et le code HTML correspondant.&lt;/p&gt;  &lt;p&gt;Nous pouvons créer notre DatabaseView qui ira chercher en base de données le code html, au lieu de chercher un fichier.&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: #dcdcdc; white-space: nowrap; overflow: scroll"&gt;&lt;font face=" Consolas"&gt;&lt;font size="1"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;DatabaseView&lt;/font&gt;&lt;font color="#000000"&gt; : &lt;/font&gt;&lt;font color="#2b91af"&gt;IView&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;private&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;String&lt;/font&gt;&lt;font color="#000000"&gt; viewName;          &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt; DatabaseView(&lt;/font&gt;&lt;font color="#2b91af"&gt;String&lt;/font&gt;&lt;font color="#000000"&gt; viewName)          &lt;br /&gt;&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;.viewName = viewName;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }           &lt;br /&gt;          &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region&lt;/font&gt;&lt;font color="#000000"&gt; IView Members          &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;font color="#000000"&gt; Render(&lt;/font&gt;&lt;font color="#2b91af"&gt;ViewContext&lt;/font&gt;&lt;font color="#000000"&gt; viewContext, System.IO.&lt;/font&gt;&lt;font color="#2b91af"&gt;TextWriter&lt;/font&gt;&lt;font color="#000000"&gt; writer)          &lt;br /&gt;&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;using&lt;/font&gt;&lt;font color="#000000"&gt; (&lt;/font&gt;&lt;font color="#2b91af"&gt;DatabaseViewsDataContext&lt;/font&gt;&lt;font color="#000000"&gt; context = &lt;/font&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;DatabaseViewsDataContext&lt;/font&gt;&lt;font color="#000000"&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; {           &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="#2b91af"&gt;ViewContent&lt;/font&gt;&lt;font color="#000000"&gt; content = context.ViewContents.SingleOrDefault(v =&amp;gt; v.ViewName == viewName);          &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; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#000000"&gt; (content != &lt;/font&gt;&lt;font color="#0000ff"&gt;null&lt;/font&gt;&lt;font color="#000000"&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; writer.Write(content.Text);           &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; }           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }           &lt;br /&gt;          &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }           &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Il ne nous reste plus qu’à créer le View Engine qui va bien, pour pouvoir appeler correctement nos vues. Nous avons 3 méthodes à implémenter : pour récupérer une vue, pour récupérer une vue partielle, et pour libérer la mémoire de notre vue.&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: #dcdcdc; white-space: nowrap; overflow: scroll"&gt;&lt;font face=" Consolas"&gt;&lt;font size="1"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;DatabaseViewEngine&lt;/font&gt;&lt;font color="#000000"&gt; : &lt;/font&gt;&lt;font color="#2b91af"&gt;IViewEngine&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {           &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region&lt;/font&gt;&lt;font color="#000000"&gt; IViewEngine Members          &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;ViewEngineResult&lt;/font&gt;&lt;font color="#000000"&gt; FindPartialView(&lt;/font&gt;&lt;font color="#2b91af"&gt;ControllerContext&lt;/font&gt;&lt;font color="#000000"&gt; controllerContext, &lt;/font&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;font color="#000000"&gt; partialViewName, &lt;/font&gt;&lt;font color="#0000ff"&gt;bool&lt;/font&gt;&lt;font color="#000000"&gt; useCache)          &lt;br /&gt;&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;ViewEngineResult&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;DatabaseView&lt;/font&gt;&lt;font color="#000000"&gt;(partialViewName), &lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;);          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }           &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;ViewEngineResult&lt;/font&gt;&lt;font color="#000000"&gt; FindView(&lt;/font&gt;&lt;font color="#2b91af"&gt;ControllerContext&lt;/font&gt;&lt;font color="#000000"&gt; controllerContext, &lt;/font&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;font color="#000000"&gt; viewName, &lt;/font&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;font color="#000000"&gt; masterName, &lt;/font&gt;&lt;font color="#0000ff"&gt;bool&lt;/font&gt;&lt;font color="#000000"&gt; useCache)          &lt;br /&gt;&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;ViewEngineResult&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;DatabaseView&lt;/font&gt;&lt;font color="#000000"&gt;(viewName), &lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;);          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }           &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;font color="#000000"&gt; ReleaseView(&lt;/font&gt;&lt;font color="#2b91af"&gt;ControllerContext&lt;/font&gt;&lt;font color="#000000"&gt; controllerContext, &lt;/font&gt;&lt;font color="#2b91af"&gt;IView&lt;/font&gt;&lt;font color="#000000"&gt; view)          &lt;br /&gt;&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; &lt;/font&gt;&lt;font color="#2b91af"&gt;IDisposable&lt;/font&gt;&lt;font color="#000000"&gt; disposableView = view &lt;/font&gt;&lt;font color="#0000ff"&gt;as&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;IDisposable&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#000000"&gt; (disposableView != &lt;/font&gt;&lt;font color="#0000ff"&gt;null&lt;/font&gt;&lt;font color="#000000"&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; disposableView.Dispose();           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }           &lt;br /&gt;          &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }           &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;J’ai ici fait au plus simple, mais vous avez tout loisir pour faire plus compliqué si vous le désirez, pour gérer les vues mobiles, ou bien différentes langues. N’oubliez pas non plus de gérer le cache lorsqu’on vous le demande (et oui, refaire un ViewEngine, ça veut dire qu’il faut TOUT refaire).&lt;/p&gt;  &lt;p&gt;Voilà, vous avez toutes les clés en main pour créer votre propre View Engine, maintenant à vous de jouer !&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Cross-posté vers &lt;a href="http://www.techheadbrothers.com/"&gt;Tech Head Brothers&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-2242180640574693740?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/2242180640574693740/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=2242180640574693740' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/2242180640574693740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/2242180640574693740'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2009/11/aspnet-mvc-changer-de-viewengine-22.html' title='ASP.NET MVC : Changer de ViewEngine (2/2)'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-5065211897464753434</id><published>2009-11-10T12:03:00.001+01:00</published><updated>2009-11-13T15:40:36.490+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><title type='text'>ASP.NET MVC : Changer de ViewEngine (1/2)</title><content type='html'>&lt;p&gt;Nous avons vu dans un précédent post comment changer de ControllerFactory, maintenant nous allons voir comment changer de ViewEngine.&lt;/p&gt;  &lt;p&gt;Mon problème, comme la dernière fois, est que je n’aime pas la convention par défaut de MVC : si je ne mets pas mes vues dans le dossier “Views”, il ne les trouve pas. Je vais donc créer mon propre ViewEngine ; ou plutot je vais étendre celui utilisé par défaut pour redéfinir les dossiers où chercher.&lt;/p&gt;  &lt;p&gt;Avant de faire ça, nous allons d’abord regarder comment fonctionne le WebFormViewEngine : &lt;a href="http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471"&gt;le code source est disponible&lt;/a&gt;, ne nous privons pas d’aller y jeter un oeil !     &lt;br /&gt;La classe hérite de VirtualPathProviderViewEngine, classe abstraite qui permet d’aller chercher les fichiers dans le site à partir de chemins virtuels asp.net (vous savez, ceux qui commencent par ~). Regardons son constructeur :&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: #dcdcdc; white-space: nowrap; overflow: scroll"&gt;&lt;font face=" Courier New"&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt; WebFormViewEngine() {          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MasterLocationFormats = &lt;/font&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;~/Views/{1}/{0}.master&amp;quot;&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;~/Views/Shared/{0}.master&amp;quot;          &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; };          &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ViewLocationFormats = &lt;/font&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;~/Views/{1}/{0}.aspx&amp;quot;&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;~/Views/{1}/{0}.ascx&amp;quot;&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;~/Views/Shared/{0}.aspx&amp;quot;&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;~/Views/Shared/{0}.ascx&amp;quot;          &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; };          &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; PartialViewLocationFormats = ViewLocationFormats;           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Ici on initialise 3 tableaux de String, qui contiennent les emplacements où chercher nos vues, pour les master pages, les vues et les vues partielles. Ainsi, si je veux redéfinir l’emplacement de mes vues, je pourrai me contenter d’hériter de WebFormViewEngine et de remplacer ces valeurs par les miennes :&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: #dcdcdc; white-space: nowrap; overflow: scroll"&gt;&lt;font face=" Consolas"&gt;&lt;font size="1"&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;MyCustomViewEngine&lt;/font&gt;&lt;font color="#000000"&gt; : &lt;/font&gt;&lt;font color="#2b91af"&gt;WebFormViewEngine&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;{           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt; MyCustomViewEngine()          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MasterLocationFormats = &lt;/font&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;~/MesMasterPages/{1}/{0}.master&amp;quot;&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;~/MesMasterPages/{0}.master&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; };           &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ViewLocationFormats = &lt;/font&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;~/MesVues/{1}/{0}.aspx&amp;quot;&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;~/MesVues/{0}.aspx&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; };           &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; PartialViewLocationFormats = &lt;/font&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;~/MesVues/{1}/{0}.ascx&amp;quot;&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;~/MesVues/{0}.ascx&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; };           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }           &lt;br /&gt;}           &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;On va maintenant aller un peu plus loin, en créant un ViewEngine qui va renvoyer des vues différentes en fonction du contexte. Un exemple pratique : on veut créer des vues spécifiques pour les appareils mobiles. &lt;/p&gt;  &lt;p&gt;Par exemple, si je veux définir un site “normal” à l’adresse &lt;a href="http://www.monsite.com"&gt;http://www.monsite.com&lt;/a&gt;, et un site mobile à l’adresse &lt;a href="http://m.monsite.com"&gt;http://m.monsite.com&lt;/a&gt;, je vais router les dns de mes deux sous-domaines vers le même site, et mon ViewEngine fera le tri :&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: #dcdcdc; white-space: nowrap; overflow: scroll"&gt;&lt;font face=" Consolas"&gt;&lt;font size="1"&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;MobileViewSelector&lt;/font&gt;&lt;font color="#000000"&gt; : &lt;/font&gt;&lt;font color="#2b91af"&gt;WebFormViewEngine&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;{           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;override&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;ViewEngineResult&lt;/font&gt;&lt;font color="#000000"&gt; FindView(&lt;/font&gt;&lt;font color="#2b91af"&gt;ControllerContext&lt;/font&gt;&lt;font color="#000000"&gt; controllerContext, &lt;/font&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;font color="#000000"&gt; viewName, &lt;/font&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;font color="#000000"&gt; masterName, &lt;/font&gt;&lt;font color="#0000ff"&gt;bool&lt;/font&gt;&lt;font color="#000000"&gt; useCache)          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#008000"&gt;// on récupère le domaine utilisé pour venir sur le site&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#2b91af"&gt;String&lt;/font&gt;&lt;font color="#000000"&gt; domain = controllerContext.RequestContext.HttpContext.Request.Url.Authority.ToLower();          &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#008000"&gt;// si on est sur un domaine pour mobile, on va chercher la vue dans un sous-dossiers &amp;quot;mobile&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#000000"&gt; (domain.StartsWith(&lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;m&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;) || domain.StartsWith(&lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;iphone&amp;quot;&lt;/font&gt;&lt;font color="#000000"&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; viewName = &lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;Mobile/&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt; + viewName;          &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#008000"&gt;// on appelle la requête de base&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;base&lt;/font&gt;&lt;font color="#000000"&gt;.FindView(controllerContext, viewName, masterName, useCache);          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }           &lt;br /&gt;}           &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Dans cet exemple, si on se connecte au site en utilisant le sous domaine “m” (ou même “iphone”, parce que c’est à la mode, même si le résultat est exactement le même), la vue sera recherchée dans un sous-dossier “Mobile” du dossier des vues, sinon on récupère la vue normale. Bien sûr, l’utilisation du sous domaine n’est qu’un exemple, vous pouvez router vos vues en fonction de variables de sessions, de paramètres passés dans la requête ou tout ce que vous désirez.&lt;/p&gt;  &lt;p&gt;Il suffit ensuite de créer toutes nos vues en double : une vue normale, et une vue mobile, et ça fonctionnera. C’est là un des points forts de MVC, le contrôleur n’a pas besoin d’être modifié : il fait uniquement son boulot de contrôleur et envoie des informations à la vue. Ensuite que la vue soit faite pour un PC ou un mobile ne le concerne plus.&lt;/p&gt;  &lt;p&gt;Dernière petite chose pour que ça fonctionne, il ne faut pas oublier d’enregistrer notre ViewEngine dans le global.asax :&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: #dcdcdc; white-space: nowrap; overflow: scroll"&gt;&lt;font face=" Consolas"&gt;&lt;font size="1"&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;protected&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;font color="#000000"&gt; Application_Start()          &lt;br /&gt;{           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; RegisterRoutes(&lt;/font&gt;&lt;font color="#2b91af"&gt;RouteTable&lt;/font&gt;&lt;font color="#000000"&gt;.Routes);          &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#008000"&gt;// On supprime le ViewEngine par défaut, on n'en a plus besoin&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#2b91af"&gt;ViewEngines&lt;/font&gt;&lt;font color="#000000"&gt;.Engines.Clear();          &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#008000"&gt;// On enregistre notre ViewEngine &lt;/font&gt;&lt;font color="#000000"&gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#2b91af"&gt;ViewEngines&lt;/font&gt;&lt;font color="#000000"&gt;.Engines.Add(&lt;/font&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;MobileViewSelector&lt;/font&gt;&lt;font color="#000000"&gt;());          &lt;br /&gt;}           &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Nous verrons dans un prochain post comment modifier le ViewEngine plus en profondeur. Nous n’avons ici modifié que l’appel des fichiers aspx, mais il est possible de modifier totalement le système de rendu, si par exemple vous ne souhaitez pas utiliser de webforms.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Cross-posté vers &lt;a href="http://www.techheadbrothers.com/"&gt;Tech Head Brothers&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-5065211897464753434?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/5065211897464753434/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=5065211897464753434' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/5065211897464753434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/5065211897464753434'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2009/11/aspnet-mvc-changer-de-viewengine-12.html' title='ASP.NET MVC : Changer de ViewEngine (1/2)'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-1758164442448112676</id><published>2009-10-31T22:51:00.001+01:00</published><updated>2009-10-31T22:51:26.534+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><title type='text'>ASP.NET MVC : Pas de cache dans le Controller Factory</title><content type='html'>&lt;p&gt;J’ai récemment expliqué &lt;a href="http://blog.adhess.net/2009/10/aspnet-mvc-changer-de-controllerfactory.html"&gt;comment changer de Controller Factory&lt;/a&gt; dans MVC, mais depuis ce jour il y a un truc qui me tracasse : l’exemple que j’ai donné n’était pas du tout optimisé. En effet, on instancie un nouveau contrôleur à chaque requête, alors qu’on pourrait très bien en instancier un seul et le mettre en cache. Vu que ça prenait que quelques lignes de code, j’ai décidé d’étendre le DefaultControllerFactory pour y ajouter un cache des contrôleurs. Et là, déception, j’ai une exception lorsque lance mon application :&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;A single instance of controller 'MyMvcApplication.Controllers.HomeController' cannot be used to handle multiple requests. If a custom controller factory is in use, make sure that it creates a new instance of the controller for each request.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;A la première requête, la charge se charge correctement, mais lors du chargement de la seconde page (et donc quand le cache est utilisé), le controller refuse de faire son boulot.&lt;/p&gt;  &lt;p&gt;Je suis allé faire un petit tour dans &lt;a href="http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=33836"&gt;le code source&lt;/a&gt; pour voir comment était créé le contrôleur, et effectivement à chaque requête une nouvelle instance est créée, comme dans mon ControllerFactory perso. D’après Scott Hanselman, mettre en cache une instance d’un contrôleur pourrait avoir des effets de bord non désirés (&lt;a href="http://twitter.com/shanselman/status/5265360733"&gt;source&lt;/a&gt;). Ne vous embêtez donc pas à vouloir optimiser plus que ça, le fonctionnement de base fonctionne très bien… ou alors il vous faudra recoder complètement le contrôleur de base de MVC pour le rendre capable de gérer le cache (bon courage).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-1758164442448112676?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/1758164442448112676/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=1758164442448112676' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/1758164442448112676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/1758164442448112676'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2009/10/aspnet-mvc-pas-de-cache-dans-le.html' title='ASP.NET MVC : Pas de cache dans le Controller Factory'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-8757894288625676720</id><published>2009-10-27T11:20:00.001+01:00</published><updated>2009-10-27T11:20:58.141+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Article'/><title type='text'>Article : les nouveautés d’ASP.NET 4</title><content type='html'>&lt;p&gt;Pour une fois, on va oublier un peu MVC pour en revenir aux bonnes vieilles WebForm. Au programme de ce nouvel article : les nouveautés d’ASP.NET 4 !&lt;/p&gt;  &lt;p&gt;Au programme, de nombreuses optimisations, et quelques nouveautés intéressantes, notamment avec ASP.NET Ajax et le JavaScript.&lt;/p&gt;  &lt;p&gt;Découvrez-le sur le site de Bewise :&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.bewise.fr/article/138/Les-nouveautes-d-ASP-NET4.aspx" href="http://www.bewise.fr/article/138/Les-nouveautes-d-ASP-NET4.aspx"&gt;http://www.bewise.fr/article/138/Les-nouveautes-d-ASP-NET4.aspx&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/5619051591853320584-8757894288625676720?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/8757894288625676720/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=8757894288625676720' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/8757894288625676720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/8757894288625676720'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2009/10/article-les-nouveautes-daspnet-4.html' title='Article : les nouveautés d’ASP.NET 4'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-2106169782239137148</id><published>2009-10-22T09:32:00.001+02:00</published><updated>2009-10-22T09:32:44.521+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Article'/><title type='text'>Article : Utiliser Ajax avec ASP.NET MVC</title><content type='html'>&lt;p&gt;Après mon précédent article, qui présentait les bases de ASP.NET MVC, je me suis dit qu’il pourrait être sympa de faire un peu d’Ajax. &lt;/p&gt;  &lt;p&gt;Dans cet article, pas de JavaScript ni de WebServices (bien qu’il soit tout à fait possible, et certainement très intéressant, d’en faire avec MVC), je me concentre uniquement sur les moyens de faire de l’Ajax spécifiques à MVC, en utilisant l’AjaxHelper du framework.&lt;/p&gt;  &lt;p&gt;Vous allez voir qu’encore une fois, c’est très simple à mettre en place, et la séparation des couches est toujours de la partie puisqu’on utilise toujours les contrôleurs et les vues, de la même manière qu’avec des requêtes http classiques. &lt;/p&gt;  &lt;p&gt;Je vous laisse découvrir l’article sur Tech Head Brothers :&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.techheadbrothers.com/Articles.aspx/ajaxhelper-aspnet-mvc" href="http://www.techheadbrothers.com/Articles.aspx/ajaxhelper-aspnet-mvc"&gt;http://www.techheadbrothers.com/Articles.aspx/ajaxhelper-aspnet-mvc&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/5619051591853320584-2106169782239137148?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/2106169782239137148/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=2106169782239137148' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/2106169782239137148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/2106169782239137148'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2009/10/article-utiliser-ajax-avec-aspnet-mvc.html' title='Article : Utiliser Ajax avec ASP.NET MVC'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-3668949398729122594</id><published>2009-10-19T12:25:00.001+02:00</published><updated>2009-10-19T12:27:44.338+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'>Tip : des ActionLink plus propres avec ASP.NET MVC</title><content type='html'>&lt;p&gt;Malgré tout le bien que je pense d’ASP.NET MVC (qui est, je le rappelle, le meilleur framework de développement web du monde, que dis-je, de l’univers !), je me vois parfois obligé de reconnaître qu’il a des défauts. L’un des plus ennuyeux est l’utilisation de chaînes de caractères et d’objets anonymes dans les helpers Html, source potentielle d’erreurs, qui ne seront pas détectées à la compilation.&lt;/p&gt;  &lt;p&gt;Pour remédier à ce soucis, nous avons la possibilité d’étendre le Html Helper, afin d’ajouter nos propres méthodes de création de liens. &lt;/p&gt;  &lt;p&gt;Pour commencer, nous allons créer une classe par contrôleur, dans laquelle nous définirons les méthodes qui renverront les liens vers chaque action. Cette classe va se baser sur le HtmlHelper pour créer les liens, donc n’oublions pas de le passer dans le constructeur :&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: #dcdcdc; white-space: nowrap; overflow: scroll"&gt;&lt;font face=" Courier New"&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;HomeLinks          &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; {          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;private&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;HtmlHelper&lt;/font&gt;&lt;font color="#000000"&gt; html;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt; HomeLinks(&lt;/font&gt;&lt;font color="#2b91af"&gt;HtmlHelper&lt;/font&gt;&lt;font color="#000000"&gt; html)          &lt;br /&gt;&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;.html = html;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }           &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;String&lt;/font&gt;&lt;font color="#000000"&gt; Index(&lt;/font&gt;&lt;font color="#2b91af"&gt;String&lt;/font&gt;&lt;font color="#000000"&gt; linkText)          &lt;br /&gt;&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;font color="#000000"&gt; html.ActionLink(linkText, &lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;Index&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;, &lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;Home&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;);          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }           &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;String&lt;/font&gt;&lt;font color="#000000"&gt; Details(&lt;/font&gt;&lt;font color="#2b91af"&gt;String&lt;/font&gt;&lt;font color="#000000"&gt; linkText, &lt;/font&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;font color="#000000"&gt; id)          &lt;br /&gt;&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;font color="#000000"&gt; html.ActionLink(linkText, &lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;Details&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;, &lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;Home&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;, &lt;/font&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;font color="#000000"&gt; { id = id });          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Une fois cette classe créée, on va ajouter une méthode au HtmlHelper pour pouvoir y accéder depuis notre vue :&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: #dcdcdc; white-space: nowrap; overflow: scroll"&gt;&lt;font face=" Courier New"&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;static&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;LinkHelper          &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; {          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;static&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;HomeLinks&lt;/font&gt;&lt;font color="#000000"&gt; HomeLinks(&lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;HtmlHelper&lt;/font&gt;&lt;font color="#000000"&gt; Html)          &lt;br /&gt;&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;HomeLinks&lt;/font&gt;&lt;font color="#000000"&gt;(Html);          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }           &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;static&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;AccountLinks&lt;/font&gt;&lt;font color="#000000"&gt; AccountLinks(&lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;HtmlHelper&lt;/font&gt;&lt;font color="#000000"&gt; Html)          &lt;br /&gt;&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;AccountLinks&lt;/font&gt;&lt;font color="#000000"&gt;(Html);          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Notez que j’ai séparé les liens de chaque contrôleur dans des classes distinctes par soucis de clarté, mais ce n’est absolument pas obligatoire : vous pouvez si vous le souhaitez étendre directement le HtmlHelper par vos liens :&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: #dcdcdc; white-space: nowrap; overflow: scroll"&gt;&lt;font face=" Courier New"&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;static&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;String&lt;/font&gt;&lt;font color="#000000"&gt; Index(&lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;HtmlHelper&lt;/font&gt;&lt;font color="#000000"&gt; Html, &lt;/font&gt;&lt;font color="#2b91af"&gt;String&lt;/font&gt;&lt;font color="#000000"&gt; linkText)          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;font color="#000000"&gt; Html.ActionLink(linkText, &lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;Index&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;, &lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;Home&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;);          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Pour pouvoir appeler vos méthodes depuis vos pages aspx, n’oubliez pas d’ajouter leur namespace dans le web.config :&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: #dcdcdc; white-space: nowrap; overflow: scroll"&gt;&lt;font face=" Courier New"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;font color="#a31515"&gt;pages&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;font color="#a31515"&gt;namespaces&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;font color="#a31515"&gt;add&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#ff0000"&gt;namespace&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff"&gt;MyMvcApp.LinkHelpers&lt;/font&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/font&gt;&lt;font color="#a31515"&gt;namespaces&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/font&gt;&lt;font color="#a31515"&gt;pages&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/font&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Et voilà, plus besoin de faire passer de chaines de caractères en dur dans vos liens, vous pouvez utiliser ces méthodes avec des vrais noms et des paramètres typés !&lt;/p&gt;  &lt;p&gt;Ainsi, les 2 lignes suivantes créeront le même lien :&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: #dcdcdc; white-space: nowrap; overflow: scroll"&gt;&lt;font face=" Courier New"&gt;&lt;font size="2"&gt;&amp;lt;%&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#000000"&gt; Html.ActionLink(&lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;Details pour l'id numero 5&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;, &lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;Details&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;, &lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;Home&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;, &lt;/font&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;font color="#000000"&gt; { id = 5 }&amp;#160; %&amp;gt;          &lt;br /&gt;&amp;lt;%&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#000000"&gt; Html.HomeLinks().Details(&lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;Details pour l'id numero 5&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;, 5) %&amp;gt; &lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-3668949398729122594?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/3668949398729122594/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=3668949398729122594' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/3668949398729122594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/3668949398729122594'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2009/10/tip-des-actionlink-plus-propres-avec.html' title='Tip : des ActionLink plus propres avec ASP.NET MVC'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-5636552041755477511</id><published>2009-10-16T14:06:00.001+02:00</published><updated>2009-10-16T15:22:44.275+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>ASP.NET MVC : changer de ControllerFactory</title><content type='html'>&lt;p&gt;Le framework ASP.NET MVC utilise ce qu’on appelle “convention over configuration”, ce qui signifie qu’on n’a pas besoin de configurer manuellement notre application pour avoir une application qui fonctionne, tant que l’on respecte certaines conventions. Si l’on ne souhaite pas utiliser ces conventions, on a toujours la possibilité de configurer l’application pour travailler autrement.&lt;/p&gt;  &lt;p&gt;En pratique, qu’est-ce que ça signifie ?&lt;/p&gt;  &lt;p&gt;Lorsque l’on crée un nouveau projet MVC, les contrôleurs sont disposés dans le dossier « Controllers » de l’application, et leur nom doit forcément se terminer par « Controller ». Si on crée un contrôleur dans un autre namespace, ou si son nom est incorrect, le contrôleur ne sera pas reconnu par MVC. Pour pouvoir changer cette convention, on a la possibilité de créer notre propre ControllerFactory, dans lequel on pourra définir nos règles d’appel de nos contrôleurs.&lt;/p&gt;  &lt;p&gt;Pour créer un ControllerFactory, il va falloir créer une nouvelle classe qui implémentera l’interface IControllerFactory, contenant 2 méthodes :&lt;/p&gt;  &lt;p&gt;IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName)    &lt;br /&gt;et     &lt;br /&gt;void ReleaseController(IController controller)&lt;/p&gt;  &lt;p&gt;La première va nous permettre de renvoyer une instance d’un contrôleur en fonction de son nom, et éventuellement de paramètres venant de la requête ; la seconde va nous permettre de libérer un contrôleur qui n’est plus utilisé. Le résultat ressemblera à quelque chose comme ça :&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: #dcdcdc; white-space: nowrap; overflow: scroll"&gt;&lt;font face=" Courier New"&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;CustomControllerFactory&lt;/font&gt;&lt;font color="#000000"&gt; : &lt;/font&gt;&lt;font color="#2b91af"&gt;IControllerFactory          &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; {          &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;IController&lt;/font&gt;&lt;font color="#000000"&gt; CreateController(System.Web.Routing.&lt;/font&gt;&lt;font color="#2b91af"&gt;RequestContext&lt;/font&gt;&lt;font color="#000000"&gt; requestContext, &lt;/font&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;font color="#000000"&gt; controllerName)          &lt;br /&gt;&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#000000"&gt; (&lt;/font&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;font color="#000000"&gt;.IsNullOrEmpty(controllerName))          &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="#0000ff"&gt;throw&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;ArgumentNullException&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;Controller name can't be empty&amp;quot;&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#2b91af"&gt;String&lt;/font&gt;&lt;font color="#000000"&gt; controllerType = &lt;/font&gt;&lt;font color="#2b91af"&gt;String&lt;/font&gt;&lt;font color="#000000"&gt;.Concat(&lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;MyMvcApplication.CustomController.&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;, controllerName);          &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; &lt;/font&gt;&lt;font color="#2b91af"&gt;IController&lt;/font&gt;&lt;font color="#000000"&gt; controller = &lt;/font&gt;&lt;font color="#2b91af"&gt;Activator&lt;/font&gt;&lt;font color="#000000"&gt;.CreateInstance(&lt;/font&gt;&lt;font color="#2b91af"&gt;Type&lt;/font&gt;&lt;font color="#000000"&gt;.GetType(controllerType)) &lt;/font&gt;&lt;font color="#0000ff"&gt;as&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;IController&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;font color="#000000"&gt; controller;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }           &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;font color="#000000"&gt; ReleaseController(&lt;/font&gt;&lt;font color="#2b91af"&gt;IController&lt;/font&gt;&lt;font color="#000000"&gt; controller)          &lt;br /&gt;&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; &lt;/font&gt;&lt;font color="#2b91af"&gt;IDisposable&lt;/font&gt;&lt;font color="#000000"&gt; disposableController = controller &lt;/font&gt;&lt;font color="#0000ff"&gt;as&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;IDisposable&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#000000"&gt; (disposableController != &lt;/font&gt;&lt;font color="#0000ff"&gt;null&lt;/font&gt;&lt;font color="#000000"&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; disposableController.Dispose();           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }           &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Une fois notre classe créée, il faut l’enregistrer pour qu’elle soit utilisée à la place de la Factory par défaut. Pour ça, on a une méthode SetControllerFactory qu’il nous faut appeler au démarrage de l’application, dans le global.asax :&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: #dcdcdc; white-space: nowrap; overflow: scroll"&gt;&lt;font face=" Courier New"&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;protected&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;font color="#000000"&gt; Application_Start()          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RegisterRoutes(&lt;/font&gt;&lt;font color="#2b91af"&gt;RouteTable&lt;/font&gt;&lt;font color="#000000"&gt;.Routes);          &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#2b91af"&gt;ControllerBuilder&lt;/font&gt;&lt;font color="#000000"&gt;.Current.SetControllerFactory(&lt;/font&gt;&lt;font color="#0000ff"&gt;typeof&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2b91af"&gt;CustomControllerFactory&lt;/font&gt;&lt;font color="#000000"&gt;));          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Une fois ceci fait, nos anciens contrôleurs ne sont plus appelés, la recherche se fera dans le namespace MyMvcApplication.CustomController comme cela a été défini dans notre CustomControllerFactory.&lt;/p&gt;  &lt;p&gt;Crossposté vers &lt;a href="http://www.techheadbrothers.com/Astuces.aspx/aspnet-mvc-changer-controllerfactory"&gt;Tech Head Brothers&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/5619051591853320584-5636552041755477511?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/5636552041755477511/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=5636552041755477511' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/5636552041755477511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/5636552041755477511'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2009/10/aspnet-mvc-changer-de-controllerfactory.html' title='ASP.NET MVC : changer de ControllerFactory'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-3478235960250109361</id><published>2009-10-03T12:40:00.001+02:00</published><updated>2009-10-03T14:54:13.662+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Convertir le temps Unix en DateTime .NET</title><content type='html'>&lt;p&gt;Si vous faites du .NET, il y a peu de chances que vous ayez besoin d’utiliser le temps Unix. Cependant, si jamais vous en avez besoin, il n’y a pas à ma connaissance de méthode effectuant la conversion dans le framework .NET, il va donc falloir effectuer la conversion à la main. Heureusement, ce n’est pas compliqué.&lt;/p&gt;  &lt;p&gt;Le temps Unix est défini par un nombre entier, représentant le nombre de secondes écoulées depuis le début de l’univers, le 1er janvier 1970. Lorsqu’on sait ça, la conversion est toute simple :&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: #dcdcdc; white-space: nowrap; overflow: scroll"&gt;&lt;font face=" Courier New"&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;private&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;static&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;DateTime&lt;/font&gt;&lt;font color="#000000"&gt; origin = &lt;/font&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;DateTime&lt;/font&gt;&lt;font color="#000000"&gt;(1970, 1, 1);          &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;static&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;DateTime&lt;/font&gt;&lt;font color="#000000"&gt; UnixTimeToDateTime(&lt;/font&gt;&lt;font color="#0000ff"&gt;long&lt;/font&gt;&lt;font color="#000000"&gt; timespan)          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;font color="#000000"&gt; origin.AddSeconds(timespan);          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }           &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;static&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;long&lt;/font&gt;&lt;font color="#000000"&gt; DateTimeToUnixTime(&lt;/font&gt;&lt;font color="#2b91af"&gt;DateTime&lt;/font&gt;&lt;font color="#000000"&gt; date)          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#2b91af"&gt;TimeSpan&lt;/font&gt;&lt;font color="#000000"&gt; ts = date - origin;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;font color="#000000"&gt; (&lt;/font&gt;&lt;font color="#0000ff"&gt;long&lt;/font&gt;&lt;font color="#000000"&gt;)ts.TotalSeconds;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Pour la petite histoire, lorsque le temps Unix est codé sur un entier 32 bits, on ne peux coder les dates que jusqu’au 19 janvier 2038, si ce système est encore utilisé ce jour là, on risque d’avoir le fameux &lt;a href="http://fr.wikipedia.org/wiki/Bogue_de_l'an_2038"&gt;bug de l’an 2038&lt;/a&gt;, un bug &lt;a href="http://xkcd.com/607/"&gt;encore pire que le bug de l’an 2000&lt;/a&gt;. Heureusement, les systèmes 64 bits devraient se généraliser dans les années à venir pour nous éviter ces problèmes.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-3478235960250109361?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/3478235960250109361/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=3478235960250109361' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/3478235960250109361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/3478235960250109361'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2009/10/convertir-le-temps-unix-en-datetime-net.html' title='Convertir le temps Unix en DateTime .NET'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-8685904696766794153</id><published>2009-09-16T13:02:00.001+02:00</published><updated>2009-09-17T17:25:40.497+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><title type='text'>Microsoft annonce son Ajax Content Delivery Network.</title><content type='html'>&lt;p&gt;Il faut croire que Scott Guthrie lis régulièrement mon blog, puisque suite à &lt;a href="http://blog.adhess.net/2009/09/referencer-des-scripts-javascript-dans.html"&gt;mon dernier post&lt;/a&gt;, il vient de bloguer pour annoncer &lt;a href="http://weblogs.asp.net/scottgu/archive/2009/09/15/announcing-the-microsoft-ajax-cdn.aspx"&gt;le lancement du Microsoft Ajax CDN&lt;/a&gt;. (et j’ai découvert par la même occasion ce qu’était un &lt;a href="http://fr.wikipedia.org/wiki/Content_Delivery_Network"&gt;CDN&lt;/a&gt;, un peu de culture ne fais jamais de mal :)&lt;/p&gt;  &lt;p&gt;Ce CDN est un ensemble de serveurs qui vont proposer plusieurs librairies Ajax (pour le moment sont disponibles les librairies ASP.NET Ajax et jQuery [update: le pluin de validation jQuery est aussi disponible : &lt;a href="http://stephenwalther.com/blog/archive/2009/09/16/microsoft-ajax-cdn-and-the-jquery-validation-library.aspx"&gt;blog de Stephen Walther&lt;/a&gt;]) que vous pourrez référencer directement depuis votre site web. C’est totalement gratuit et sans inscription préalable, il suffit de faire un lien directement vers le fichier javascript :&lt;/p&gt;  &lt;p&gt;&lt;font face=" Courier New"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#a31515"&gt;script&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#ff0000"&gt;src&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;http://ajax.Microsoft.com/ajax/jQuery/jquery-1.3.2.min.js&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#ff0000"&gt;type&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/&lt;/font&gt;&lt;font color="#a31515"&gt;script&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Ceci a plusieurs avantages :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;La requête sera plus rapide (à moins que vous n’ayez une infrastructure comparable à celle de Microsoft ;) &lt;/li&gt;    &lt;li&gt;Si l’utilisateur est allé sur un autre site référençant le même fichier, il sera déjà en cache &lt;/li&gt;    &lt;li&gt;La bande passante est offerte (même si les fichiers JS c’est pas ce qui en consomme le plus, c’est déjà ça de pris) &lt;/li&gt;    &lt;li&gt;On s’embête plus avec les liens relatifs (ça c’est moi qui l’ajoute, mais j’avoue que c’est quand même léger comme avantage :) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Le CDN sera aussi intégré à ASP.NET 4, puisqu’on pourra préciser dans le ScriptManager si on désire l’utiliser :&lt;/p&gt;  &lt;p&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/_1fIQLbpqRAw/SrDFrMg8OrI/AAAAAAAABq4/ImGZUhxvfdw/image%5B4%5D.png?imgmax=800" width="240" height="118" /&gt;&lt;/p&gt;  &lt;p&gt;La liste des fichiers disponibles sur le CDN peut être consultée sur le site d’ASP.NET : &lt;a title="http://www.asp.net/ajax/cdn/" href="http://www.asp.net/ajax/cdn/"&gt;http://www.asp.net/ajax/cdn/&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/5619051591853320584-8685904696766794153?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/8685904696766794153/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=8685904696766794153' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/8685904696766794153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/8685904696766794153'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2009/09/microsoft-annonce-son-ajax-content.html' title='Microsoft annonce son Ajax Content Delivery Network.'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_1fIQLbpqRAw/SrDFrMg8OrI/AAAAAAAABq4/ImGZUhxvfdw/s72-c/image%5B4%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-171568572111434739</id><published>2009-09-07T15:43:00.002+02:00</published><updated>2009-09-17T17:29:46.579+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><title type='text'>Référencer des scripts JavaScript dans une MasterPage</title><content type='html'>&lt;p&gt;Lorsqu’on utilise des fichiers JavaScript externes, il faut les référencer dans l’en-tête de notre page html, tout comme on le fait pour nos fichiers CSS. Par contre, contrairement aux fichiers CSS, les références vers les fichiers JavaScript peuvent poser problème si la MasterPage est utilisée par plusieurs pages situées dans des dossiers différents.&lt;/p&gt;  &lt;p&gt;L’en-tête de nos pages aspx contient l’attribut runat=”server” par défaut, ce qui va permettre au serveur de parcourir le contenu du &amp;lt;head&amp;gt;, afin de mettre à jour les liens vers nos fichiers css (ou d’autres types de liens, si par exemple vous avez défini un flux RSS). Cependant, ceci ne s’applique pas aux balises &amp;lt;script&amp;gt;, utilisées pour appeler les fichiers JavaScript : si on essaie d’interpréter cette balise coté serveur, le serveur va essayer d’exécuter son contenu (et donc le contenu du fichier .js), ce qui ne fonctionnera pas puisque le JavaScript est du code destiné au navigateur.&lt;/p&gt;  &lt;p&gt;Pour référencer correctement nos fichiers, il va donc falloir explicitement demander la construction du chemin relatif correct. Pour cela, il va nous falloir utiliser la méthode ResolveClientUrl de la classe Control.&lt;/p&gt;  &lt;p&gt;&lt;font face=" Courier New"&gt;&lt;font color="#0000ff"&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#a31515"&gt;script&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#ff0000"&gt;src&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;%= ResolveClientUrl(&amp;quot;~/Scripts/jquery-1.3.2.js&amp;quot;)%&amp;gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#ff0000"&gt;type&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/&lt;/font&gt;&lt;font color="#a31515"&gt;script&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt; &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Ceci fonctionne aussi bien avec ASP.NET Webforms qu’avec le nouveau Framework ASP.NET MVC.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-171568572111434739?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/171568572111434739/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=171568572111434739' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/171568572111434739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/171568572111434739'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2009/09/referencer-des-scripts-javascript-dans.html' title='Référencer des scripts JavaScript dans une MasterPage'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-5702301067662354499</id><published>2009-09-07T11:22:00.001+02:00</published><updated>2009-09-09T14:41:46.227+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'>Article : introduction à ASP.NET MVC</title><content type='html'>&lt;p&gt;Les plus observateurs de mes lecteurs auront certainement remarqué que je me suis dernièrement pris de passion pour ASP.NET MVC. &lt;/p&gt;  &lt;p&gt;Effectivement, je suis vraiment devenu fan de ce nouveau Framework, et je ne pouvait pas garder ça pour moi… &lt;/p&gt;  &lt;p&gt;J’ai donc écrit un article, et qui est disponible sur le site de Bewise :&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.bewise.fr/article/129/Introduction-a-ASP-NET-MVC.aspx" href="http://www.bewise.fr/article/129/Introduction-a-ASP-NET-MVC.aspx"&gt;Introduction à ASP.NET MVC&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/5619051591853320584-5702301067662354499?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/5702301067662354499/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=5702301067662354499' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/5702301067662354499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/5702301067662354499'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2009/09/article-introduction-aspnet-mvc.html' title='Article : introduction à ASP.NET MVC'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-5556584187956924698</id><published>2009-08-21T10:10:00.001+02:00</published><updated>2009-08-21T10:19:43.938+02:00</updated><title type='text'>Formations Microsoft à des prix TRES préférentiels !!</title><content type='html'>&lt;p&gt;Les températures grimpent, nos prix baissent !&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://www.bewise.fr/actualite/90/Offres-promotionnelles.aspx"&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://lh4.ggpht.com/_1fIQLbpqRAw/So5WhEolRfI/AAAAAAAABqU/EJnZK_Bl9NU/image%5B12%5D.png?imgmax=800" width="319" height="178" /&gt;&lt;/a&gt;&lt;a href="http://www.bewise.fr/actualite/90/Offres-promotionnelles.aspx"&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/_1fIQLbpqRAw/So5WiE06gwI/AAAAAAAABqY/EDAVHTPOrgQ/image%5B13%5D.png?imgmax=800" width="292" height="172" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Microsoft et Bewise vous proposent de profiter de cette fin d’été pour former vos collaborateurs aux sujets suivants : &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Découverte de Windows Azure &lt;/li&gt;    &lt;li&gt;Développement parallèle avec ParallelFX 4.0 &lt;/li&gt;    &lt;li&gt;Nouveautés SQL Server 2008 &lt;/li&gt;    &lt;li&gt;Découverte de .Net 4.0 et Visual Studio 2010 &lt;/li&gt;    &lt;li&gt;Utilisation avancée de Silverlight &lt;/li&gt;    &lt;li&gt;Utilisation avancée de WPF &lt;/li&gt;    &lt;li&gt;Découverte de Silverlight &lt;/li&gt;    &lt;li&gt;Découverte de WPF &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;· &lt;i&gt;&lt;u&gt;Date &lt;/u&gt;&lt;/i&gt;: chacune de ces formations sera donnée sur septembre et/ou octobre 2009&lt;/p&gt;  &lt;p&gt;· &lt;i&gt;&lt;u&gt;Durée&lt;/u&gt;&lt;/i&gt; : 3 jours chacune&lt;/p&gt;  &lt;p&gt;· &lt;i&gt;&lt;u&gt;Lieu&lt;/u&gt;&lt;/i&gt; : chez Bewise ou dans vos locaux&lt;/p&gt;  &lt;p&gt;· &lt;i&gt;&lt;u&gt;Formateur – consultant&lt;/u&gt;&lt;/i&gt; : certifié Microsoft Certified Trainer (MCT)&lt;/p&gt;  &lt;p&gt;· &lt;i&gt;&lt;u&gt;Financement&lt;/u&gt;&lt;/i&gt; : Bewise est centre de formation agréé pour une prise en charge par vos OPCA&lt;/p&gt;  &lt;p&gt;· &lt;i&gt;&lt;u&gt;Prix&lt;/u&gt;&lt;/i&gt; : &lt;strong&gt;&lt;font color="#ff0000"&gt;490 € HT par stagiaire pour les 3 jours de formation !!!!&lt;/font&gt;&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;&lt;b&gt;Contactez-nous au 05 61 75 13 13&lt;/b&gt; pour connaitre les dates précises de la formation qui vous intéresse et les places disponibles !&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-5556584187956924698?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/5556584187956924698/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=5556584187956924698' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/5556584187956924698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/5556584187956924698'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2009/08/formations-microsoft-des-prix-tres.html' title='Formations Microsoft à des prix TRES préférentiels !!'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_1fIQLbpqRAw/So5WhEolRfI/AAAAAAAABqU/EJnZK_Bl9NU/s72-c/image%5B12%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-2836026946925086445</id><published>2009-08-06T12:58:00.001+02:00</published><updated>2009-08-24T18:11:42.651+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><title type='text'>Localisation avec ASP.NET MVC</title><content type='html'>&lt;span xmlns="xmlns"&gt;   &lt;p&gt;Et oui, je suis encore en train de m'amuser avec la preview de MVC 2. A force de découvrir de nouvelles fonctionnalités qui roxent toutes plus les unes que les autres, je m'étais fait à l'idée que MVC était parfait…      &lt;br /&gt;&lt;/p&gt;    &lt;p&gt;Jusqu'à la nuit dernière, où j'ai fait un cauchemar : je devais gérer la localisation dans un site web, et je ne savait pas comment faire ! En effet, si ASP.NET gère très facilement la localisation sur les contrôles serveur, avec MVC on a tendance à ne pas les utiliser, et l'outil de génération des fichiers de ressources, même s'il est toujours présent, ne génère donc rien. Je me suis donc levé, ai rallumé mon ordinateur, et me suis penché sur la question.     &lt;br /&gt;&lt;/p&gt;    &lt;p&gt;Eh bien, je ne vais pas faire durer le suspens plus longtemps, la gestion de la localisation avec MVC n'est pas beaucoup plus compliquée qu'avant. En effet, si les fichiers de ressource ne sont pas générés automatiquement, rien ne nous empêche de les créer nous même et de les appeler dans nos pages.     &lt;br /&gt;&lt;/p&gt;    &lt;p&gt;J'ai donc créé un fichier Strings.resx, Strings.fr.resx et Strings.en.resx ; dans lequel j'ai mis une chaine de caractère nommée &amp;quot;Texte1&amp;quot;, que j'ai traduite en anglais et en français.      &lt;br /&gt;Dans la page aspx, pour afficher mon texte localisé, c'est tout simple :       &lt;br /&gt;&amp;#160; &amp;lt;%= Strings.Texte1 %&amp;gt;       &lt;br /&gt;Ceci affiche donc mon texte dans la bonne langue, en fonction de la culture sélectionnée. Rien de bien compliqué, donc…      &lt;br /&gt;&lt;/p&gt;    &lt;p&gt;Là où je me suis un peu plus creusé la tête, c'est quand j'ai voulu donner à l'utilisateur la possibilité de changer de langue. Encore une fois, c'est pas plus compliqué qu'en ASP.NET classique. N'oublions pas que dans ASP.NET MVC, il y a ASP.NET : une ViewPage MVC est une page comme une autre !      &lt;br /&gt;Pour changer la culture d'une page, il suffit de changer la culture du thread courant dans la méthode InitializeCulture() de la page.       &lt;br /&gt;Mais comment faire ici, puisque avec MVC on n'a plus de code behind ? Eh bien, tout simplement en changeant la page de base. Dans les directives de mes pages aspx, j'ai changé ça:       &lt;br /&gt;&lt;span style="font-family: courier new; font-size: 10pt"&gt;&lt;span style="background-color: yellow"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue"&gt;@ &lt;/span&gt;&lt;span style="color: #a31515"&gt;Page &lt;/span&gt;&lt;span style="color: red"&gt;Inherits&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;System.Web.Mvc.ViewPage&amp;quot; &lt;/span&gt;&lt;span style="background-color: yellow"&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;      &lt;br /&gt;par :       &lt;br /&gt;&lt;span style="font-family: courier new; font-size: 10pt"&gt;&lt;span style="background-color: yellow"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue"&gt;@ &lt;/span&gt;&lt;span style="color: #a31515"&gt;Page &lt;/span&gt;&lt;span style="color: red"&gt;Inherits&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;MvcTools.BasePage&amp;quot; &lt;/span&gt;&lt;span style="background-color: yellow"&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;      &lt;br /&gt;&lt;/p&gt;    &lt;p&gt;Avec ma classe BasePage qui hérite de ViewPage et qui redéfinit le InitializeCulture() :     &lt;br /&gt;&lt;/p&gt;    &lt;p&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/_1fIQLbpqRAw/SpK7vQn3ZbI/AAAAAAAABqk/srEPkqrUo0c/image%5B5%5D.png?imgmax=800" width="529" height="531" /&gt; &lt;/p&gt;    &lt;p&gt;Dans cet exemple, on vérifie au chargement de la page si la culture est sauvegardée en session, si elle n'existe pas on définit une culture par défaut ; puis on change la culture du thread courant. Il suffit de faire ça pour qu'au chargement de notre page aspx le bon fichier de ressource soit chargé.     &lt;br /&gt;&lt;/p&gt;    &lt;p&gt;Ensuite, pour que l'utilisateur puisse changer de ressource, c'est tout simple : on est en MVC, on crée donc une action dans notre contrôleur qui va changer la culture. Puisqu'on a défini la culture dans la Session, on y a directement accès depuis le contrôleur pour le mettre à jour :     &lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;img alt="" src="http://lh6.ggpht.com/_1fIQLbpqRAw/Snq3ZU-Sw8I/AAAAAAAABhU/TnDRnr9ncxo/image%5B11%5D.png?imgmax=800" /&gt;&lt;/p&gt; &lt;/span&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-2836026946925086445?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/2836026946925086445/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=2836026946925086445' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/2836026946925086445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/2836026946925086445'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2009/08/localisation-avec-aspnet-mvc.html' title='Localisation avec ASP.NET MVC'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_1fIQLbpqRAw/SpK7vQn3ZbI/AAAAAAAABqk/srEPkqrUo0c/s72-c/image%5B5%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-1896920786455660642</id><published>2009-08-05T11:00:00.001+02:00</published><updated>2009-10-19T11:10:52.939+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVC 2'/><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='Linq'/><title type='text'>Utiliser les DataAnnotations avec LinqToSql</title><content type='html'>&lt;p&gt;ASP.NET MVC 2 est arrivé avec une nouveauté très pratique : la validation de données par DataAnnotation. Le principe : on définit sur notre modèle les contraintes à vérifier, et MVC se charge de faire les vérifications (côté serveur uniquement dans la première preview, et normalement une vérification client devrait être générée à l’aide de jQuery dans les prochaines versions).&lt;/p&gt;  &lt;p&gt;Par exemple, j’ai la classe suivante :&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: #dcdcdc; white-space: nowrap; overflow: scroll"&gt;&lt;font face=" Courier New"&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;Contact          &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; {          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;String&lt;/font&gt;&lt;font color="#000000"&gt; Login { &lt;/font&gt;&lt;font color="#0000ff"&gt;get&lt;/font&gt;&lt;font color="#000000"&gt;; &lt;/font&gt;&lt;font color="#0000ff"&gt;set&lt;/font&gt;&lt;font color="#000000"&gt;; }          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;String&lt;/font&gt;&lt;font color="#000000"&gt; Email { &lt;/font&gt;&lt;font color="#0000ff"&gt;get&lt;/font&gt;&lt;font color="#000000"&gt;; &lt;/font&gt;&lt;font color="#0000ff"&gt;set&lt;/font&gt;&lt;font color="#000000"&gt;; }          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;Int16&lt;/font&gt;&lt;font color="#000000"&gt; Age { &lt;/font&gt;&lt;font color="#0000ff"&gt;get&lt;/font&gt;&lt;font color="#000000"&gt;; &lt;/font&gt;&lt;font color="#0000ff"&gt;set&lt;/font&gt;&lt;font color="#000000"&gt;; }          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Je vais pouvoir lui ajouter les règles de validation de cette manière (sans oublier de référencer System.ComponentModel.DataAnnotations) :&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: #dcdcdc; white-space: nowrap; overflow: scroll"&gt;&lt;font face=" Courier New"&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;Contact          &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; {          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [&lt;/font&gt;&lt;font color="#2b91af"&gt;Required&lt;/font&gt;&lt;font color="#000000"&gt;(ErrorMessage=&lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;The login is required&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)]          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [&lt;/font&gt;&lt;font color="#2b91af"&gt;StringLength&lt;/font&gt;&lt;font color="#000000"&gt;(20, ErrorMessage=&lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;Must be less than 20 characters&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)]          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;String&lt;/font&gt;&lt;font color="#000000"&gt; Login { &lt;/font&gt;&lt;font color="#0000ff"&gt;get&lt;/font&gt;&lt;font color="#000000"&gt;; &lt;/font&gt;&lt;font color="#0000ff"&gt;set&lt;/font&gt;&lt;font color="#000000"&gt;; }          &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [&lt;/font&gt;&lt;font color="#2b91af"&gt;Required&lt;/font&gt;&lt;font color="#000000"&gt;(ErrorMessage=&lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;The e-mail is required&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)]          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [&lt;/font&gt;&lt;font color="#2b91af"&gt;RegularExpression&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#a31515"&gt;@&amp;quot;([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,ErrorMessage=&lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;Incorrect e-mail address&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)]          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;String&lt;/font&gt;&lt;font color="#000000"&gt; Email { &lt;/font&gt;&lt;font color="#0000ff"&gt;get&lt;/font&gt;&lt;font color="#000000"&gt;; &lt;/font&gt;&lt;font color="#0000ff"&gt;set&lt;/font&gt;&lt;font color="#000000"&gt;; }          &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [&lt;/font&gt;&lt;font color="#2b91af"&gt;Range&lt;/font&gt;&lt;font color="#000000"&gt;(0,120)]          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;Int16&lt;/font&gt;&lt;font color="#000000"&gt; Age { &lt;/font&gt;&lt;font color="#0000ff"&gt;get&lt;/font&gt;&lt;font color="#000000"&gt;; &lt;/font&gt;&lt;font color="#0000ff"&gt;set&lt;/font&gt;&lt;font color="#000000"&gt;; }          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Par contre, un problème se pose lorsque notre modèle provient de code généré. Si on veut annoter nos classes, toutes nos règles de validations disparaitront si on regénère le code. &lt;/p&gt;  &lt;p&gt;Heureusement, les p’tits gars de chez Microsoft ont pensé à tout, et nous ont fourni un système pour mettre nos annotations dans une classe partielle :&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: #dcdcdc; white-space: nowrap; overflow: scroll"&gt;&lt;font face=" Courier New"&gt;&lt;font size="2"&gt;[&lt;/font&gt;&lt;font color="#2b91af"&gt;MetadataType&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#0000ff"&gt;typeof&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#2b91af"&gt;ContactMD&lt;/font&gt;&lt;font color="#000000"&gt;))]          &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;partial&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;Contact          &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;{          &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;private&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;ContactMD          &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; {          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [&lt;/font&gt;&lt;font color="#2b91af"&gt;Required&lt;/font&gt;&lt;font color="#000000"&gt;(ErrorMessage = &lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;The login is required&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)]          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [&lt;/font&gt;&lt;font color="#2b91af"&gt;StringLength&lt;/font&gt;&lt;font color="#000000"&gt;(20, ErrorMessage = &lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;Must be less than 20 characters&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)]          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;String&lt;/font&gt;&lt;font color="#000000"&gt; Login { &lt;/font&gt;&lt;font color="#0000ff"&gt;get&lt;/font&gt;&lt;font color="#000000"&gt;; &lt;/font&gt;&lt;font color="#0000ff"&gt;set&lt;/font&gt;&lt;font color="#000000"&gt;; }          &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [&lt;/font&gt;&lt;font color="#2b91af"&gt;Required&lt;/font&gt;&lt;font color="#000000"&gt;(ErrorMessage = &lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;The e-mail is required&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)]          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [&lt;/font&gt;&lt;font color="#2b91af"&gt;RegularExpression&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#a31515"&gt;@&amp;quot;([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;, ErrorMessage = &lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;Incorrect e-mail address&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)]          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;String&lt;/font&gt;&lt;font color="#000000"&gt; Email { &lt;/font&gt;&lt;font color="#0000ff"&gt;get&lt;/font&gt;&lt;font color="#000000"&gt;; &lt;/font&gt;&lt;font color="#0000ff"&gt;set&lt;/font&gt;&lt;font color="#000000"&gt;; }          &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [&lt;/font&gt;&lt;font color="#2b91af"&gt;Range&lt;/font&gt;&lt;font color="#000000"&gt;(0, 120)]          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;Int16&lt;/font&gt;&lt;font color="#000000"&gt; Age { &lt;/font&gt;&lt;font color="#0000ff"&gt;get&lt;/font&gt;&lt;font color="#000000"&gt;; &lt;/font&gt;&lt;font color="#0000ff"&gt;set&lt;/font&gt;&lt;font color="#000000"&gt;; }          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }           &lt;br /&gt;}&lt;/font&gt;&lt;/font&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Ici, la classe Contact a été générée par LinqToSql, et contient les propriétés Login, Email et Age. Je ne peux donc pas les remettre dans la classe partielle.    &lt;br /&gt;Il faut dans ce cas créer une autre classe, ContactMD, qui contient les mêmes propriétés que Contact, et sur laquelle on mets nos annotations.     &lt;br /&gt;Et on ajoute une annotation MetadataType sur notre classe Contact pour définir dans quelle classe se trouvent les annotations.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-1896920786455660642?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/1896920786455660642/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=1896920786455660642' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/1896920786455660642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/1896920786455660642'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2009/08/mvc-utiliser-les-dataannotations-avec.html' title='Utiliser les DataAnnotations avec LinqToSql'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-8443796879208752551</id><published>2009-08-04T17:59:00.001+02:00</published><updated>2009-10-23T14:54:56.191+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><title type='text'>ASP.NET MVC, Ajax, et XHTML : on ne plaisante pas avec la validité du code !</title><content type='html'>&lt;p&gt;Update : Avec la preview 2, le problème est malheureusement toujours présent.&lt;/p&gt;  &lt;p&gt;Si vous êtes tombé ici en cherchant comment faire de l’Ajax avec ASP.NET MVC, je vous conseille d’aller voir cet article sur Tech Head Brothers : &lt;a href="http://www.techheadbrothers.com/Articles.aspx/ajaxhelper-aspnet-mvc"&gt;L’AjaxHelper de ASP.NET MVC&lt;/a&gt;&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;Ce post est une réaction à chaud après avoir perdu quelques heures à comprendre pourquoi mon appel Ajax ne fonctionnait pas.&lt;/p&gt;  &lt;p&gt;Je viens d’installer la preview d’&lt;a href="http://weblogs.asp.net/scottgu/archive/2009/07/31/asp-net-mvc-v2-preview-1-released.aspx"&gt;ASP.NET MVC 2&lt;/a&gt;, et après avoir découvert avec enthousiasme les nouveautés, j’ai décidé de tester les Ajax Helpers que je n’avais pas encore pris le temps de regarder dans la première version.&lt;/p&gt;  &lt;p&gt;J’ai donc décidé de faire un moteur de recherche asynchrone : une textbox, un bouton pour valider, et une zone avec les résultats qui se mettra à jour toute seule sans recharger la page :&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: #dcdcdc; white-space: nowrap; overflow: scroll"&gt;&lt;font face=" Consolas"&gt;&lt;font size="1"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;div&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#ff0000"&gt;class&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;search&amp;quot;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;p&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;Recherche d'article&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;p&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;p&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;% using (Ajax.BeginForm(&amp;quot;AjaxSearch&amp;quot;, &amp;quot;Search&amp;quot;,          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new AjaxOptions() { UpdateTargetId = &amp;quot;searchResult&amp;quot; }))           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {%&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;lt;%= Html.TextBox(&amp;quot;s&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;input&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#ff0000"&gt;type&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;submit&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#ff0000"&gt;value&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;Search&amp;quot;/&amp;gt;&lt;/font&gt;&lt;font color="#000000"&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;lt;%} %&amp;gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;p&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&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; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;p&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#ff0000"&gt;id&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;searchResult&amp;quot;&amp;gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;p&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;div&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;          &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Le fonctionnement est très simple : on utilise un formulaire qui fera un appel Ajax, qu’on initialise à l’aide du Ajax.BeginForm    &lt;br /&gt;On lui passe en paramètre le nom de l’action et du contrôleur MVC qu’on veut appeler, ainsi que les AjaxOptions : ici je demande à ce que le résultat mette à jour l’élément avec l’id “searchResult”, situé un peu plus bas.&lt;/p&gt;  &lt;p&gt;Coté serveur, j’ai donc une action qui va me renvoyer une liste d’articles correspondant à la recherche :&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: #dcdcdc; white-space: nowrap; overflow: scroll"&gt;&lt;font face=" Consolas"&gt;&lt;font size="1"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;ActionResult&lt;/font&gt;&lt;font color="#000000"&gt; AjaxSearch()          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#2b91af"&gt;String&lt;/font&gt;&lt;font color="#000000"&gt; s =&amp;#160; Request[&lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;s&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;];          &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#000000"&gt; data = Context.Articles.Where(a =&amp;gt; a.Title.Contains(s)).ToList();          &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#000000"&gt; (data.Count == &lt;/font&gt;&lt;font color="#a52a2a"&gt;0&lt;/font&gt;&lt;font color="#000000"&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; &lt;/font&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;font color="#000000"&gt; Content(&lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;No article found&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;);          &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;font color="#000000"&gt; View(data);          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }           &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Et cette action renvoie une vue, qui est ici une vue partielle (ascx) :&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: #dcdcdc; white-space: nowrap; overflow: scroll"&gt;&lt;font face=" Consolas"&gt;&lt;font size="1"&gt;&amp;lt;%&lt;/font&gt;&lt;font color="#0000ff"&gt;@&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#800000"&gt;Control&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#ff0000"&gt;Language&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;C#&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#ff0000"&gt;Inherits&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;System.Web.Mvc.ViewUserControl&amp;lt;IEnumerable&amp;lt;MyMvcWiki.Models.Article&amp;gt;&amp;gt;&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt; %&amp;gt;          &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;ul&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;% &lt;/font&gt;&lt;font color="#0000ff"&gt;foreach&lt;/font&gt;&lt;font color="#000000"&gt; (&lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#000000"&gt; item &lt;/font&gt;&lt;font color="#0000ff"&gt;in&lt;/font&gt;&lt;font color="#000000"&gt; Model)          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { %&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;li&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;&amp;#160;&amp;#160; &amp;lt;%&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#000000"&gt; Html.ActionLink(item.Title, &lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;Details&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;, &lt;/font&gt;&lt;font color="#a31515"&gt;&amp;quot;Wiki&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;, &lt;/font&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;font color="#000000"&gt; { id=item.Id }, &lt;/font&gt;&lt;font color="#0000ff"&gt;null&lt;/font&gt;&lt;font color="#000000"&gt;) %&amp;gt;          &lt;br /&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;li&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;% } %&amp;gt;           &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;ul&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;          &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Et voilà, Ajax avec MVC, c’est pas plus compliqué que ça !    &lt;br /&gt;Enfin, en théorie, puisqu’il suffit de tester la page pour avoir une belle erreur, avec un message très explicite afin de faciliter le débugage :     &lt;br /&gt;“Error: Unknown runtime error”     &lt;br /&gt;Erreur d’autant plus incompréhensible que lorsque la recherche ne renvoie aucun résultat, le message “No article found” s’affiche correctement.&lt;/p&gt;  &lt;p&gt;Je me suis donc arraché les cheveux sur cette erreur, puisque le code me semblait parfaitement correct de bout en bout, jusqu’à ce que je comprenne ce qui n’allait pas.    &lt;br /&gt;Revoyons de plus près ce qui se passe coté client :     &lt;br /&gt;On fait un appel Ajax qui va mettre à jour ma page. La réponse du serveur doit mettre à jour l’élément avec l’id “searchResult”. Dans mon code, il s’agit d’un élément &amp;lt;p&amp;gt;.     &lt;br /&gt;La réponse du serveur renvoie une liste d’articles sous forme de liste à puces &amp;lt;ul&amp;gt; &amp;lt;li&amp;gt;.     &lt;br /&gt;Et si on se décide à lire les spécifications du xhtml, on se rend compte que c’est interdit. Et oui, un paragraphe ne doit pas contenir d’éléments de type bloc, donc pas de &amp;lt;ul&amp;gt;…     &lt;br /&gt;Il suffit de remplacer mon &amp;lt;p id=”searchResult”&amp;gt; pas un &amp;lt;div id=”searchResult”&amp;gt; pour que ça fonctionne !&lt;/p&gt;  &lt;p&gt;Je suis partagé sur cette erreur : d’un coté, c’est vrai que c’est bien de forcer les développeurs à faire du code correct, mais j’aurais quand même apprécié avoir un message d’erreur plus explicite.&lt;/p&gt;  &lt;p&gt;En dehors de ça, j’avoue que je suis conquis pas les méthodes Ajax fournies avec MVC. Les accrocs à l’UpdatePanel ne seront pas dépaysés (enfin, pas plus qu’ils ne l’étaient en passant de WebForms à MVC). C’est très facile et rapide à mettre en place, sans avoir à écrire de javascript. Tout en laissant la possibilité aux fans de JavaScript de faire leurs appels Ajax à la main (avec jQuery par exemple, qui est inclut de base dans les nouveaux projets MVC).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-8443796879208752551?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/8443796879208752551/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=8443796879208752551' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/8443796879208752551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/8443796879208752551'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2009/08/aspnet-mvc-ajax-et-xhtml-on-ne.html' title='ASP.NET MVC, Ajax, et XHTML : on ne plaisante pas avec la validité du code !'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-1923279686293016901</id><published>2009-08-04T11:06:00.001+02:00</published><updated>2009-08-04T11:11:20.072+02:00</updated><title type='text'>Découvrez Vertice Design</title><content type='html'>&lt;p&gt;Vertice Design est un studio graphique spécialisé dans le design et l'ergonomie d'applications web, windows et mobile.&lt;a href="http://www.verticedesign.com"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="vertice-design" border="0" alt="vertice-design" src="http://lh4.ggpht.com/_1fIQLbpqRAw/Snf7N51N6vI/AAAAAAAABgk/2yNcQd-ElW0/vertice-design.jpg?imgmax=800" width="240" height="240" /&gt;&lt;/a&gt;     &lt;br /&gt;Les équipes maîtrisent des outils variés tels que la gamme Expression de Microsoft, la gamme CS4 d'Adobe, 3ds Max, Nova...     &lt;br /&gt;En plus de la réalisation d'interfaces graphiques originales et à votre image, Vertice Design propose des formations afin d'acquérir des compétences     &lt;br /&gt;sur des logiciels tels que Expression Web, Blend, Silverlight, Flash, Expression Design, Illustrator...     &lt;br /&gt;N'hésitez pas à aller visiter leur site internet pour en savoir plus : &lt;a href="http://www.verticedesign.com"&gt;http://www.verticedesign.com&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/5619051591853320584-1923279686293016901?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/1923279686293016901/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=1923279686293016901' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/1923279686293016901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/1923279686293016901'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2009/08/decouvrez-vertice-design.html' title='Découvrez Vertice Design'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_1fIQLbpqRAw/Snf7N51N6vI/AAAAAAAABgk/2yNcQd-ElW0/s72-c/vertice-design.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-8611506370018775634</id><published>2009-04-24T15:39:00.001+02:00</published><updated>2009-08-26T17:23:12.297+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='BDC'/><title type='text'>BDC 2009 – ASP.NET MVC</title><content type='html'>&lt;p&gt;Je vous ai annoncé hier que mon post sur MVC arriverait d’ici quelques jours, cependant je me suis rendu compte un peu tard que la fin de la semaine arrivait à grand pas, et comme j’ai promis de mettre les sources de ma démo sur mon blog avant la fin de la semaine, me voilà déjà de retour !&lt;/p&gt;  &lt;p&gt;Le sujet du jour est donc MVC : un nouveau type de projet web qui va nous aider à bien structurer notre application, en séparant les différentes couches : Modèle, Vue et Controleur. Contrairement à Ajax que j’ai présenté dans mon message précédent, ASP.NET MVC est disponible en version finale, totalement supporté par Microsoft et donc utilisable en production.    &lt;br /&gt;Avant de démarrer, il va falloir vérifier qu’on a bien tout installé :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Comme d’habitude, il nous faut Visual Studio 2008 SP1, et comme d’habitude, &lt;a href="http://www.microsoft.com/express/vwd/"&gt;Visual Web Developer Express&lt;/a&gt; fera parfaitement l’affaire. &lt;/li&gt;    &lt;li&gt;Ensuite, il va falloir installer MVC. Pour ça, il suffit d’aller le &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=53289097-73ce-43bf-b6a6-35e00103cb4b&amp;amp;displaylang=en"&gt;télécharger&lt;/a&gt; et d’exécuter le msi. Notez que vous pouvez aussi télécharger le code source, disponible sous licence &lt;a href="http://www.microsoft.com/france/sharedsource/licensingbasics/sharedsourcelicenses.mspx#E4B"&gt;Ms-PL&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;Pour ensuite bien apprendre à utiliser MVC, &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=1e0be0b2-910a-4676-9f3a-41e4d9c0fc08"&gt;un training kit&lt;/a&gt; est disponible gratuitement, tout comme &lt;a href="http://aspnetmvcbook.s3.amazonaws.com/aspnetmvc-nerdinner_v1.pdf"&gt;un tutorial en pdf&lt;/a&gt; pour créer un site MVC from scratch. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Et comme promis, voilà &lt;a href="http://bdc2009.adhess.net/BewiseBlog.zip"&gt;le code source et les slides de ma démo&lt;/a&gt;. Il s’agit d’un mini moteur de blog totalement fait avec MVC. On peut créer des posts, les voir, les modifier, les supprimer…     &lt;br /&gt;J’ai modifié le blog depuis mardi, pour ne plus utiliser de base de données, afin de ne pas pénaliser ceux qui n’ont pas SQL Server. Du coup tout est stocké en mémoire, et donc rien n’est sauvegardé. Mais en fait c’est pas grave, puisque l’utilisation de MVC permets de changer facilement la couche d’accès aux données avec un minimum d’impact sur le reste du site, vous pourrez donc si vous le souhaitez enregistrer vos données dans votre propre base de données, ou dans des fichiers xml. C’est pas beau la vie ? ;)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-8611506370018775634?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/8611506370018775634/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=8611506370018775634' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/8611506370018775634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/8611506370018775634'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2009/04/bdc-2009-aspnet-mvc.html' title='BDC 2009 – ASP.NET MVC'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-8784565852130509881</id><published>2009-04-23T12:22:00.001+02:00</published><updated>2009-08-26T17:22:44.199+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='BDC'/><title type='text'>BDC 2009 – ASP.NET 4.0 - JavaScript</title><content type='html'>&lt;p&gt;La BDC c’est fini pour cette année, toute l’équipe de Bewise a été heureuse de vous recevoir et vous donne d’ores et déjà rendez-vous l’année prochaine pour une quatrième édition !&lt;/p&gt;  &lt;p&gt;A titre personnel, j’ai été ravi de voir tant de monde interressé par le développement web, et les nouveautés d’ASP.net. Pour ceux qui sont interressés, voici tout ce dont vous avez besoin pour tester les prochaines nouveautés Ajax et Javascript d’ASP.NET&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Visual Studio 2008 SP1: pour ceux qui ne l’ont pas, vous pouvez télécharger gratuitement &lt;a href="http://www.microsoft.com/express/vwd/"&gt;Visual Web Developer Express&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt;, la librairie javascript open-source. &lt;/li&gt;    &lt;li&gt;Pour ceux qui désirent l’intellisense jQuery dans VS2008, il vous faudra installer &lt;a href="http://code.msdn.microsoft.com/KB958502/Release/ProjectReleases.aspx?ReleaseId=1736"&gt;le patch qui va bien&lt;/a&gt;, et télécharger le fichier –vsdoc.js disponible sur le site de jQuery (sur la page de téléchargement, lien “Documentation : Visual Studio”) &lt;/li&gt;    &lt;li&gt;La preview d’ASP.NET 4.0 Ajax, disponible sur &lt;a href="http://aspnet.codeplex.com/Wiki/View.aspx?title=AJAX"&gt;codeplex&lt;/a&gt;. Il s’agit de plusieurs fichiers JavaScript que vous pouvez utiliser directement dans vos projets. Attention, il s’agit encore d’une preview, non destinée à être utilisée en production. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Si vous n’avez pas envie de coder de suite, vous pouvez vous contenter de jeter un coup d’oeil au &lt;a href="http://bdc2009.adhess.net/JavaScript.zip"&gt;code source et aux slides de mes démos JavaScript&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;La première démo montre comment utiliser les client templates pour afficher une liste d’images dont les noms sont contenus dans un tableau javascript, et comment les déplacer avec la souris grâce à jQuery.    &lt;br /&gt;Non, vous ne rêvez pas, tout le code se trouve bien dans la page default.aspx (sauf le tableau en javascript qui se trouve dans un fichier js séparé, mais ça c’est pas vraiment du code ;)&lt;/p&gt;  &lt;p&gt;La seconde démo est à peine plus compliquée, puisqu’au lieu de stocker ma liste de cartes dans une variable javascript, elle m’est renvoyée par le serveur à l’aide d’une requête Ajax.&lt;/p&gt;  &lt;p&gt;Voilà, avec tout ça il y a déjà moyen de bien s’amuser !&lt;/p&gt;  &lt;p&gt;Je vous donne rendez-vous d’ici quelques jours sur ce même blog pour un post sur ASP.NET MVC, avec un résumé de ma présentation et le code source de ma démo.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-8784565852130509881?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/8784565852130509881/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=8784565852130509881' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/8784565852130509881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/8784565852130509881'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2009/04/bdc-2009-aspnet-40-javascript.html' title='BDC 2009 – ASP.NET 4.0 - JavaScript'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-4645950562657827676</id><published>2009-04-10T16:15:00.001+02:00</published><updated>2009-04-10T16:15:36.273+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BDC'/><category scheme='http://www.blogger.com/atom/ns#' term='Bewise'/><title type='text'>Bewise Day Conference 2009</title><content type='html'>&lt;p&gt;Pour la 3ème année consécutive, Bewise revient vous présenter les dernières technologies Microsoft à la BDC, qui cette année ne s’adresse pas uniquement aux développeurs mais à tous les professionnels de l’informatique, avec des sessions développement et des sessions IT.&lt;/p&gt;  &lt;p&gt;Je serai présent pour vous présenter les nouveautés prévues pour le prochain ASP.NET 4.0    &lt;br /&gt;Au programme : Ajax, JQuery, MVC et WebForms, ainsi que toute question qui vous passe par la tête, à l’espace de démonstration “Boostez vos sites avec ASP.NET 4.0”&lt;/p&gt;  &lt;p align="center"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="LogoASPNET" border="0" alt="LogoASPNET" src="http://lh6.ggpht.com/_1fIQLbpqRAw/Sd9Uh56bgfI/AAAAAAAABgc/CmWn6kxQH-8/LogoASPNET%5B7%5D.jpg?imgmax=800" width="240" height="46" /&gt;&lt;/p&gt;  &lt;p&gt;Lors de la dernière BDC, j’ai vu dans les yeux émerveillés de quelques étudiants l’envie, que dis-je, une volonté féroce de travailler à Bewise (et comme je les comprend !), je leur dédie donc cette vidéo, où vous pourrez découvrir la dure vie d’un développeur chez Bewise.&lt;/p&gt; &lt;iframe style="width: 500px; height: 375px" src="http://silverlight.services.live.com/invoke/58450/Bewise%20-%20BDC%202009%20-%20Un%20peu%20de%20fun%20dans%20un%20monde%20de%20brutes/iframe.html" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;  &lt;p&gt;Découvrez d’autres vidéos sur les coulisses de l’évènement, et venez vous y inscrire, sur le site officiel : &lt;a href="http://bdc2009.bewise.fr?f=A56BC4FC-9B40-4e60-A8D5-B188D54819BC"&gt;http://bdc2009.bewise.fr&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/5619051591853320584-4645950562657827676?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/4645950562657827676/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=4645950562657827676' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/4645950562657827676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/4645950562657827676'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2009/04/bewise-day-conference-2009.html' title='Bewise Day Conference 2009'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_1fIQLbpqRAw/Sd9Uh56bgfI/AAAAAAAABgc/CmWn6kxQH-8/s72-c/LogoASPNET%5B7%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-4822490771065834796</id><published>2009-03-23T17:24:00.001+01:00</published><updated>2009-03-23T17:24:39.769+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><title type='text'>Un lien qui pointe vers… rien.</title><content type='html'>&lt;p&gt;Aujourd’hui, un petit truc tout con, mais qu’il faut connaitre : comment créer un lien qui ne pointe vers rien ?&lt;/p&gt;  &lt;p&gt;En effet, lorsqu’on utilise javascript, on utilise très souvent des liens qui ne renvoient pas vers une autre page, mais comment écrire ces liens ?&lt;/p&gt;  &lt;p&gt;On voit très souvent, dans ces cas là, un lien qui pointe vers “#”. Ce type de lien ne me convient pas, car lorsqu’on clique dessus on est ramené au début de la page. En effet, le # permets de faire des liens vers des ancres dans la page, le # sans nom représente pour le navigateur le début de la page.&lt;/p&gt;  &lt;p&gt;Pour faire un lien qui ne va pas déplacer l’utilisateur dans la page, je vous propose deux solutions :&lt;/p&gt;  &lt;p&gt;- le lien sans href : on crée notre balise a, on mets nos évènement javascript si on en a besoin, mais on ne mets pas de href. Ainsi, on n’a pas de lien, et donc pas de déplacement dans la page. Par contre, le texte ne s’affichera pas comme un lien dans le navigateur client : couleur par défaut, pas de soulignement, et curseur par défaut. Il faut donc penser à bien afficher notre lien correctement à l’aide de CSS (vous pouvez notamment utiliser cursor: pointer; pour changer le curseur).&lt;/p&gt;  &lt;p&gt;- le lien javascript : il suffit de faire un lien de la manière suivante : &amp;lt;a href=&amp;quot;javascript:void(0)&amp;quot;&amp;gt;   &lt;br /&gt;La différence avec la méthode précédente : cette fois notre lien apparait vraiment comme un lien, pas besoin de faire un css spécifique si on veut qu’il s’affiche comme les autres. Mis à part l’affichage, le comportement sera exactement le même : ils ne font rien.&lt;/p&gt;  &lt;p&gt;Ainsi, vous pouvez placer du javascript dans vos balises a sans que vos utilisateurs ne cassent tout en cliquant alors qu’il ne fallait pas.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-4822490771065834796?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/4822490771065834796/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=4822490771065834796' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/4822490771065834796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/4822490771065834796'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2009/03/un-lien-qui-pointe-vers-rien.html' title='Un lien qui pointe vers… rien.'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-8374552071897258876</id><published>2008-12-17T19:44:00.002+01:00</published><updated>2008-12-17T19:51:24.754+01:00</updated><title type='text'>Ouverture de Dotnet-France</title><content type='html'>Un petit post pour parler de l'ouverture de Dotnet-France, un site web où vous pourrez réviser vos certifications gratuitement. Pour plus d'informations, je vous mets un copier-coller du communiqué de presse :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;L’association Dotnet-France est fière de vous annoncer le lancement officiel de son site web accessible à l’adresse : http://www.dotnet-france.com. Ce lancement s’avère très important pour l’association puisqu’il scelle le travail de plusieurs mois pour chaque membre de l’équipe et le début de l’histoire Dotnet-France. &lt;br /&gt;&lt;br /&gt;En effet Dotnet-France ambitionne l’idée de devenir une des communautés les plus influentes auprès des étudiants et développeurs professionnels sur les technologies Microsoft. Et comme à Dotnet-France nous sommes convaincus de l’intérêt des certifications dans le parcours professionnel nous poursuivrons notre objectif en proposant le meilleur accompagnement possible dans le cursus certifiant. &lt;br /&gt;&lt;br /&gt;La première version du site propose donc un ensemble de fonctionnalités et contenus axés autour de l’auto-apprentissage des technologies de développement Microsoft. Entre autre nous pouvons citer : &lt;br /&gt;Des cours complets et gratuits pour chaque technologie (la liste des technologies ne cessera d’évoluer).&lt;br /&gt;Des examens blancs pour chaque certification (la liste des examens blancs ne cessera d’évoluer) avec un module de statistiques associé pour mieux appréhender son cursus. &lt;br /&gt;Des informations utiles sur les certifications pour présenter les différents cursus possibles, les intérêts et comment les passer.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;C'est par ici : &lt;a href="http://www.dotnet-france.com/"&gt;http://www.dotnet-france.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Et puisqu'on en est à faire de la pub, je vous annonce l'ouverture du blog de Lionel Limozin, qui vient rejoindre la grande famille des blogueurs de Bewise !&lt;br /&gt;C'est par là : &lt;a href="http://www.paslatek.net/"&gt;http://www.paslatek.net/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-8374552071897258876?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/8374552071897258876/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=8374552071897258876' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/8374552071897258876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/8374552071897258876'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2008/12/ouverture-de-dotnet-france.html' title='Ouverture de Dotnet-France'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-9050702843684398146</id><published>2008-11-14T09:38:00.000+01:00</published><updated>2009-05-12T15:46:41.554+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>Détection des plugins Silverlight et Flash</title><content type='html'>&lt;p&gt;J'ai un site qui existe en 3 versions: en Silverlight, en Flash, et en HTML pour les réfractaires aux plugins. Au lieu de proposer le choix entre les versions sur la page d'accueil, j'ai voulu faire une redirection automatique en fonction des plugins installés sur le navigateur, je me suis dis que 5 minutes sur google me suffiraient à trouver le code magique qui ferait ça. Erreur ! On trouve bien quelques codes un peu partout sur internet, mais parmis ceux que j'ai essayé, aucun ne fonctionnait correctement (enfin, ils fonctionnent quand on a le plugin installé et qu'on est sous IE, dans les autres cas c'est beaucoup moins sûr)&lt;/p&gt;  &lt;p&gt;J'en suis arrivé donc à faire mon script moi même (enfin, je me suis inspiré d'un qui fonctionnait presque), et le voilà :&lt;/p&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:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:bae1df06-27bf-4678-8f08-b8786acb1e59" class="wlWriterSmartContent"&gt;   &lt;pre style="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: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;script type&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;text/javascript&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        function detectSilverlight() {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (navigator.mimeTypes.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: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    navigator.mimeTypes[&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;application/x-silverlight&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: #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;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    navigator.mimeTypes[&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;application/x-silverlight&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;].enabledPlugin &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;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&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; (window.ActiveXObject) {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; ActiveXObject(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;AgControl.AgControl&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;                }&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&lt;span style="color: #000000"&gt; (oError) {&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&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: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        function detectFlash() {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (navigator.mimeTypes.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: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;                    navigator.mimeTypes[&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;application/x-shockwave-flash&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: #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;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;br /&gt;                    navigator.mimeTypes[&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;application/x-shockwave-flash&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;].enabledPlugin &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;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&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; (window.ActiveXObject) {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; ActiveXObject(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;ShockwaveFlash.ShockwaveFlash&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;                }&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&lt;span style="color: #000000"&gt; (oError) {&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&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: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (detectSilverlight()) {&lt;br /&gt;            window.location.replace(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;pageSilverlight.htm&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;        }&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&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; (detectFlash()) {&lt;br /&gt;            window.location.replace(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;pageFlash.htm&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;        }&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;br /&gt;            window.location.replace(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;pageHtml.htm&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #000000"&gt;script&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;br /&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;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Testé sous IE7, Opera 9.6, Firefox 3, et Chrome beta, le tout sous Windows, avec et sans les plugins. Donc à priori ça devrait être bon un peu partout. J'espère juste que les autres OS n'ont pas encore un système différent de gestion des plugins... Si jamais vous trouvez un bug, tenez moi au courant ;)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-9050702843684398146?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/9050702843684398146/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=9050702843684398146' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/9050702843684398146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/9050702843684398146'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2008/11/dtection-des-plugins-silverlight-et.html' title='Détection des plugins Silverlight et Flash'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-7944236361021871909</id><published>2008-08-12T08:51:00.001+02:00</published><updated>2008-08-12T08:51:04.614+02:00</updated><title type='text'>SP1 pour Visual Studio 2008 et le Framework .NET 3.5</title><content type='html'>&lt;p&gt;Le SP1 pour le framework 3.5 et pour Visual Studio 2008 sont disponibles : &lt;a title="http://msdn.microsoft.com/en-us/vstudio/cc533448.aspx" href="http://msdn.microsoft.com/en-us/vstudio/cc533448.aspx"&gt;http://msdn.microsoft.com/en-us/vstudio/cc533448.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Vous pourrez t&amp;#233;l&amp;#233;charger en m&amp;#234;me temps &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=F3FBB04E-92C2-4701-B4BA-92E26E408569&amp;amp;displaylang=en"&gt;les versions express de Visual Studio&lt;/a&gt;, ainsi que &lt;a href="http://www.microsoft.com/express/sql/default.aspx"&gt;SQL Server 2008 Express&lt;/a&gt;, qui sont toujours gratuits.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-7944236361021871909?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/7944236361021871909/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=7944236361021871909' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/7944236361021871909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/7944236361021871909'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2008/08/sp1-pour-visual-studio-2008-et-le.html' title='SP1 pour Visual Studio 2008 et le Framework .NET 3.5'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-4732334555457064520</id><published>2008-07-11T14:06:00.001+02:00</published><updated>2009-05-12T15:40:09.087+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>Utilisation des validateurs ASP.NET en Javascript</title><content type='html'>&lt;p&gt;Il y a quelque chose que j'aime beaucoup en ASP.NET, et je pense pas que grand monde me contredise, c'est les validateurs. Plus besoin de s'embeter à faire du Javascript pour vérifier le contenu de nos inputs, on mets notre validateur, on définit 2-3 propriétés, et on a une validation cliente et serveur qui fonctionne, le rêve !&lt;/p&gt;  &lt;p&gt;Mais parfois, on peux quand même aimer faire du Javascript, et juste être feignant. Comme c'est mon cas, je me suis demandé comment utiliser ces validateurs coté client dans mon code javascript, sans avoir à gerer les retours serveurs. Eh bien, il s'avère que c'est extrèmement simple, on va voir dans un exemple rapide comment faire.&lt;/p&gt;  &lt;p&gt;Mon besoin : je veux que l'utilisateur puisse taper un code hexadécimal d'une couleur, et l'appliquer à un élément de ma page html.    &lt;br /&gt;J'ai donc&amp;#160; un input, et une zone de texte dont je vais changer la couleur :     &lt;br /&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:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:6f1372eb-72e7-4824-8807-894e4ed5d785" class="wlWriterSmartContent"&gt;   &lt;pre style="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;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;input &lt;/span&gt;&lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;text&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; id&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;tbCouleur&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; onchange&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;javascript:changeCouleur()&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;br &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;div &lt;/span&gt;&lt;span style="color: #ff0000"&gt;style&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;color: #000000;&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; id&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;divCouleur&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;            Ce texte change de couleur&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;br /&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;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Et pour effectuer le changement de couleur, la fonction javascript :&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&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:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:05a70fbe-7f43-41a3-9981-f7e248c9e3f0" class="wlWriterSmartContent"&gt;&lt;br /&gt;  &lt;pre style="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;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;script &lt;/span&gt;&lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000"&gt; changeCouleur()&lt;br /&gt;        {&lt;br /&gt;            document.getElementById(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000"&gt;divCouleur&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000"&gt;).style.color&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000"&gt;document.getElementById(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000"&gt;tbCouleur&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000"&gt;).value;&lt;br /&gt;        }&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;br /&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;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;C'est tout simple et ça fonctionne, mais si l'utilisateur, qui comme chacun le sait n'hésite jamais à faire n'importe quoi, décide de mettre autre chose qu'un code couleur correct, on va se retrouver avec une belle erreur : en effet, le navigateur ne saura pas convertir &amp;quot;toto&amp;quot; en couleur de texte... On va donc mettre des validateurs.&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;Un code couleur est un constitué de 3 ou 6 caractères hexadécimaux, précédés d'un dièse. Pour vérifier cela, rien de tel qu'un RegularExpressionValidator avec la regex qui va bien : &amp;quot;#([0-9a-fA-F]{3}){1,2}&amp;quot;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;On va aussi vérifier que la case n'est pas vide, avec un RequiredFieldValidator.&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;Et bien sûr, pour que les validateurs fonctionnent, on n'oubliera pas de transformer notre input en controle serveur.&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&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:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:34012ceb-db6a-40bb-baaa-ad11a0af92de" class="wlWriterSmartContent"&gt;&lt;br /&gt;  &lt;pre style="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;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;input &lt;/span&gt;&lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;text&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; id&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;tbCouleur&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; onchange&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;javascript:changeCouleur()&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; runat&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:RegularExpressionValidator &lt;/span&gt;&lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;tbCouleur_regval&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; runat&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; ControlToValidate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;tbCouleur&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&lt;br /&gt;        ValidationExpression&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;#([0-9a-fA-F]{3}){1,2}&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:RegularExpressionValidator&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:RequiredFieldValidator &lt;/span&gt;&lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;tbCouleur_requiredval&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; runat&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;br /&gt;        ControlToValidate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;tbCouleur&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;asp:RequiredFieldValidator&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;br &lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;div &lt;/span&gt;&lt;span style="color: #ff0000"&gt;style&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;color: #000000;&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; id&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;divCouleur&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;        Ce texte change de couleur&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;br /&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;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Ensuite, pour pouvoir utiliser notre validateur dans notre javascript, il suffit de faire appel à la fonction Page_ClientValidate(). Comme notre input est devenu un controle serveur, il faudra aussi penser à utiliser son identifiant client.&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&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:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:57d1ae27-391a-461c-985d-f3996d2b7789" class="wlWriterSmartContent"&gt;&lt;br /&gt;  &lt;pre style="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;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;script &lt;/span&gt;&lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000"&gt; changeCouleur()&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000"&gt; (Page_ClientValidate())&lt;br /&gt;        {&lt;br /&gt;            document.getElementById(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000"&gt;divCouleur&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000"&gt;).style.color&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000"&gt;&lt;br /&gt;                    document.getElementById(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000"&gt;&amp;lt;%= tbCouleur.ClientID %&amp;gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000"&gt;).value;&lt;br /&gt;        }&lt;br /&gt;        &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000"&gt;&lt;br /&gt;        {&lt;br /&gt;            alert(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000"&gt;code incorrect&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000"&gt;)&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;br /&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;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Et voilà le travail !&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/adhess/SHdMvnqasII/AAAAAAAABFc/Pr7gzeEeffY/s1600-h/valJS%5B6%5D.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="valJS" src="http://lh6.ggpht.com/adhess/SHdMwSORW3I/AAAAAAAABFg/i2Q2CWM493A/valJS_thumb%5B4%5D.png?imgmax=800" width="412" height="283" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Pour utiliser les groupes de validation, c'est pas beaucoup plus compliqué : il suffit de passer le nom du groupe en paramètre de la fonction, ainsi seul le groupe voulu sera validé :&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&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:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:90aa01dd-cfc1-4c16-9c65-4ec9f1add6c3" class="wlWriterSmartContent"&gt;&lt;br /&gt;  &lt;pre style="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: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (Page_ClientValidate(&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;group1&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;))&lt;br /&gt;{&lt;br /&gt;    ....&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-4732334555457064520?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/4732334555457064520/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=4732334555457064520' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/4732334555457064520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/4732334555457064520'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2008/07/utilisation-des-validateurs-aspnet-en.html' title='Utilisation des validateurs ASP.NET en Javascript'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/adhess/SHdMwSORW3I/AAAAAAAABFg/i2Q2CWM493A/s72-c/valJS_thumb%5B4%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-3895577660493037995</id><published>2008-07-10T15:24:00.001+02:00</published><updated>2008-07-10T15:24:55.248+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>ASP.NET Ajax ne fonctionne pas avec xhtmlConformance="Legacy"</title><content type='html'>&lt;p&gt;Il peut &amp;#234;tre troublant de voir que les UpdatePanel qui fonctionnent parfaitement sur sa machine refusent tout &amp;#224; coup de faire leur travail lorsque l'on envoie ses pages sur son serveur. Ce qu'il faut savoir, c'est que Asp.net Ajax ne fonctionne pas avec le mode xhtml &amp;quot;Legacy&amp;quot; : si vous avez ce probl&amp;#232;me, il faudra modifier le &amp;lt;system.web&amp;gt; de votre web.config pour forcer le mode xhtml strict ou transitionnel :&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:60b80632-4651-45d8-8efd-9c90d52f7567" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="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: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;xhtmlConformance &lt;/span&gt;&lt;span style="color: #FF0000;"&gt;mode&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;=&amp;quot;Transitional&amp;quot;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;ou&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;xhtmlConformance &lt;/span&gt;&lt;span style="color: #FF0000;"&gt;mode&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;=&amp;quot;Strict&amp;quot;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&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;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Sans &amp;#231;a, le code html g&amp;#233;n&amp;#233;r&amp;#233; par vos controles ne sera pas valide xhtml, et Ajax ne pourra pas fonctionner correctement. Plus d'informations sur le blog de &lt;a href="http://weblogs.asp.net/scottgu/archive/2006/12/10/gotcha-don-t-use-xhtmlconformance-mode-legacy-with-asp-net-ajax.aspx"&gt;Scott Guthrie&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/5619051591853320584-3895577660493037995?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/3895577660493037995/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=3895577660493037995' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/3895577660493037995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/3895577660493037995'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2008/07/aspnet-ajax-ne-fonctionne-pas-avec.html' title='ASP.NET Ajax ne fonctionne pas avec xhtmlConformance=&amp;quot;Legacy&amp;quot;'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-2331576102663661139</id><published>2008-06-12T14:30:00.001+02:00</published><updated>2008-06-12T14:30:06.048+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Opera'/><category scheme='http://www.blogger.com/atom/ns#' term='Navigateurs'/><title type='text'>Opera 9.5 disponible</title><content type='html'>&lt;p&gt;Apr&amp;#232;s avoir propos&amp;#233; une version Release Candidate hier, les petits gars de chez Opera viennent finalement de nous sortir la version finale d'Opera 9.5 ! Au programme, de nombreuses nouveaut&amp;#233;s, je vous fait un copier-coller de ce que j'avais post&amp;#233; lors de la sortie de la beta :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Synchronisation des signets entre plusieurs ordinateurs (gr&amp;#226;ce &amp;#224; un compte Opera) &lt;/li&gt;    &lt;li&gt;Ouverture de la page dans un autre navigateur directement en faisant clic droit (Firefox, Internet Explorer et Safari sont bien s&amp;#251;r reconnus) &lt;/li&gt;    &lt;li&gt;Recherche rapide dans le contenu des pages d&amp;#233;j&amp;#224; visit&amp;#233;es, depuis la barre d'adresse &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Et depuis la derni&amp;#232;re beta, encore d'autres nouveaut&amp;#233;s :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Une nouvelle interface (bon, va falloir s'y habituer ^^' ceux qui n'aiment pas peuvent toujours en t&amp;#233;l&amp;#233;charger d'autres)&lt;/li&gt;    &lt;li&gt;Dragonfly, le nouvel outil pour d&amp;#233;veloppeur, int&amp;#233;gr&amp;#233; (d'ailleurs j'ai pas encore eu le temps de le tester, &amp;#231;a sera l'occasion)&lt;/li&gt;    &lt;li&gt;et des corrections de bug&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Et bien s&amp;#251;r, toujours ce qui faisait la sup&amp;#233;riorit&amp;#233; d'Opera : la corbeille &amp;#224; onglets, les raccourcis souris (clic droit-clic gauche pour revenir en page pr&amp;#233;c&amp;#233;dente, je peux plus m'en passer), moteur de rendu rapide (avec un retour en page pr&amp;#233;c&amp;#233;dente quasi instantan&amp;#233;), bref, que du bon...&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://lh5.ggpht.com/adhess/SFEWx8ng5wI/AAAAAAAABFU/KU72Lnaw0O0/s1600-h/nextscreen%5B4%5D.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="350" alt="nextscreen" src="http://lh5.ggpht.com/adhess/SFEWzHnLtrI/AAAAAAAABFY/k6VJk-BcPxg/nextscreen_thumb%5B2%5D.jpg?imgmax=800" width="780" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Pour le t&amp;#233;l&amp;#233;charger, c'est sur &lt;a href="http://www.opera.com"&gt;leur site officiel&lt;/a&gt; !    &lt;br /&gt;Cependant, il semble avoir quelques soucis en ce moment (trop de succ&amp;#232;s, on va pas les plaindre ;) ), alors comme j'ai r&amp;#233;ussi &amp;#224; le t&amp;#233;l&amp;#233;charger je vous mets un lien direct &lt;a href="http://files.adhess.net/Opera_950_in_Setup.exe"&gt;vers l'installeur&lt;/a&gt; (si je suis pas trop gentil ! ah la la, qu'est-ce que je ferais pas pour vous)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-2331576102663661139?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/2331576102663661139/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=2331576102663661139' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/2331576102663661139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/2331576102663661139'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2008/06/opera-95-disponible.html' title='Opera 9.5 disponible'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/adhess/SFEWzHnLtrI/AAAAAAAABFY/k6VJk-BcPxg/s72-c/nextscreen_thumb%5B2%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-6367363059427721855</id><published>2008-06-04T17:35:00.001+02:00</published><updated>2008-06-04T17:35:04.801+02:00</updated><title type='text'>Projets MVC dans Visual Web Developper Express</title><content type='html'>&lt;p&gt;Le SP1 de Visual Web Developper Express 2008 apporte une nouveaut&amp;#233; qui manquait cruellement aux anciennes versions : le support des projets web application. En effet, jusqu'&amp;#224; pr&amp;#233;sent, les utilisateurs de la version gratuite de Visual Studio ne pouvait cr&amp;#233;er que des projets de type website, ce qui empechait notamment d'utiliser ASP.NET MVC.&lt;/p&gt;  &lt;p&gt;L'erreur est maintenant r&amp;#233;par&amp;#233;e, et vous pouvez donc d&amp;#232;s &amp;#224; pr&amp;#233;sent cr&amp;#233;er des projets ASP.NET MVC (preview 3), Silverlight ou Dynamic Data. &lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://lh5.ggpht.com/adhess/SEa2Gstsr8I/AAAAAAAABFM/PWDDR03XUAM/s1600-h/vwd%5B4%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="429" alt="vwd" src="http://lh4.ggpht.com/adhess/SEa2JzmynOI/AAAAAAAABFQ/yeNMbjjVk_g/vwd_thumb%5B2%5D.png?imgmax=800" width="640" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="left"&gt;Pour cela, il vous faudra tout d'abord installer le SP1 de Visual Studio et du Framework 3.5, que vous trouverez ici : &lt;a title="http://msdn.microsoft.com/en-us/vstudio/products/cc533447.aspx" href="http://msdn.microsoft.com/en-us/vstudio/products/cc533447.aspx"&gt;http://msdn.microsoft.com/en-us/vstudio/products/cc533447.aspx&lt;/a&gt;. Attention, il s'agit d'une beta avec tout ce que cela implique, n'installez que si vous savez ce que vous faites.&lt;/p&gt;  &lt;p align="left"&gt;Je reviendrai plus en d&amp;#233;tail sur les nouveaut&amp;#233;s d'ASP.NET MVC preview 3 un peu plus tard, mais si vous avez envie de d&amp;#233;couvrir par vous m&amp;#234;me je vous conseille d'aller lire le post de Scott Guthrie qui pr&amp;#233;sente les changements depuis la pr&amp;#233;c&amp;#233;dente preview : &lt;a title="http://weblogs.asp.net/scottgu/archive/2008/05/27/asp-net-mvc-preview-3-release.aspx" href="http://weblogs.asp.net/scottgu/archive/2008/05/27/asp-net-mvc-preview-3-release.aspx"&gt;http://weblogs.asp.net/scottgu/archive/2008/05/27/asp-net-mvc-preview-3-release.aspx&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/5619051591853320584-6367363059427721855?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/6367363059427721855/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=6367363059427721855' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/6367363059427721855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/6367363059427721855'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2008/06/projets-mvc-dans-visual-web-developper.html' title='Projets MVC dans Visual Web Developper Express'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/adhess/SEa2JzmynOI/AAAAAAAABFQ/yeNMbjjVk_g/s72-c/vwd_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-8291463497436161866</id><published>2008-05-05T10:13:00.001+02:00</published><updated>2008-05-05T10:14:25.103+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='BDC'/><title type='text'>ASP.NET MVC - source des démos</title><content type='html'>&lt;p&gt;Je vous l'avais promis, voil&amp;#224; enfin les slides et codes sources de ma d&amp;#233;mo ASP.NET MVC de la derni&amp;#232;re Bewise Developer Conference.    &lt;br /&gt;Pour t&amp;#233;l&amp;#233;charger, c'est &lt;a href="http://files.adhess.net/EDD-ASP.NET%20MVC.zip"&gt;par l&amp;#224;&lt;/a&gt; ! Et n'oubliez pas de t&amp;#233;l&amp;#233;charger &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=A9C6BC06-B894-4B11-8300-35BD2F8FC908&amp;amp;displaylang=en"&gt;les extensions ASP.NET&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;En r&amp;#233;sum&amp;#233;, MVC c'est quoi ?   &lt;br /&gt;C'est un nouveau type de projet qui permets de mieux structurer ses sites web en utilisant le pattern MVC. Le projet reste un projet ASP.NET classique, mais la structure par d&amp;#233;faut facilite la s&amp;#233;paration des diff&amp;#233;rentes couches de notre application. Vous trouverez plus de d&amp;#233;tails dans les slides.&lt;/p&gt;  &lt;p&gt;Pour aller plus loin, je vous conseille &lt;a href="http://weblogs.asp.net/scottgu/archive/tags/MVC/default.aspx"&gt;le blog de Scott Guthrie&lt;/a&gt;, qui a fait quelques posts interressants sur l'utilisation de MVC.     &lt;br /&gt;Vous noterez que pour l'affichage des donn&amp;#233;es je ne m'y suis pas pris de la m&amp;#234;me mani&amp;#232;re que lui : en effet, j'ai honteusement viol&amp;#233; le pattern MVC en mettant du code dans ma vue, tout &amp;#231;a dans le but d'utiliser les controles asp.net classiques (tels les repeaters et autres datagrids), alors que lui pr&amp;#233;f&amp;#232;re gerer tout l'affichage &amp;#224; la mano en mettant son code directement dans les pages aspx... personnellement je trouve &amp;#231;a quand m&amp;#234;me assez crade, d'o&amp;#249; mon choix lors des d&amp;#233;mos. Il ne faut cependant pas oublier que MVC est juste une preview et qu'il y aura certainement des changements d'ici la version finales, j'ai espoir de voir apparaitre de nouveaux controles serveurs adapt&amp;#233;s aux projets MVC.&lt;/p&gt;  &lt;p&gt;Sur ce, je vous laisse vous amuser avec ce nouveau type de projet. Personnellement, &amp;#231;a a beau pas &amp;#234;tre fini, je suis d&amp;#233;j&amp;#224; fan, et j'en reparlerai certainement de nouveau ici m&amp;#234;me.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-8291463497436161866?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/8291463497436161866/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=8291463497436161866' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/8291463497436161866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/8291463497436161866'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2008/05/aspnet-mvc-source-des-dmos.html' title='ASP.NET MVC - source des démos'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-6539250431134793816</id><published>2008-04-29T10:42:00.001+02:00</published><updated>2008-04-29T10:46:26.528+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Opera'/><category scheme='http://www.blogger.com/atom/ns#' term='Navigateurs'/><title type='text'>Opera 9.5 beta 2</title><content type='html'>&lt;p&gt;La seconde beta du navigateur Opera 9.5 est disponible depuis hier. Parmis les nouveaut&amp;#233;s, quelques unes sont particuli&amp;#232;rement interressantes, je vous cite mes pr&amp;#233;f&amp;#233;r&amp;#233;es :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Synchronisation des signets entre plusieurs ordinateurs (gr&amp;#226;ce &amp;#224; un compte Opera) &lt;/li&gt;    &lt;li&gt;Ouverture de la page dans un autre navigateur directement en faisant clic droit (Firefox, Internet Explorer et Safari sont bien s&amp;#251;r reconnus) &lt;/li&gt;    &lt;li&gt;Recherche rapide dans le contenu des pages d&amp;#233;j&amp;#224; visit&amp;#233;es, depuis la barre d'adresse &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Et bien s&amp;#251;r, toujours ce qui faisait la sup&amp;#233;riorit&amp;#233; d'Opera : la corbeille &amp;#224; onglets, les raccourcis souris, moteur de rendu rapide (avec un retour en page pr&amp;#233;c&amp;#233;dente quasi instantan&amp;#233;), bref, que du bon...&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/adhess/SBbfiqY0rrI/AAAAAAAABEc/v8URu_VNwxI/s1600-h/nextscreen%5B4%5D.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="350" alt="nextscreen" src="http://lh5.ggpht.com/adhess/SBbfjqY0rsI/AAAAAAAABEk/YT8SkKuzAzY/nextscreen_thumb%5B2%5D.jpg?imgmax=800" width="780" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Pour t&amp;#233;l&amp;#233;charger, &amp;#231;a se passe ici : &lt;a href="http://www.opera.com/products/desktop/next/"&gt;Opera 9.5 beta 2&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Opera compte aussi rattraper son retard sur un de ses gros points noirs : un outil pour d&amp;#233;veloppeurs a &amp;#233;t&amp;#233; annonc&amp;#233; : &amp;#231;a s'appelle &lt;a href="http://dragonfly.opera.com/"&gt;Dragonfly&lt;/a&gt;, et &amp;#231;a doit sortir le 6 mai prochain. Je teste &amp;#231;a d&amp;#232;s que je peux et je vous tiens au courant !&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-6539250431134793816?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/6539250431134793816/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=6539250431134793816' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/6539250431134793816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/6539250431134793816'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2008/04/opera-95-beta-2.html' title='Opera 9.5 beta 2'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/adhess/SBbfjqY0rsI/AAAAAAAABEk/YT8SkKuzAzY/s72-c/nextscreen_thumb%5B2%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-110511939150058273</id><published>2008-04-28T23:15:00.001+02:00</published><updated>2008-04-28T23:15:20.882+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='BDC'/><category scheme='http://www.blogger.com/atom/ns#' term='Bewise'/><title type='text'>BDC 2008, merci à ceux qui sont venus !</title><content type='html'>&lt;p&gt;Oui, je sais, &amp;#231;a fait plus de 2 semaines que c'est pass&amp;#233;, et je poste que maintenant... il m'a bien fallu &amp;#231;a pour m'en remettre ! &lt;/p&gt;  &lt;p&gt;Cette ann&amp;#233;e encore, la Bewise Developper Conference a &amp;#233;t&amp;#233; une r&amp;#233;ussite, avec plus de 470 inscrits. Toute l'&amp;#233;quipe de Bewise vous donne d&amp;#233;j&amp;#224; rendez-vous pour la 3eme &amp;#233;dition en 2009.&lt;/p&gt;  &lt;p&gt;&lt;img border="0" alt="60" src="http://lh6.ggpht.com/adhess/SBY-Z6Y0rqI/AAAAAAAABEQ/_aowR-0OQmo/60%5B4%5D.jpg?imgmax=800" width="640" height="425" /&gt; &lt;/p&gt;  &lt;p&gt;Le stand ASP.NET quand &amp;#224; lui n'a pas d&amp;#233;sempli, comme quoi les technos bling bling &amp;#224; la Silverlight ne sont pas pr&amp;#234;tes de remplacer celles qui ont d&amp;#233;j&amp;#224; fait leurs preuves :) Enorme succ&amp;#232;s pour ASP.NET Ajax, et pas mal de monde interress&amp;#233;es par la nouvelle fa&amp;#231;on de structurer son application web : ASP.NET MVC. Bien qu'encore en preview, ce nouveau type de projet est tr&amp;#232;s prometteurs, on en reparlera bientot (si vous &amp;#234;tes interress&amp;#233;s, je posterai tr&amp;#232;s bientot les slides et codes sources de ma d&amp;#233;mo). &lt;/p&gt;  &lt;p&gt;Je voudrais aussi remercier l'enthousiasme de plusieurs &amp;#233;tudiants de Supinfo avec qui nous avons explor&amp;#233; quelques possibilti&amp;#233;s offertes par ASP.NET qu'ils ne connaissaient pas. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-110511939150058273?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/110511939150058273/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=110511939150058273' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/110511939150058273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/110511939150058273'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2008/04/bdc-2008-merci-ceux-qui-sont-venus.html' title='BDC 2008, merci à ceux qui sont venus !'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/adhess/SBY-Z6Y0rqI/AAAAAAAABEQ/_aowR-0OQmo/s72-c/60%5B4%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-840958509322103647</id><published>2008-04-10T10:12:00.002+02:00</published><updated>2008-04-10T10:24:58.806+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BDC'/><category scheme='http://www.blogger.com/atom/ns#' term='Bewise'/><title type='text'>BDC 2008 : Jour J !</title><content type='html'>&lt;p&gt;La BDC c'est aujourd'hui ! Si vous venez, vous pourrez me trouver à l'espace de démonstration ASP.NET, où je présenterai avec Alin Stefaniu Ajax, ASP.NET MVC, Dynamic Data, et toutes les nouveautés d'ASP.NET.&lt;/p&gt;&lt;p&gt;Vous pourrez aussi découvrir toutes les dernières technologies Microsoft au cours des sessions et démonstrations des spécialistes Bewise. rendez-vous au stade Ernest Wallon de Toulouse à partir de 13h30&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;embed src="http://images.video.msn.com/flash/soapbox1_1.swf" quality="high" width="432" height="364" base="http://images.video.msn.com" type="application/x-shockwave-flash" allowFullScreen="true" allowScriptAccess="always" pluginspage="http://macromedia.com/go/getflashplayer" flashvars="c=v&amp;v=3756a295-a59d-4023-9347-748ecf6407c5&amp;ifs=true&amp;fr=msnvideo&amp;mkt=fr-FR&amp;brand="&gt;&lt;/embed&gt;&lt;br /&gt;&lt;a href="http://video.msn.com/video.aspx?vid=3756a295-a59d-4023-9347-748ecf6407c5" target="_new" title="H-3 avant la BDC"&gt;Video: H-3 avant la BDC&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/5619051591853320584-840958509322103647?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/840958509322103647/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=840958509322103647' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/840958509322103647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/840958509322103647'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2008/04/bdc-2008-jour-j.html' title='BDC 2008 : Jour J !'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-982545930830715277</id><published>2008-03-28T22:53:00.002+01:00</published><updated>2008-04-29T10:44:39.000+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Internet Explorer'/><title type='text'>Créer une activity pour Internet Explorer 8</title><content type='html'>&lt;p&gt;J'ai d&amp;#233;j&amp;#224; parl&amp;#233; dans un pr&amp;#233;c&amp;#233;dent billet de la sortie de la version beta d'IE8, qui parmis ses nouveaut&amp;#233;s apportait les fameuses &amp;quot;activities&amp;quot;. Ces activit&amp;#233;s apparaissent &amp;#224; cot&amp;#233; de la souris lorsqu'on s&amp;#233;lectionne un texte dans le navigateur, ce qui permets d'envoyer la s&amp;#233;lection &amp;#224; une autre page, avec aussi la possibilit&amp;#233; d'en avoir un aper&amp;#231;u. &lt;/p&gt;  &lt;p&gt;Pour mieux vous faire une id&amp;#233;e, voil&amp;#224; un peu &amp;#224; quoi &amp;#231;a ressemble (et si vous &amp;#234;tes &amp;#233;quip&amp;#233; d'IE8, vous pouvez tester directement sur &lt;a href="http://comics.my-underworld.net/"&gt;le site&lt;/a&gt;) :&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://lh4.ggpht.com/adhess/SBbf7aY0rtI/AAAAAAAABEs/tP6dYaUtDGU/s1600-h/iceberg%5B5%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="600" alt="iceberg" src="http://lh4.ggpht.com/adhess/SBbf9aY0ruI/AAAAAAAABE0/ov8v2nmOkAw/iceberg_thumb%5B2%5D.png?imgmax=800" width="697" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Au passage, et avant qu'on ne m'en fasse la remarque, je signale qu'une extension pour firefox existe qui permets d'utiliser ces activities dans le navigateur libre, cependant sans le preview (du moins dans la version que j'ai essay&amp;#233;, je ne doute pas que &amp;#231;a viendra bient&amp;#244;t).&lt;/p&gt;  &lt;p&gt;Je vous vois tous baver d'envie devant cette fonctionnalit&amp;#233; innovante qui fid&amp;#233;lisera vos visiteurs, et vous vous demandez comment en cr&amp;#233;er une pour votre site web... pas la peine de s'&amp;#233;nerver, j'y arrive !&lt;/p&gt;  &lt;p&gt;De quoi est compos&amp;#233; une activity ? Principalement de 3 choses :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Une page de preview &lt;/li&gt;    &lt;li&gt;Une page de destination &lt;/li&gt;    &lt;li&gt;Un fichier XML &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;D'abord la preview : c'est une page qui s'affichera en petit lorsque vous laisserez le curseur sur l'activity. C'est une page web classique, je vous fais confiance pour la faire. N'abusez pas des fioritures, n'oubliez pas que c'est qu'une miniature, faites simple. (dans mon exemple, juste une image)&lt;/p&gt;  &lt;p&gt;La page de destination : c'est la page o&amp;#249; l'utilisateur sera redirig&amp;#233; lorsqu'il cliquera sur l'activity. L&amp;#224; aussi, une page de votre site, rien de bien compliqu&amp;#233;.&lt;/p&gt;  &lt;p&gt;Ensuite, le fichier XML : c'est un fichier qui va d&amp;#233;crire votre activity. Il va contenir les diff&amp;#233;rentes informations utiles au navigateur pour acceder &amp;#224; votre site. Un exemple vaux mieux qu'un long discours, voici le fichier de description de mon activity :&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:4e8be559-0db4-4c5d-9a82-842b0579024a" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="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: #0000FF;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #FF00FF;"&gt;xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;openServiceDescription &lt;/span&gt;&lt;span style="color: #FF0000;"&gt;xmlns&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;=&amp;quot;http://www.microsoft.com/schemas/openservicedescription/1.0&amp;quot;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;homepageUrl&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;http://comics.my-underworld.net&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;homepageUrl&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br /&gt;  &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;display&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;name&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Chercher le personnage de comics&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;name&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;icon&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;http://comics.my-underworld.net/favicon.ico&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;icon&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br /&gt;  &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;display&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;activity &lt;/span&gt;&lt;span style="color: #FF0000;"&gt;category&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;=&amp;quot;Comics&amp;quot;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;activityAction &lt;/span&gt;&lt;span style="color: #FF0000;"&gt;context&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;=&amp;quot;selection&amp;quot;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;preview &lt;/span&gt;&lt;span style="color: #FF0000;"&gt;action&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;= &amp;quot;http://comics.my-underworld.net/preview.php&amp;quot;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;parameter &lt;/span&gt;&lt;span style="color: #FF0000;"&gt;name&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;=&amp;quot;q&amp;quot;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt; value&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;=&amp;quot;{selection}&amp;quot;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;preview&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;execute &lt;/span&gt;&lt;span style="color: #FF0000;"&gt;action&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;=&amp;quot;http://comics.my-underworld.net/recherche.php&amp;quot;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;parameter &lt;/span&gt;&lt;span style="color: #FF0000;"&gt;name&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;=&amp;quot;q&amp;quot;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt; value&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;=&amp;quot;{selection}&amp;quot;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt; type&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;=&amp;quot;text&amp;quot;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;execute&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;activityAction&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;activity&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;openServiceDescription&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;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;C'est pas compliqu&amp;#233;, vous le prenez et vous l'adaptez &amp;#224; vos besoins. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Il vous faudra modifier :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;&amp;lt;homepageUrl&amp;gt; : l'adresse de votre site web&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;&amp;lt;icon&amp;gt; : l'icone de l'activity&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;&amp;lt;activity category=&amp;quot;&lt;em&gt;...&lt;/em&gt;&amp;quot;&amp;gt; : la cat&amp;#233;gorie dans laquelle sera class&amp;#233; l'activity&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;&amp;lt;preview action=&amp;quot;...&amp;quot;&amp;gt; : l'adresse de la page de preview&lt;br /&gt;    &lt;ul&gt;&lt;br /&gt;      &lt;li&gt;&amp;lt;parameter&amp;gt; : les param&amp;#232;tres &amp;#224; passer dans l'url de votre page de preview (vous pouvez en mettre plusieurs). Si la valeur est &amp;quot;{selection}&amp;quot;, le texte s&amp;#233;lectionn&amp;#233; dans IE sera pass&amp;#233; en param&amp;#232;tre.&lt;/li&gt;&lt;br /&gt;    &lt;/ul&gt;&lt;br /&gt;  &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;&amp;lt;execute action=&amp;quot;...&amp;quot;&amp;gt; : l'adresse de redirection lors d'un clic sur l'activity&lt;br /&gt;    &lt;ul&gt;&lt;br /&gt;      &lt;li&gt;&amp;lt;parameter&amp;gt; : m&amp;#234;me principe que pour la preview, les param&amp;#232;tres sont pass&amp;#233;s dans l'url&lt;/li&gt;&lt;br /&gt;    &lt;/ul&gt;&lt;br /&gt;  &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Une fois que c'est fait, vous pouvez enregistrer ce fichier dans votre site web. Pour proposer &amp;#224; vos visiteurs de l'installer, une petite ligne de javascript :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:8c8e8611-f479-4caf-9da4-a77e0a548876" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="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: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;a &lt;/span&gt;&lt;span style="color: #FF0000;"&gt;href&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;=&amp;quot;javascript:window.external.addService('activity.xml')&amp;quot;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Installer l'activity&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;a&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&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;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-982545930830715277?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/982545930830715277/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=982545930830715277' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/982545930830715277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/982545930830715277'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2008/03/crer-une-activity-pour-internet.html' title='Créer une activity pour Internet Explorer 8'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/adhess/SBbf9aY0ruI/AAAAAAAABE0/ov8v2nmOkAw/s72-c/iceberg_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-8381140162952872159</id><published>2008-03-26T18:33:00.003+01:00</published><updated>2008-11-17T12:16:02.335+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Internet Explorer'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>Problème de positionnement lors du redimensionnement de la fenêtre d'Internet Explorer 7</title><content type='html'>&lt;p&gt;J'ai &amp;#233;t&amp;#233; confront&amp;#233; &amp;#224; un bug d'Internet Explorer assez amusant (enfin, jusqu'&amp;#224; ce qu'on veuille le corriger). Voil&amp;#224; une page html tout ce qu'il y a de plus classique :&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:d3537977-17ae-4dcc-adbe-f3f8a2065587" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;   &lt;pre style="color: white; background-overflow: auto"&gt;&lt;div&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;div &lt;/span&gt;&lt;span style="color: #ff0000"&gt;style&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;float: left; position: relative; width:140px; background-color:Red;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;      Menu :&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ul&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;Item 1&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;Item 2&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;Item 3&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ul&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;div &lt;/span&gt;&lt;span style="color: #ff0000"&gt;style&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;float: left; width:500px; background-color:Blue;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;          Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Praesent a magna. Sed&lt;br /&gt;          ipsum dolor, facilisis vitae, placerat quis, pulvinar in, est. Pellentesque habitant&lt;br /&gt;          morbi tristique senectus et netus et malesuada fames ac turpis egestas. Fusce quis&lt;br /&gt;          elit nec tortor tempus luctus. Nam tristique. Pellentesque vitae massa ac arcu lacinia&lt;br /&gt;          blandit. Quisque placerat elementum erat. Suspendisse consectetuer felis semper&lt;br /&gt;          velit. Vivamus vitae est. Nam vel erat. Vestibulum nec nulla. Curabitur sed nisi.&lt;br /&gt;          Suspendisse id odio. Suspendisse potenti. Quisque velit augue, ullamcorper et, gravida&lt;br /&gt;          ultrices, consectetuer sit amet, neque. Phasellus eget nulla. In lacinia mauris&lt;br /&gt;          a enim.&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Ce qui nous donne un rendu assez semblable &amp;#224; ce qu'on attends :&lt;br /&gt;  &lt;br /&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="203" alt="pos1" src="http://lh5.google.com/adhess/R-qI0IuCWWI/AAAAAAAABDo/poQDBa1ihgw/pos1_thumb%5B8%5D.png" width="588" border="0" /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;#160; &lt;br /&gt;(j'ai jamais pr&amp;#233;tendu &amp;#234;tre dou&amp;#233; en design ^^)&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Le probl&amp;#232;me apparait lorsque l'on essaie de redimensionner la fen&amp;#234;tre :&lt;br /&gt;  &lt;br /&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="250" alt="pos2" src="http://lh6.google.com/adhess/R-qI3YuCWYI/AAAAAAAABD4/_4y2wxRZpTg/pos2_thumb%5B3%5D.png" width="588" border="0" /&gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Et oui, le menu passe par dessus l'autre div ! &lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;Lors du redimensionnement, le div bleu a boug&amp;#233; comme il faut, le rouge est rest&amp;#233; immobile.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Apr&amp;#232;s m'&amp;#234;tre arrach&amp;#233; les cheveux sur ce probl&amp;#232;me, j'en suis venu aux conclusions suivantes :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;Le probl&amp;#232;me apparait avec IE6 et IE7 &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;Les autres navigateurs ne posent aucun probl&amp;#232;me &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;Si on recharge la page, elle s'affiche correctement, seul un redimensionnement pose probl&amp;#232;me &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;Le probl&amp;#232;me se pose sur les &amp;#233;l&amp;#233;ments flottants en position relative &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Pour corriger &amp;#231;a, on a 2 solutions :&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;Enlever le &amp;quot;position:relative;&amp;quot; (mais bon, en g&amp;#233;n&amp;#233;ral si il y est, c'est qu'il y a une raison) &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;Mettre le &amp;quot;position:relative;&amp;quot; sur toute la page (en le mettant sur le body) &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Et normalement, vous devriez retrouver un comportement normal lors du redimensionnement...&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-8381140162952872159?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/8381140162952872159/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=8381140162952872159' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/8381140162952872159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/8381140162952872159'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2008/03/problme-de-positionnement-lors-du.html' title='Problème de positionnement lors du redimensionnement de la fenêtre d&amp;#39;Internet Explorer 7'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-4281122914963624134</id><published>2008-03-26T16:04:00.005+01:00</published><updated>2008-03-26T16:11:20.554+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>Centrer un élément de type block</title><content type='html'>&lt;p&gt;C'est pas compliqué, mais il vaut mieux le savoir, plutot que de perdre du temps à comprendre pourquoi ça marche pas. Pour aligner un texte dans un block, c'est tout simple :&lt;/p&gt;  &lt;div style="padding-right: 0px; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px; display: inline" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:ff03c84b-cf41-4569-b676-4de2ea656ba4" class="wlWriterSmartContent"&gt;&lt;pre  style="background-overflow: auto;color:White;"&gt;&lt;div&gt;&lt;span style="color:#800000;"&gt;.baliseBlock &lt;/span&gt;&lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;&lt;br /&gt; text-align&lt;/span&gt;&lt;span style="color:#000000;"&gt;:&lt;/span&gt;&lt;span style="color:#0000FF;"&gt; center&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Par contre, si on veut aligner un block dans un block, ça ne fonctionne pas (enfin, pas avec tous les navigateurs). Pour cela il faut définir la largeur de notre block, et mettre ses margin à auto :&lt;/p&gt;&lt;div style="padding-right: 0px; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px; display: inline" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:ac5aa53e-e7ac-4862-a3d2-d9e442ef22da" class="wlWriterSmartContent"&gt;&lt;pre  style="background-overflow: auto;color:White;"&gt;&lt;div&gt;&lt;span style="color:#800000;"&gt;.baliseACentrer &lt;/span&gt;&lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;&lt;br /&gt; margin-left&lt;/span&gt;&lt;span style="color:#000000;"&gt;:&lt;/span&gt;&lt;span style="color:#0000FF;"&gt; auto&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;&lt;br /&gt; margin-right&lt;/span&gt;&lt;span style="color:#000000;"&gt;:&lt;/span&gt;&lt;span style="color:#0000FF;"&gt; auto&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;&lt;br /&gt; width&lt;/span&gt;&lt;span style="color:#000000;"&gt;:&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;50%&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Maintenant, plus compliqué : si on a défini notre block en positionnement absolu, on ne peux pas centrer en utilisant les margin. Dans ce cas, il va falloir ruser. Attention, cette astuce peut poser certains problèmes si on réduit la page (une partie de la page est rognée, avec impossibilité d'y acceder), soyez-en conscient si vous devez l'utiliser, et préférez systématiquement la méthode précédente si vous le pouvez.&lt;/p&gt;&lt;p&gt;Pour centrer notre élément, on va donc le positionner à 50% du bord gauche, puis le décaler vers la gauche de la moitié de la largeur du block.&lt;/p&gt;&lt;div style="padding-right: 0px; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px; display: inline" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:275790ee-fe9c-464d-99ab-9254665a4271" class="wlWriterSmartContent"&gt;&lt;pre  style="background-overflow: auto;color:White;"&gt;&lt;div&gt;&lt;span style="color:#800000;"&gt;.baliseACentrer &lt;/span&gt;&lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;&lt;br /&gt; position&lt;/span&gt;&lt;span style="color:#000000;"&gt;:&lt;/span&gt;&lt;span style="color:#0000FF;"&gt; absolute&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;&lt;br /&gt; width&lt;/span&gt;&lt;span style="color:#000000;"&gt;:&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;600px&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;&lt;br /&gt; left&lt;/span&gt;&lt;span style="color:#000000;"&gt;:&lt;/span&gt;&lt;span style="color:#0000FF;"&gt; 50%&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;&lt;br /&gt; margin-left&lt;/span&gt;&lt;span style="color:#000000;"&gt;:&lt;/span&gt;&lt;span style="color:#0000FF;"&gt; -300px&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Là ça fonctionne, mais il faut connaitre la taille exacte de notre block pour pouvoir le centrer. Je vous donne une dernière astuce pour utiliser des largeurs non connues à l'avance.&lt;/p&gt;&lt;p&gt;Cette fois, on va utiliser deux blocks imbriqués :&lt;/p&gt;&lt;div style="padding-right: 0px; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px; display: inline" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:98e0f6a8-a6c7-4510-9f92-eee10846cf86" class="wlWriterSmartContent"&gt;&lt;pre  style="background-overflow: auto;color:White;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;div &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;class&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="divExterieur"&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;div &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;class&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="divInterieur"&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;     Contenu...&lt;br /&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;div&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;div&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ce qui va permettre au div intérieur de se décaler vers la gauche en tenant compte de la largeur de son div parent :&lt;/p&gt;&lt;div style="padding-right: 0px; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px; display: inline" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:c0382f02-b74b-43a3-afa1-af00b4e4795d" class="wlWriterSmartContent"&gt;&lt;pre  style="background-overflow: auto;color:White;"&gt;&lt;div&gt;&lt;span style="color:#800000;"&gt;.divExterieur &lt;/span&gt;&lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;&lt;br /&gt; position&lt;/span&gt;&lt;span style="color:#000000;"&gt;:&lt;/span&gt;&lt;span style="color:#0000FF;"&gt; absolute&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;&lt;br /&gt; width&lt;/span&gt;&lt;span style="color:#000000;"&gt;:&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;40%&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;&lt;br /&gt; left&lt;/span&gt;&lt;span style="color:#000000;"&gt;:&lt;/span&gt;&lt;span style="color:#0000FF;"&gt; 50%&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;.divInterieur &lt;/span&gt;&lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;&lt;br /&gt; width&lt;/span&gt;&lt;span style="color:#000000;"&gt;:&lt;/span&gt;&lt;span style="color:#0000FF;"&gt; 100%&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;&lt;br /&gt; margin-left&lt;/span&gt;&lt;span style="color:#000000;"&gt;:&lt;/span&gt;&lt;span style="color:#0000FF;"&gt; -50%&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-4281122914963624134?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/4281122914963624134/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=4281122914963624134' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/4281122914963624134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/4281122914963624134'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2008/03/centrer-un-lment-de-type-block.html' title='Centrer un élément de type block'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-618579004533771920</id><published>2008-03-19T18:09:00.002+01:00</published><updated>2008-03-26T16:12:41.533+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sécurité'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>ValidateRequest : activation par code</title><content type='html'>&lt;p&gt;Attention, ça devient sérieux et ça rigole pas : on va parler sécurité !&lt;/p&gt;  &lt;p&gt;Pour peu que vous vous soyiez un peu interressé au sujet, vous savez qu'il ne faut jamais faire confiance aux utilisateurs et controler tout ce qu'ils font. Si jamais vous faites partie de ces personnes qui ne s'en soucient pas le moins du monde, Asp.net vous protège quand même malgré vous, grâce au ValidateRequest. Bien que ne remplaçant pas une sécurisation correcte du code par le développeur, c'est quand même un formidable atout pour protéger les quelques endroits que vous auriez oublié de sécuriser.   &lt;br /&gt;Le principe : chaque requête est analysée, et si l'une d'entre elle ressemble de près ou de loin à une tentative de piratage, le site renvoie une exception du style : &lt;i&gt;A potentially dangerous Request.Form value was detected from the client (login="&amp;lt;script&amp;gt;hahaha&amp;lt;/scri...").&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;Cependant, bien que très pratique, cette protection peut s'avérer irritante pour certains, si par exemple on estime que l'utilisateur a le droit d'envoyer du code html sur le site. Dans ce cas, pas de soucis, on désactive le ValidateRequest dans la directive de la page :&lt;/p&gt;  &lt;div style="padding-right: 0px; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px; display: inline" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:2caef8e2-45be-4091-8f6f-cf5acef6f80a" class="wlWriterSmartContent"&gt;&lt;pre style="background-color:White;;overflow: auto;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;%@ Page &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Language&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="C#"&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; ValidateRequest&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="false"&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; %&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;voire même dans le web.config pour les plus téméraires :&lt;/p&gt;&lt;div style="padding-right: 0px; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px; display: inline" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:577f4826-8cac-496f-870b-e62f8ee57273" class="wlWriterSmartContent"&gt;&lt;pre style="background-color:White;;overflow: auto;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;pages &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;validateRequest&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="false"&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;   ....&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;pages&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mais voilà le soucis, je suis totalement parano : je me suis vu obligé de désactiver le ValidateRequest pour que les administrateurs de mon site puissent faire leur boulot, mais il est hors de question que je le laisse les utilisateurs anonymes faire n'importe quoi !&lt;/p&gt;&lt;p&gt;Mon premier réflexe a donc été de vérifier par code si l'utilisateur était administrateur avant de décider si j'active ou désactive la sécurité... et déception : aucune propriété "ValidateRequest" dans ma page. &lt;/p&gt;&lt;p&gt;Un petit tour sur le msdn donc, et je tombe sur quelque chose d'interressant : &lt;a href="http://msdn2.microsoft.com/en-us/library/system.web.httprequest.validateinput(VS.71).aspx"&gt;HttpRequest.ValidateInput Method&lt;/a&gt; "Validates data submitted by a client browser and raises an exception if potentially dangerous data is present." ça me plait bien, c'est justement ce que je veux. Je désactive donc le ValidateRequest, et j'appelle cette méthode par code... et là re-déception. Tout semble correct, et pourtant quand je balance un script javascript, ça passe comme si de rien n'était. &lt;/p&gt;&lt;p&gt;Pour comprendre, je vais faire un petit tour dans &lt;a href="http://www.aisto.com/roeder/dotnet/"&gt;Reflector&lt;/a&gt;, et quelle n'est pas ma surprise de voir ça :&lt;/p&gt;&lt;div style="padding-right: 0px; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px; display: inline" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:0c2afccf-5947-4869-92c9-8f1ee44adc97" class="wlWriterSmartContent"&gt;&lt;pre style="background-color:White;;overflow: auto;"&gt;&lt;div&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;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; ValidateInput()&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;._flags.Set(&lt;/span&gt;&lt;span style="color:#800080;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;br /&gt;   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;._flags.Set(&lt;/span&gt;&lt;span style="color:#800080;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;br /&gt;   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;._flags.Set(&lt;/span&gt;&lt;span style="color:#800080;"&gt;4&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;br /&gt;   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;._flags.Set(&lt;/span&gt;&lt;span style="color:#800080;"&gt;0x40&lt;/span&gt;&lt;span style="color:#000000;"&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Au lieu de valider ma requête comme je m'y attendais, cette méthode se contente de modifier un flag. Il s'avère qu'en fait la validation ne s'effectue pas lors de l'appel du ValidateInput, mais lorsque l'on essaie d'acceder à notre HttpRequest. Il suffit donc pour sécuriser notre application de lire dans Request après avoir fait le ValidateInput. Ce qui nous donne quelque chose comme ça (En ayant pris soin auparavant de désactiver le ValidateRequest dans la page) :&lt;/p&gt;&lt;div style="padding-right: 0px; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px; display: inline" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:a07332fb-949a-4687-a81b-7517180acaf1" class="wlWriterSmartContent"&gt;&lt;pre style="background-color:White;;overflow: auto;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;protected&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; Page_Load(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&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:#000000;"&gt;Context.User.IsInRole(&lt;/span&gt;&lt;span style="color:#800000;"&gt;"&lt;/span&gt;&lt;span style="color:#800000;"&gt;administrateur&lt;/span&gt;&lt;span style="color:#800000;"&gt;"&lt;/span&gt;&lt;span style="color:#000000;"&gt;))&lt;br /&gt;   {&lt;br /&gt;       &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;try&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;       {&lt;br /&gt;           &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; on flague le Request&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            Request.ValidateInput();&lt;br /&gt;           &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; on lit un objet qui n'existe pas, juste pour lancer la validation&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;br /&gt;&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; forceValidation &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; Request[&lt;/span&gt;&lt;span style="color:#800000;"&gt;"&lt;/span&gt;&lt;span style="color:#800000;"&gt;ForceValidation&lt;/span&gt;&lt;span style="color:#800000;"&gt;"&lt;/span&gt;&lt;span style="color:#000000;"&gt;];&lt;br /&gt;       }&lt;br /&gt;       &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;catch&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;       {&lt;br /&gt;           &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; on tombe ici si la requête est suspecte&lt;/span&gt;&lt;span style="color:#008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;throw&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En espérant que ça vous sera aussi utile qu'à moi !&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-618579004533771920?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/618579004533771920/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=618579004533771920' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/618579004533771920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/618579004533771920'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2008/03/validaterequest-activation-par-code.html' title='ValidateRequest : activation par code'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-626468802109174422</id><published>2008-03-19T17:37:00.001+01:00</published><updated>2008-03-19T23:08:55.924+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Navigateurs'/><title type='text'>Safari 3.1 disponible en version finale</title><content type='html'>&lt;p&gt;Le navigateur d'Apple est enfin sorti en version finale pour Windows, les d&amp;#233;veloppeurs web vont enfin pouvoir tester leurs sites web dessus sans &amp;#234;tre oblig&amp;#233; d'acheter un Mac.&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://lh6.google.com/adhess/R-GO8ouCWQI/AAAAAAAABC0/c1eT4DfSQ74/safari%5B7%5D"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" border="0" alt="safari" src="http://lh6.google.com/adhess/R-GO9ouCWRI/AAAAAAAABC8/QesPMyAQzOw/safari_thumb%5B5%5D" width="450" height="315" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Evidemment, je l'ai install&amp;#233;, et j'ai test&amp;#233; rapidement. Bilan rapide apr&amp;#232;s quelques minutes d'utilisation : c'est joli, agr&amp;#233;able &amp;#224; utiliser (forc&amp;#233;ment, c'est fait par Apple), mais &amp;#224; part &amp;#231;a, &amp;#231;a casse pas trois pates &amp;#224; un canard. Il plaira certainement &amp;#224; ceux qui n'attendent rien de plus de leur navigateur que la possibilit&amp;#233; de naviguer, les autres feraient mieux de tester Opera (j'ai entendu quelqu'un dire &amp;quot;Firefox&amp;quot; ? faut arr&amp;#234;ter l&amp;#224;, c'est un blog s&amp;#233;rieux !)&lt;/p&gt;  &lt;p&gt;Si vous avez envie de tester, c'est par l&amp;#224; : &lt;a title="http://www.apple.com/safari/download/" href="http://www.apple.com/safari/download/"&gt;http://www.apple.com/safari/download/&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/5619051591853320584-626468802109174422?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/626468802109174422/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=626468802109174422' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/626468802109174422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/626468802109174422'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2008/03/safari-31-disponible-en-version-finale.html' title='Safari 3.1 disponible en version finale'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-7893979055719658956</id><published>2008-03-14T18:24:00.001+01:00</published><updated>2008-03-19T23:14:11.482+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Internet Explorer'/><category scheme='http://www.blogger.com/atom/ns#' term='Navigateurs'/><title type='text'>Internet Explorer 8 - beta 1</title><content type='html'>&lt;p&gt;Et oui, je commence un blog pour parler de web, et je parle d&amp;#233;j&amp;#224; d'Internet Explorer... J'en entends d&amp;#233;j&amp;#224; crier &amp;#224; l'h&amp;#233;r&amp;#233;sie, mais je m'en fous, j'assume !&lt;/p&gt;  &lt;p align="center"&gt;&amp;#160;&lt;a href="http://lh3.google.com/adhess/R-GQL4uCWUI/AAAAAAAABDU/LeAwQdK2TwI/IE8%5B5%5D"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" border="0" alt="IE8" src="http://lh3.google.com/adhess/R-GP04uCWTI/AAAAAAAABDc/-LllSd0kcCQ/IE8_thumb%5B3%5D" width="450" height="287" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;La premi&amp;#232;re beta d'Internet Explorer 8 est disponible depuis un peu plus d'une semaine, et en tant que fou suicidaire je me suis donc empress&amp;#233; de l'installer sur ma machine de d&amp;#233;veloppement. Si &amp;#231;a vous interresse aussi, c'est par l&amp;#224; :    &lt;br /&gt;&lt;a title="http://www.microsoft.com/windows/products/winfamily/ie/ie8/readiness/Install.htm" href="http://www.microsoft.com/windows/products/winfamily/ie/ie8/readiness/Install.htm"&gt;http://www.microsoft.com/windows/products/winfamily/ie/ie8/readiness/Install.htm&lt;/a&gt;     &lt;br /&gt;Notez qu'il est possible de s'en servir avec le moteur de rendu d'Internet Explorer 7, tout en gardant les nouvelles fonctionnalit&amp;#233;s, et m&amp;#234;me pour les plus m&amp;#233;fiants de le d&amp;#233;sinstaller (affichez les mises &amp;#224; jour dans le panneau de suppression des programmes)&lt;/p&gt;  &lt;p&gt;Premi&amp;#232;res impressions : y'a encore du travail... mais on sent qu'il y a eu des efforts de faits. Cette beta passe le test &lt;a href="http://www.webstandards.org/files/acid2/test.html"&gt;Acid2&lt;/a&gt;, mais a du mal avec &amp;#233;norm&amp;#233;ment de &amp;quot;vrais&amp;quot; sites web... Si votre site ne s'affiche pas correctement, ne le corrigez pas pour le moment, vu que le moteur de rendu subira probablement d'autres modifications d'ici la version finale.     &lt;br /&gt;Si vous tenez malgr&amp;#233; tout &amp;#224; ce que votre site s'affiche correctement, vous pouvez ajouter la balise suivante dans l'en-t&amp;#234;te de vos page, qui forcera Internet Explorer a utiliser le rendu de la version 7 :&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="padding-right: 0px; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px; display: inline" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:b3756b90-31e6-4b87-933c-1c8512e55f2a" class="wlWriterSmartContent"&gt;   &lt;pre style="overflow: auto; background-color: white"&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: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;meta &lt;/span&gt;&lt;span style="color: #ff0000"&gt;http-equiv&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;X-UA-Compatible&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; content&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;IE=7&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;br /&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;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Sinon niveau fonctionnalit&amp;#233;s, j'aime beaucoup les &amp;quot;Activities&amp;quot;, qui permettent de s&amp;#233;lectionner du texte et de l'envoyer directement dans une recherche google ou dans un traducteur en ligne. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-7893979055719658956?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/7893979055719658956/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=7893979055719658956' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/7893979055719658956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/7893979055719658956'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2008/03/internet-explorer-8-beta-1.html' title='Internet Explorer 8 - beta 1'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-4140730102564478943</id><published>2008-03-14T15:49:00.001+01:00</published><updated>2008-03-18T12:38:48.820+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BDC'/><category scheme='http://www.blogger.com/atom/ns#' term='Bewise'/><title type='text'>En route pour la Bewise Developer Conference 2008</title><content type='html'>&lt;p&gt;&lt;/p&gt;  &lt;p&gt;La seconde &amp;#233;dition de la Bewise Developper Conference aura lieu &amp;#224; Toulouse le 10 avril prochain &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Cet &amp;#233;v&amp;#232;nement gratuit qui s'adresse aussi bien aux professionnels qu'aux &amp;#233;tudiants et enseignants en informatique est l'occasion de d&amp;#233;couvrir ou d'approfondir ses connaissances dans les derni&amp;#232;res technologies de Microsoft. &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://www.bewise.fr/BDC2008/?f=d50886ea-9d61-4544-9ffc-481d90f79933"&gt;&lt;img src="http://www.bewise.fr/BDC2008/img/BDC2008.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="center"&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;D&amp;#233;veloppez votre avance en assistant aux diff&amp;#233;rentes sessions et en posant vos questions aux experts de Bewise &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Pour les inscriptions, c'est l&amp;#224; : &lt;a href="http://www.bewise.fr/BDC2008/?f=d50886ea-9d61-4544-9ffc-481d90f79933"&gt;BDC 2008&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/5619051591853320584-4140730102564478943?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/4140730102564478943/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=4140730102564478943' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/4140730102564478943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/4140730102564478943'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2008/03/en-route-pour-la-bewise-developer.html' title='En route pour la Bewise Developer Conference 2008'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5619051591853320584.post-1603695081855943292</id><published>2008-03-14T15:38:00.001+01:00</published><updated>2008-03-18T12:07:26.407+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><title type='text'>Moi aussi je me lance dans la grande aventure des blogs !</title><content type='html'>&lt;p&gt;Depuis le temps que je me dis que je devrais en faire un, le voil&amp;#224; enfin : mon blog !&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Au programme : D&amp;#233;veloppement html, css, asp.net, navigateurs... en gros,tout ce qui tourne autour du web :) Le web c'est le bien, n'&amp;#233;coutez pas les grincheux qui en disent du mal !&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Au passage, merci &amp;#224; &lt;a href="http://sharepoint.over-blog.fr/"&gt;Laurent&lt;/a&gt; pour m'avoir trouv&amp;#233; le titre du blog !&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5619051591853320584-1603695081855943292?l=blog.adhess.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.adhess.net/feeds/1603695081855943292/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5619051591853320584&amp;postID=1603695081855943292' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/1603695081855943292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5619051591853320584/posts/default/1603695081855943292'/><link rel='alternate' type='text/html' href='http://blog.adhess.net/2008/03/moi-aussi-je-me-lance-dans-la-grande.html' title='Moi aussi je me lance dans la grande aventure des blogs !'/><author><name>Guillaume Lacasa</name><uri>http://www.blogger.com/profile/07262792943297038722</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
