<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Blog d&#039;Arthis</title>
	<atom:link href="http://yoannr.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://yoannr.wordpress.com</link>
	<description>En attendant la prochaine glaciation...</description>
	<lastBuildDate>Tue, 01 Nov 2011 13:53:40 +0000</lastBuildDate>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='yoannr.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Blog d&#039;Arthis</title>
		<link>http://yoannr.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://yoannr.wordpress.com/osd.xml" title="Blog d&#039;Arthis" />
	<atom:link rel='hub' href='http://yoannr.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Introduction à CQRS/ES</title>
		<link>http://yoannr.wordpress.com/2011/11/01/introduction-a-cqrses/</link>
		<comments>http://yoannr.wordpress.com/2011/11/01/introduction-a-cqrses/#comments</comments>
		<pubDate>Tue, 01 Nov 2011 13:44:14 +0000</pubDate>
		<dc:creator>yoannr</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://yoannr.wordpress.com/?p=191</guid>
		<description><![CDATA[CQRS est un acronyme pour Command Query Responsibility Segregation.C&#8217;est à dire la séparation de  responsabilité des commandes et des query. Le principe est très simple et peut être enonce comme : Poser une question ne doit pas changer la réponse.   Voici à quoi ressemble une application classique : Le domaine va  devoir gérer aussi bien l&#8217;entrée d&#8217;information que la sortie. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yoannr.wordpress.com&amp;blog=6541953&amp;post=191&amp;subd=yoannr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>CQRS est un acronyme pour Command Query Responsibility Segregation.C&#8217;est à dire la séparation de  responsabilité des commandes et des query. Le principe est très simple et peut être enonce comme : <strong><em>Poser une question ne doit pas changer la réponse.  </em></strong></p>
<p>Voici à quoi ressemble une application classique :<br />
<img class="aligncenter" src="http://cqrs.files.wordpress.com/2010/11/image.png?w=550&amp;h=412" alt="application classique" /></p>
<p>Le domaine va  devoir gérer aussi bien l&#8217;entrée d&#8217;information que la sortie. Or comme vous le savez, les requêtes de sorties sont souvent quelque chose de compliqué. Assez souvent on a besoin d&#8217;utiliser et de créer des objects qui ne serviront qu&#8217;a un usage bien particulier. Or le domaine doit gérer ces particularismes et les intégrer dans ses pérégrinations.</p>
<p>C&#8217;est la qu&#8217;intervient CQRS, en séparant les commandes des query on arrive a un schema plus simple car bien delimite :<br />
<img class="aligncenter" src="http://cqrs.files.wordpress.com/2010/11/image13.png?w=496&amp;h=553" alt="Command sous CQRS" /></p>
<p>Le client envoie une commande (l&#8217;équivalent du DTO du schema classique) à l&#8217;application. Cette command correspond a un fonction void. Si je prends l&#8217;exemple d&#8217;une application twitter, on pourrait avoir une comand comme ceci :</p>
<div>
<div><code> </code><code>public</code> <code>class</code> <code>PostNewTweetCommand : CommandBase</code></div>
<div><code>    </code><code>{</code></div>
<div><code>        </code><code>public</code> <code>string</code> <code>Message { </code><code>get</code><code>; </code><code>set</code><code>; }</code></div>
<div><code>        </code><code>public</code> <code>string</code> <code>Who { </code><code>get</code><code>; </code><code>set</code><code>; }</code></div>
<div><code>    </code><code>}</code></div>
<div>L&#8217;application reçoit cette Command et sait la traiter. En fonction des règles de validation et de disponibilité de l&#8217;infrastructure (réseau, ..) on peut imaginer que cette action sera un succès ou entraînera une exception. Au client de gérer cet état de fait.</div>
</div>
<div>Le cote query est quant à lui gérer séparement via une interface très légère qui s&#8217;occupe d&#8217;optimiser les query.</div>
<p><img class="aligncenter" src="http://cqrs.files.wordpress.com/2010/11/image12.png?w=455&amp;h=521" alt="CQRS coté query" /></p>
<p>La database est attaquée directement par la couche mince d’accès aux données comme par exemple linq2sql ou  autre chose d&#8217;encore plus léger, et permet ainsi une optimisation des query sans alourdir le cote command.</p>
<p>Credits pour les exemples et les images :</p>
<p>www.dddcqrs.com par Greg Young</p>
<p>le projet framework nCQRS</p>
<div><span style="font-family:monospace;"><br />
</span></div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/yoannr.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/yoannr.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/yoannr.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/yoannr.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/yoannr.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/yoannr.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/yoannr.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/yoannr.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/yoannr.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/yoannr.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/yoannr.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/yoannr.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/yoannr.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/yoannr.wordpress.com/191/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yoannr.wordpress.com&amp;blog=6541953&amp;post=191&amp;subd=yoannr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://yoannr.wordpress.com/2011/11/01/introduction-a-cqrses/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b70a8002f84b4100aba364db4b440efc?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Arthis</media:title>
		</media:content>

		<media:content url="http://cqrs.files.wordpress.com/2010/11/image.png?w=550&#038;h=412" medium="image">
			<media:title type="html">application classique</media:title>
		</media:content>

		<media:content url="http://cqrs.files.wordpress.com/2010/11/image13.png?w=496&#038;h=553" medium="image">
			<media:title type="html">Command sous CQRS</media:title>
		</media:content>

		<media:content url="http://cqrs.files.wordpress.com/2010/11/image12.png?w=455&#038;h=521" medium="image">
			<media:title type="html">CQRS coté query</media:title>
		</media:content>
	</item>
		<item>
		<title>FlexBox according to my needs</title>
		<link>http://yoannr.wordpress.com/2011/09/26/flexbox-according-to-my-needs/</link>
		<comments>http://yoannr.wordpress.com/2011/09/26/flexbox-according-to-my-needs/#comments</comments>
		<pubDate>Mon, 26 Sep 2011 08:04:56 +0000</pubDate>
		<dc:creator>yoannr</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">https://yoannr.wordpress.com/2011/09/26/flexbox-according-to-my-needs/</guid>
		<description><![CDATA[In order to share some tought, this post will be in english , sorry for french readers. I needed to change the Jquery Flexbox to get a select that could be filtered like a textbox without removing any items from the list if the little arrow on the right was clicked. I had to change [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yoannr.wordpress.com&amp;blog=6541953&amp;post=188&amp;subd=yoannr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>In order to share some tought, this post will be in english , sorry for french readers.</p>
<p>I needed to change the Jquery Flexbox to get a select that could be filtered like a textbox without removing any items from the list if the little arrow on the right was clicked.</p>
<p>I had to change the FlexBox Jquery script in order to get <a href="http://dl.free.fr/mK5BpRKe9">this</a>. (full source at the end of this article if the link does not work anymore)</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>And then I packed it up in an usercontrol ASCX in order to ghet my control ready for my use :</p>
<p>page aspx :</p>
<p><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="background-image:none;line-height:normal;background-attachment:scroll;background-repeat:repeat;background-position:0 0;" lang="EN-US"><span style="color:#000000;">&lt;%</span></span><span style="line-height:normal;" lang="EN-US"><span style="color:#0000ff;">@</span></span><span style="line-height:normal;" lang="EN-US"><span style="line-height:normal;"><span style="color:#800000;">Control</span></span><span style="line-height:normal;"><span style="color:#ff0000;">Language</span></span><span style="line-height:normal;"><span style="color:#0000ff;">=&nbsp;&raquo;C#&nbsp;&raquo;</span></span><span style="line-height:normal;"><span style="color:#ff0000;">AutoEventWireup</span></span><span style="line-height:normal;"><span style="color:#0000ff;">=&nbsp;&raquo;true&nbsp;&raquo;</span></span><span style="line-height:normal;"><span style="color:#ff0000;">CodeBehind</span></span><span style="line-height:normal;"><span style="color:#0000ff;">=&nbsp;&raquo;AutoCompleteDropDownList.ascx.cs&nbsp;&raquo;</span></span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">    </span></span><span style="line-height:normal;"><span style="color:#ff0000;">Inherits</span></span><span style="line-height:normal;"><span style="color:#0000ff;">=&nbsp;&raquo;Super.Web.userControl.AutoCompleteDropDownList&nbsp;&raquo;</span></span><span style="background-image:none;line-height:normal;background-attachment:scroll;background-repeat:repeat;background-position:0 0;"><span style="color:#000000;">%&gt;</span></span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;font-family:Aharoni;font-size:xx-small;"> </span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;" lang="EN-US"><span style="color:#0000ff;">&lt;</span></span><span style="line-height:normal;" lang="EN-US"><span style="color:#800000;">div</span></span><span style="line-height:normal;" lang="EN-US"><span style="line-height:normal;"><span style="color:#ff0000;">runat</span></span><span style="line-height:normal;"><span style="color:#0000ff;">=server</span></span><span style="line-height:normal;"><span style="color:#ff0000;">id</span></span><span style="line-height:normal;"><span style="color:#0000ff;">=C_DDL_AutoComplete&gt;&lt;/</span></span><span style="line-height:normal;"><span style="color:#800000;">div</span></span><span style="line-height:normal;"><span style="color:#0000ff;">&gt;</span></span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;font-family:Aharoni;font-size:xx-small;"> </span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;" lang="EN-US"><span style="color:#0000ff;">&lt;</span></span><span style="line-height:normal;" lang="EN-US"><span style="color:#800000;">script</span></span><span style="line-height:normal;" lang="EN-US"><span style="line-height:normal;"><span style="color:#ff0000;">type</span></span><span style="line-height:normal;"><span style="color:#0000ff;">=&nbsp;&raquo;text/javascript&nbsp;&raquo;&gt;</span></span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;font-family:Aharoni;font-size:xx-small;"> </span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="color:#000000;"><span style="line-height:normal;">    </span>jQuery.noConflict()(</span><span style="line-height:normal;"><span style="color:#0000ff;">function</span></span><span style="color:#000000;">($){</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="color:#000000;"><span style="line-height:normal;">        </span>$(document).ready(</span><span style="line-height:normal;"><span style="color:#0000ff;">function</span></span><span style="color:#000000;">() {</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="color:#000000;"><span style="line-height:normal;">            </span>$(</span><span style="line-height:normal;"><span style="color:#800000;">&#8216;#<span style="background-image:none;line-height:normal;background-attachment:scroll;background-repeat:repeat;background-position:0 0;">&lt;%</span>= C_DDL_AutoComplete.ClientID<span style="line-height:normal;">  </span><span style="background-image:none;line-height:normal;background-attachment:scroll;background-repeat:repeat;background-position:0 0;">%&gt;</span>&#8216;</span></span><span style="color:#000000;">).flexbox({</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">                </span></span><span style="line-height:normal;"><span style="color:#800000;">&laquo;&nbsp;results&nbsp;&raquo;</span></span><span style="color:#000000;">: <span style="background-image:none;line-height:normal;background-attachment:scroll;background-repeat:repeat;background-position:0 0;">&lt;%</span></span><span style="line-height:normal;"><span style="color:#0000ff;">=</span></span><span style="color:#000000;"> JsonDataSource <span style="background-image:none;line-height:normal;background-attachment:scroll;background-repeat:repeat;background-position:0 0;">%&gt;</span>,</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">                 </span></span><span style="line-height:normal;"><span style="color:#800000;">&laquo;&nbsp;total&nbsp;&raquo;</span></span><span style="color:#000000;">: <span style="background-image:none;line-height:normal;background-attachment:scroll;background-repeat:repeat;background-position:0 0;">&lt;%</span></span><span style="line-height:normal;"><span style="color:#0000ff;">=</span></span><span style="color:#000000;"> JsonDataSourceTotal </span><span style="background-image:none;line-height:normal;background-attachment:scroll;background-repeat:repeat;background-position:0 0;"><span style="color:#000000;">%&gt;</span></span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;">            </span>}, {</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="color:#000000;"><span style="line-height:normal;">                </span>watermark : </span><span style="line-height:normal;"><span style="color:#800000;">&#8216;<span style="background-image:none;line-height:normal;background-attachment:scroll;background-repeat:repeat;background-position:0 0;">&lt;%</span>= WaterMark <span style="background-image:none;line-height:normal;background-attachment:scroll;background-repeat:repeat;background-position:0 0;">%&gt;</span>&#8216;</span></span><span style="color:#000000;">,</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="color:#000000;"><span style="line-height:normal;">                </span>width: <span style="background-image:none;line-height:normal;background-attachment:scroll;background-repeat:repeat;background-position:0 0;">&lt;%</span></span><span style="line-height:normal;"><span style="color:#0000ff;">=</span></span><span style="color:#000000;"> Width <span style="background-image:none;line-height:normal;background-attachment:scroll;background-repeat:repeat;background-position:0 0;">%&gt;</span>,</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="color:#000000;"><span style="line-height:normal;">                </span>allowInput: <span style="background-image:none;line-height:normal;background-attachment:scroll;background-repeat:repeat;background-position:0 0;">&lt;%</span></span><span style="line-height:normal;"><span style="color:#0000ff;">=</span></span><span style="color:#000000;"> AutoComplete.ToString().ToLower() <span style="background-image:none;line-height:normal;background-attachment:scroll;background-repeat:repeat;background-position:0 0;">%&gt;</span>,</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="color:#000000;"><span style="line-height:normal;">                </span>paging : </span><span style="line-height:normal;"><span style="color:#0000ff;">false</span></span><span style="color:#000000;">,</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="color:#000000;"><span style="line-height:normal;">                </span>onSelect: </span><span style="line-height:normal;"><span style="color:#0000ff;">function</span></span><span style="color:#000000;">() { $(</span><span style="line-height:normal;"><span style="color:#800000;">&#8216;#<span style="background-image:none;line-height:normal;background-attachment:scroll;background-repeat:repeat;background-position:0 0;">&lt;%</span>= C_Hid_SelectedValue.ClientID <span style="background-image:none;line-height:normal;background-attachment:scroll;background-repeat:repeat;background-position:0 0;">%&gt;</span>&#8216;</span></span><span style="color:#000000;">).val(</span><span style="line-height:normal;"><span style="color:#0000ff;">this</span></span><span style="color:#000000;">.value);}<span style="line-height:normal;">  </span></span><span style="line-height:normal;"><span style="color:#006400;">//onselect</span></span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="color:#000000;"><span style="line-height:normal;">               </span>}); </span><span style="line-height:normal;"><span style="color:#006400;">//flexbox</span></span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">             </span></span><span style="line-height:normal;"><span style="color:#0000ff;">var</span></span><span style="color:#000000;"> idSelected = $(</span><span style="line-height:normal;"><span style="color:#800000;">&#8216;#<span style="background-image:none;line-height:normal;background-attachment:scroll;background-repeat:repeat;background-position:0 0;">&lt;%</span>= C_Hid_SelectedValue.ClientID <span style="background-image:none;line-height:normal;background-attachment:scroll;background-repeat:repeat;background-position:0 0;">%&gt;</span>&#8216;</span></span><span style="color:#000000;">).val();</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="color:#000000;"><span style="line-height:normal;">             </span>$(</span><span style="line-height:normal;"><span style="color:#800000;">&#8216;#<span style="background-image:none;line-height:normal;background-attachment:scroll;background-repeat:repeat;background-position:0 0;">&lt;%</span>= C_DDL_AutoComplete.ClientID<span style="line-height:normal;">  </span><span style="background-image:none;line-height:normal;background-attachment:scroll;background-repeat:repeat;background-position:0 0;">%&gt;</span>&#8216;</span></span><span style="color:#000000;">).setIdValue(idSelected);</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;font-family:Aharoni;font-size:xx-small;"> </span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="color:#000000;"><span style="line-height:normal;">             </span>Data= </span><span style="line-height:normal;"><span style="color:#800000;">&#8216;<span style="background-image:none;line-height:normal;background-attachment:scroll;background-repeat:repeat;background-position:0 0;">&lt;%</span>= JsonDataSource <span style="background-image:none;line-height:normal;background-attachment:scroll;background-repeat:repeat;background-position:0 0;">%&gt;</span>&#8216;</span></span><span style="color:#000000;">;</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;">             </span>DataJson = $.parseJSON(Data);</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">             </span></span><span style="line-height:normal;"><span style="color:#0000ff;">for</span></span><span style="color:#000000;">(index=0;index&lt;DataJson.length;index++)</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;">             </span>{</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">                </span></span><span style="line-height:normal;"><span style="color:#0000ff;">if</span></span><span style="color:#000000;">(DataJson[index].id==idSelected)</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;">                </span>{</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="color:#000000;"><span style="line-height:normal;">                    </span>$(</span><span style="line-height:normal;"><span style="color:#800000;">&#8216;#<span style="background-image:none;line-height:normal;background-attachment:scroll;background-repeat:repeat;background-position:0 0;">&lt;%</span>= C_DDL_AutoComplete.ClientID<span style="line-height:normal;">  </span><span style="background-image:none;line-height:normal;background-attachment:scroll;background-repeat:repeat;background-position:0 0;">%&gt;</span>&#8216;</span></span><span style="color:#000000;">).setValue(DataJson[index].name);</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">                    </span></span><span style="line-height:normal;"><span style="color:#0000ff;">break</span></span><span style="color:#000000;">; ;</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;">                </span>}</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;">             </span>}</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="line-height:normal;"><span style="color:#000000;font-family:Aharoni;font-size:xx-small;">             </span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="line-height:normal;"><span style="color:#000000;font-family:Aharoni;font-size:xx-small;">             </span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="color:#000000;"><span style="line-height:normal;">        </span>});</span><span style="line-height:normal;"><span style="color:#006400;">//ready</span></span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="line-height:normal;"><span style="color:#000000;font-family:Aharoni;font-size:xx-small;">        </span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="color:#000000;"><span style="line-height:normal;">    </span>});</span><span style="line-height:normal;"><span style="color:#006400;">//No conflict</span></span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="line-height:normal;"><span style="color:#000000;font-family:Aharoni;font-size:xx-small;">   </span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;" lang="EN-US"><span style="color:#0000ff;">&lt;/</span></span><span style="line-height:normal;" lang="EN-US"><span style="color:#800000;">script</span></span><span style="line-height:normal;" lang="EN-US"><span style="color:#0000ff;">&gt;</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;" align="center"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;font-family:Aharoni;font-size:xx-small;"> </span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;" lang="EN-US"><span style="color:#0000ff;">&lt;</span></span><span style="line-height:normal;" lang="EN-US"><span style="color:#800000;">asp</span></span><span style="line-height:normal;" lang="EN-US"><span style="color:#0000ff;">:</span></span><span style="line-height:normal;" lang="EN-US"><span style="color:#800000;">HiddenField</span></span><span style="line-height:normal;" lang="EN-US"><span style="line-height:normal;"><span style="color:#ff0000;">runat</span></span><span style="line-height:normal;"><span style="color:#0000ff;">=server</span></span><span style="line-height:normal;"><span style="color:#ff0000;">ID</span></span><span style="line-height:normal;"><span style="color:#0000ff;">=C_Hid_SelectedValue</span></span><span style="line-height:normal;"><span style="color:#0000ff;">/&gt;</span></span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;">
<p class="MsoNormal" style="line-height:normal;margin:0;">
<p class="MsoNormal" style="line-height:normal;margin:0;">
<p class="MsoNormal" style="line-height:normal;margin:0;">
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="color:#000000;font-size:x-small;"><span style="line-height:normal;" lang="EN-US"><span style="line-height:normal;">and its code behind :</span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;">
<p class="MsoNormal" style="line-height:normal;margin:0;">
<p class="MsoNormal" style="line-height:normal;margin:0;">
<p class="MsoNormal" style="line-height:normal;margin:0;">
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;" lang="EN-US"><span style="color:#0000ff;">using</span></span><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"> System;</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;" lang="EN-US"><span style="color:#0000ff;">using</span></span><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"> System.Collections.Generic;</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;" lang="EN-US"><span style="color:#0000ff;">using</span></span><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"> System.Linq;</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;" lang="EN-US"><span style="color:#0000ff;">using</span></span><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"> System.Web;</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;" lang="EN-US"><span style="color:#0000ff;">using</span></span><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"> System.Web.UI;</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;" lang="EN-US"><span style="color:#0000ff;">using</span></span><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"> System.Web.UI.WebControls;</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;" lang="EN-US"><span style="color:#0000ff;">using</span></span><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"> Super.Core;</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;font-family:Aharoni;font-size:xx-small;"> </span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;" lang="EN-US"><span style="color:#0000ff;">namespace</span></span><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"> Super.Web.userControl</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;font-family:Aharoni;font-size:xx-small;">{</span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;font-family:Aharoni;font-size:xx-small;"> </span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">    </span></span><span style="line-height:normal;"><span style="color:#0000ff;">public</span></span><span style="line-height:normal;"><span style="color:#0000ff;">partial</span></span><span style="line-height:normal;"><span style="color:#0000ff;">class</span></span><span style="line-height:normal;"><span style="color:#2b91af;">AutoCompleteDropDownList</span></span><span style="color:#000000;"> : </span><span style="line-height:normal;"><span style="color:#2b91af;">UserControl</span></span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;">    </span>{</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">        </span></span><span style="line-height:normal;"><span style="color:#0000ff;">private</span></span><span style="line-height:normal;"><span style="color:#0000ff;">int</span></span><span style="color:#000000;"> _Width = 350;</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">        </span></span><span style="line-height:normal;"><span style="color:#0000ff;">private</span></span><span style="line-height:normal;"><span style="color:#0000ff;">bool</span></span><span style="color:#000000;"> _AutoComplete = </span><span style="line-height:normal;"><span style="color:#0000ff;">true</span></span><span style="color:#000000;">;</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;font-family:Aharoni;font-size:xx-small;"> </span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">        </span></span><span style="line-height:normal;"><span style="color:#0000ff;">protected</span></span><span style="line-height:normal;"><span style="color:#0000ff;">string</span></span><span style="color:#000000;"> JsonDataSource;</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">        </span></span><span style="line-height:normal;"><span style="color:#0000ff;">protected</span></span><span style="line-height:normal;"><span style="color:#0000ff;">string</span></span><span style="color:#000000;"> JsonDataSourceTotal;</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;font-family:Aharoni;font-size:xx-small;"> </span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;font-family:Aharoni;font-size:xx-small;"> </span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">        </span></span><span style="line-height:normal;"><span style="color:#0000ff;">public</span></span><span style="line-height:normal;"><span style="color:#000000;">  </span></span><span style="line-height:normal;"><span style="color:#2b91af;">IEnumerable</span></span><span style="color:#000000;">&lt;</span><span style="line-height:normal;"><span style="color:#2b91af;">EntitaVisualizzazione</span></span><span style="color:#000000;">&gt; DataSource;</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">        </span></span><span style="line-height:normal;"><span style="color:#808080;">///</span></span><span style="line-height:normal;"><span style="color:#808080;">&lt;summary&gt;</span></span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">        </span></span><span style="line-height:normal;"><span style="color:#808080;">///</span></span><span style="line-height:normal;"><span style="color:#008000;"> [{ "id": "myid" , "name" : "myName" },</span></span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">        </span></span><span style="line-height:normal;"><span style="color:#808080;">///</span></span><span style="line-height:normal;"><span style="color:#008000;"> { "id": "myid2" , "name" : "myName2" },</span></span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">        </span></span><span style="line-height:normal;"><span style="color:#808080;">///</span></span><span style="line-height:normal;"><span style="color:#008000;"> { "id": "myid3" , "name" : "myName3" }]</span></span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">        </span></span><span style="line-height:normal;"><span style="color:#808080;">///</span></span><span style="line-height:normal;"><span style="color:#808080;">&lt;/summary&gt;</span></span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">        </span></span><span style="line-height:normal;"><span style="color:#0000ff;">public</span></span><span style="line-height:normal;"><span style="color:#0000ff;">string</span></span><span style="color:#000000;"> DataSourceJsonClient { </span><span style="line-height:normal;"><span style="color:#0000ff;">get</span></span><span style="color:#000000;">; </span><span style="line-height:normal;"><span style="color:#0000ff;">set</span></span><span style="color:#000000;">; }</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">        </span></span><span style="line-height:normal;"><span style="color:#808080;">///</span></span><span style="line-height:normal;"><span style="color:#808080;">&lt;summary&gt;</span></span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">        </span></span><span style="line-height:normal;"><span style="color:#808080;">///</span></span><span style="line-height:normal;"><span style="color:#008000;"> Number of elements provided in DataSourceJsonClient</span></span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">        </span></span><span style="line-height:normal;"><span style="color:#808080;">///</span></span><span style="line-height:normal;"><span style="color:#808080;">&lt;/summary&gt;</span></span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">        </span></span><span style="line-height:normal;"><span style="color:#0000ff;">public</span></span><span style="line-height:normal;"><span style="color:#0000ff;">int</span></span><span style="color:#000000;">? DataSourceJsonClientTotal { </span><span style="line-height:normal;"><span style="color:#0000ff;">get</span></span><span style="color:#000000;">; </span><span style="line-height:normal;"><span style="color:#0000ff;">set</span></span><span style="color:#000000;">; }</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">        </span></span><span style="line-height:normal;"><span style="color:#0000ff;">public</span></span><span style="line-height:normal;"><span style="color:#0000ff;">int</span></span><span style="color:#000000;"> Width</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;">        </span>{</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">            </span></span><span style="line-height:normal;"><span style="color:#0000ff;">get</span></span><span style="color:#000000;"> { </span><span style="line-height:normal;"><span style="color:#0000ff;">return</span></span><span style="color:#000000;"> _Width; }</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">            </span></span><span style="line-height:normal;"><span style="color:#0000ff;">set</span></span><span style="color:#000000;"> { _Width = </span><span style="line-height:normal;"><span style="color:#0000ff;">value</span></span><span style="color:#000000;">; }</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;">        </span>}</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">        </span></span><span style="line-height:normal;"><span style="color:#0000ff;">public</span></span><span style="line-height:normal;"><span style="color:#0000ff;">bool</span></span><span style="color:#000000;"> AutoComplete</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;">        </span>{</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">            </span></span><span style="line-height:normal;"><span style="color:#0000ff;">get</span></span><span style="color:#000000;"> { </span><span style="line-height:normal;"><span style="color:#0000ff;">return</span></span><span style="color:#000000;"> _AutoComplete; }</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">            </span></span><span style="line-height:normal;"><span style="color:#0000ff;">set</span></span><span style="color:#000000;"> { _AutoComplete = </span><span style="line-height:normal;"><span style="color:#0000ff;">value</span></span><span style="color:#000000;">; }</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;">        </span>}</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">        </span></span><span style="line-height:normal;"><span style="color:#0000ff;">public</span></span><span style="line-height:normal;"><span style="color:#0000ff;">string</span></span><span style="color:#000000;"> WaterMark { </span><span style="line-height:normal;"><span style="color:#0000ff;">get</span></span><span style="color:#000000;">; </span><span style="line-height:normal;"><span style="color:#0000ff;">set</span></span><span style="color:#000000;">; }</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">        </span></span><span style="line-height:normal;"><span style="color:#0000ff;">public</span></span><span style="line-height:normal;"><span style="color:#0000ff;">string</span></span><span style="color:#000000;"> SelectedValue </span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;">        </span>{</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">            </span></span><span style="line-height:normal;"><span style="color:#0000ff;">get</span></span><span style="color:#000000;"> { </span><span style="line-height:normal;"><span style="color:#0000ff;">return</span></span><span style="color:#000000;"> C_Hid_SelectedValue.Value; }</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">            </span></span><span style="line-height:normal;"><span style="color:#0000ff;">set</span></span><span style="color:#000000;"> { C_Hid_SelectedValue.Value=</span><span style="line-height:normal;"><span style="color:#0000ff;">value</span></span><span style="color:#000000;">; }</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;">        </span>}</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;font-family:Aharoni;font-size:xx-small;"> </span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;">
<p class="MsoNormal" style="line-height:normal;margin:0;">
<p><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;font-family:Aharoni;font-size:xx-small;"> </span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">        </span></span><span style="line-height:normal;"><span style="color:#0000ff;">protected</span></span><span style="line-height:normal;"><span style="color:#0000ff;">override</span></span><span style="line-height:normal;"><span style="color:#0000ff;">void</span></span><span style="color:#000000;"> OnPreRender(</span><span style="line-height:normal;"><span style="color:#2b91af;">EventArgs</span></span><span style="color:#000000;"> e)</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;" lang="EN-US"><span style="line-height:normal;">        </span></span><span style="line-height:normal;">{</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">            </span></span><span style="line-height:normal;"><span style="color:#0000ff;">base</span></span><span style="color:#000000;">.OnPreRender(e);</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;"><span style="color:#000000;font-family:Aharoni;font-size:xx-small;"> </span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="color:#000000;"><span style="line-height:normal;">            </span>JsonDataSource = </span><span style="line-height:normal;"><span style="color:#0000ff;">string</span></span><span style="color:#000000;">.Empty;</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="line-height:normal;"><span style="color:#000000;">            </span></span></span><span style="line-height:normal;" lang="EN-US"><span style="color:#0000ff;">if</span></span><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"> (!</span><span style="line-height:normal;"><span style="color:#0000ff;">string</span></span><span style="color:#000000;">.IsNullOrEmpty(DataSourceJsonClient) &amp;&amp; DataSource != </span><span style="line-height:normal;"><span style="color:#0000ff;">null</span></span><span style="color:#000000;">)</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;">            </span>{</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">                </span></span><span style="line-height:normal;"><span style="color:#0000ff;">throw</span></span><span style="line-height:normal;"><span style="color:#0000ff;">new</span></span><span style="line-height:normal;"><span style="color:#2b91af;">Exception</span></span><span style="color:#000000;">(</span><span style="line-height:normal;"><span style="color:#a31515;">&laquo;&nbsp;DataSourceJson and DataSource cannot be filled at the same time&nbsp;&raquo;</span></span><span style="color:#000000;">);</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;">            </span>}</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;font-family:Aharoni;font-size:xx-small;"> </span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;font-family:Aharoni;font-size:xx-small;"> </span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">            </span></span><span style="line-height:normal;"><span style="color:#0000ff;">if</span></span><span style="color:#000000;"> (!</span><span style="line-height:normal;"><span style="color:#0000ff;">string</span></span><span style="color:#000000;">.IsNullOrEmpty(DataSourceJsonClient))</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;">            </span>{</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">                </span></span><span style="line-height:normal;"><span style="color:#0000ff;">if</span></span><span style="color:#000000;"> (!DataSourceJsonClientTotal.HasValue)</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">                    </span></span><span style="line-height:normal;"><span style="color:#0000ff;">throw</span></span><span style="line-height:normal;"><span style="color:#0000ff;">new</span></span><span style="line-height:normal;"><span style="color:#2b91af;">Exception</span></span><span style="color:#000000;">(</span><span style="line-height:normal;"><span style="color:#a31515;">&laquo;&nbsp;DataSourceJsonClientTotal must have a value, when DataSourceJsonClient is filled&nbsp;&raquo;</span></span><span style="color:#000000;">);</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;font-family:Aharoni;font-size:xx-small;"> </span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">                </span></span><span style="line-height:normal;"><span style="color:#0000ff;">if</span></span><span style="color:#000000;"> (!</span><span style="line-height:normal;"><span style="color:#0000ff;">string</span></span><span style="color:#000000;">.IsNullOrEmpty(SelectedValue))</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;">               </span><span style="line-height:normal;"> </span>{</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">                    </span></span><span style="line-height:normal;"><span style="color:#0000ff;">if</span></span><span style="color:#000000;"> (!DataSourceJsonClient.ToLower().Contains(</span><span style="line-height:normal;"><span style="color:#0000ff;">string</span></span><span style="color:#000000;">.Format(</span><span style="line-height:normal;"><span style="color:#a31515;">&nbsp;&raquo; id : &#8216;{0}&#8217;&nbsp;&raquo;</span></span><span style="color:#000000;">,SelectedValue).ToLower()))</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">                        </span></span><span style="line-height:normal;"><span style="color:#0000ff;">throw</span></span><span style="line-height:normal;"><span style="color:#0000ff;">new</span></span><span style="line-height:normal;"><span style="color:#2b91af;">Exception</span></span><span style="color:#000000;">(</span><span style="line-height:normal;"><span style="color:#0000ff;">string</span></span><span style="color:#000000;">.Format(</span><span style="line-height:normal;"><span style="color:#a31515;">&laquo;&nbsp;The SelectedValue &#8216;{0}&#8217; was not found in the Items of the DataSourceJsonClient&nbsp;&raquo;</span></span><span style="color:#000000;">, SelectedValue));</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;">                </span>}</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;font-family:Aharoni;font-size:xx-small;"> </span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;">                </span>JsonDataSource = DataSourceJsonClient;</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;">                </span>JsonDataSourceTotal = DataSourceJsonClientTotal.Value.ToString();</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;">            </span>}</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">            </span></span><span style="line-height:normal;"><span style="color:#0000ff;">else</span></span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;">            </span>{</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">                </span></span><span style="line-height:normal;"><span style="color:#0000ff;">if</span></span><span style="color:#000000;"> (DataSource != </span><span style="line-height:normal;"><span style="color:#0000ff;">null</span></span><span style="color:#000000;">)</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;">                </span>{</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">                    </span></span><span style="line-height:normal;"><span style="color:#0000ff;">if</span></span><span style="color:#000000;"> (!</span><span style="line-height:normal;"><span style="color:#0000ff;">string</span></span><span style="color:#000000;">.IsNullOrEmpty(SelectedValue))</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;">                    </span>{</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">                        </span></span><span style="line-height:normal;"><span style="color:#0000ff;">if</span></span><span style="color:#000000;"> (!DataSource.Any(x =&gt; x.Id == SelectedValue))</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">                            </span></span><span style="line-height:normal;"><span style="color:#0000ff;">throw</span></span><span style="line-height:normal;"><span style="color:#0000ff;">new</span></span><span style="line-height:normal;"><span style="color:#2b91af;">Exception</span></span><span style="color:#000000;">(</span><span style="line-height:normal;"><span style="color:#0000ff;">string</span></span><span style="color:#000000;">.Format(</span><span style="line-height:normal;"><span style="color:#a31515;">&laquo;&nbsp;The SelectedValue &#8216;{0}&#8217; was not found in the Items of the Datasource&nbsp;&raquo;</span></span><span style="color:#000000;">, SelectedValue));</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;" lang="EN-US"><span style="line-height:normal;">                    </span></span><span style="line-height:normal;">}</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;"><span style="color:#000000;font-family:Aharoni;font-size:xx-small;"> </span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="color:#000000;"><span style="line-height:normal;">                    </span>JsonDataSource = </span><span style="line-height:normal;"><span style="color:#a31515;">&laquo;&nbsp;["</span></span><span style="color:#000000;">;</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">                    </span></span><span style="line-height:normal;"><span style="color:#0000ff;">foreach</span></span><span style="color:#000000;"> (</span><span style="line-height:normal;"><span style="color:#2b91af;">IEntitaVisualizzazione</span></span><span style="color:#000000;"> entita </span><span style="line-height:normal;"><span style="color:#0000ff;">in</span></span><span style="color:#000000;"> DataSource)</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;">                    </span>{</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="color:#000000;"><span style="line-height:normal;">                        </span>JsonDataSource += </span><span style="line-height:normal;"><span style="color:#0000ff;">string</span></span><span style="color:#000000;">.Format(</span><span style="line-height:normal;"><span style="color:#a31515;">@"{{ ""id"": ""{0}"", ""name"": ""{1}"" }},"</span></span><span style="color:#000000;">, entita.Id, entita.Descrizione);</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="line-height:normal;">                    </span></span><span style="line-height:normal;" lang="EN-US">}</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;"><span style="color:#000000;">                    </span></span><span style="line-height:normal;"><span style="color:#0000ff;">if</span></span><span style="color:#000000;"> (!</span><span style="line-height:normal;"><span style="color:#0000ff;">string</span></span><span style="color:#000000;">.IsNullOrEmpty(JsonDataSource))</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;">                        </span>JsonDataSource = JsonDataSource.Substring(0, JsonDataSource.Length - 1);</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;font-family:Aharoni;font-size:xx-small;"> </span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="color:#000000;"><span style="line-height:normal;">                    </span>JsonDataSource += </span><span style="line-height:normal;"><span style="color:#a31515;">"]&laquo;&nbsp;</span></span><span style="color:#000000;">;</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;font-family:Aharoni;font-size:xx-small;"> </span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;">                    </span>JsonDataSourceTotal = DataSource.Count().ToString();</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;" lang="EN-US"><span style="color:#000000;font-family:Aharoni;font-size:xx-small;"> </span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;" lang="EN-US"><span style="line-height:normal;">                </span></span><span style="line-height:normal;">}</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;">            </span>}</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;"><span style="line-height:normal;"><span style="color:#000000;font-family:Aharoni;font-size:xx-small;">            </span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;">        </span>}</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;">
<p><span style="line-height:normal;"><span style="color:#000000;"><span style="font-family:Aharoni;"><span style="font-size:xx-small;"><span style="line-height:normal;">    </span>}</span></span></span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;"><span style="color:#000000;font-family:Aharoni;font-size:xx-small;">}</span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;">
<p class="MsoNormal" style="line-height:normal;margin:0;"><span style="line-height:normal;"><span style="color:#000000;">and here is my final use in a standard aspx page :</span></span></p>
<p class="MsoNormal" style="line-height:normal;margin:0;">
<blockquote><p>&lt;Super:AutoCompleteDropDownList runat=&nbsp;&raquo;server&nbsp;&raquo; ID=&nbsp;&raquo;C_DDL_Lotti&nbsp;&raquo;<br />
DataSource=&nbsp;&raquo;&lt;%# Entities %&gt;&nbsp;&raquo;&gt;&lt;/Super:AutoCompleteDropDownList&gt;</p></blockquote>
<p>and its code behind :</p>
<p>protected IEnumerable&lt;MyEntity&gt; Entities;</p>
<p>Entities = GetMyListFromDatabse()<br />
.Select(x =&gt; new MyEntity()<br />
{<br />
Id = x.Id.ToString(),<br />
Descrizione = x.DescrizioneComplete<br />
});</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>FlexBox Jquery script :</p>
<p>/*!</p>
<p>* jQuery FlexBox $Version: 0.9.6 $</p>
<p>*</p>
<p>* Copyright (c) 2008-2010 Noah Heldman and Fairway Technologies (http://www.fairwaytech.com/flexbox)</p>
<p>* Licensed under Ms-PL (http://www.codeplex.com/flexbox/license)</p>
<p>*</p>
<p>* $Date: 2010-11-24 01:02:00 PM $</p>
<p>* $Rev: 0.9.6.1 $</p>
<p>*/</p>
<p>(function ($) {</p>
<p>$.flexbox = function (div, o) {</p>
<p>&nbsp;</p>
<p>// TODO: in straight type-ahead mode (showResults: false), if noMatchingResults, dropdown appears after new match</p>
<p>// TODO: consider having options.mode (select, which replaces html select; combobox; suggest; others?)</p>
<p>// TODO: on resize (at least when wrapping within a table), the arrow is pushed down to the next line</p>
<p>// TODO: check for boundary/value problems (such as minChars of -1) and alert them</p>
<p>// TODO: add options for advanced paging template</p>
<p>// TODO: general cleanup and refactoring, commenting</p>
<p>// TODO: detailed Exception handling, logging</p>
<p>// TODO: FF2, up arrow from bottom has erratic scroll behavior (if multiple flexboxes on page)</p>
<p>// TODO: FF2 (and maybe IE7): if maxVisibleRows == number of returned rows, height is a bit off (maybe set to auto?)</p>
<p>// TODO: escape key only works from input box (this might be okay)</p>
<p>// TODO: make .getJSON parameters (object and callback function) configurable (e.g. when calling yahoo image search)</p>
<p>// TODO: escape key reverts to previous value (FF only?) (is this a good thing?)</p>
<p>&nbsp;</p>
<p>// TEST: highlightMatches uses the case of whatever you typed in to replace the match string, which can look funny</p>
<p>// TEST: handle pageDown and pageUp keys when scrolling through results</p>
<p>// TEST: allow client-side paging (return all data initially, set paging:{pageSize:#}, and ensure maxCacheBytes is &gt; 0)</p>
<p>// TEST: accept json object as first parameter to flexbox instead of page source, and have it work like a combobox</p>
<p>// TEST: implement no results template</p>
<p>// TEST: implement noResultsText and class</p>
<p>// TEST: watermark color should be configurable (and so should default input color)</p>
<p>// TEST: exception handling and alerts for common mistakes</p>
<p>// TEST: first example should use defaults ONLY</p>
<p>// TEST: add property initialValue, so you can set it when the flexbox loads</p>
<p>// TEST: handle hidden input value for form submissions</p>
<p>// TEST: how can we allow programmatically setting the field value (and therefore hidden value).  add jquery function?</p>
<p>// TEST: use pageSize parameter as threshold to switch from no paging to paging based on results</p>
<p>// TEST: if you type in an input value that matches the html, it might display html code (try typing &laquo;&nbsp;class&nbsp;&raquo; in the input box)</p>
<p>// TEST: don&#8217;t require all paging subprops (let default override)</p>
<p>// TEST: when tabbing from one ffb to another, the previous ffb results flash&#8230;</p>
<p>// TEST: IE7: when two non-paging ffbs right after each other, with only a clear-both div between them, the bottom ffb jumps down when selecting a value, then jumps back up on mouseover</p>
<p>// TEST: FF2, make sure we scroll to top before showing results (maxVisibleRows only)</p>
<p>// TEST: if maxVisibleRows is hiding the value the user types in to the input, scroll to that value (is this even possible?)</p>
<p>// TEST: make sure caching supports multiple ffbs uniquely</p>
<p>// TEST: when entering a number in the paging input box, the results are displayed twice</p>
<p>&nbsp;</p>
<p>var timeout = false,      // hold timeout ID for suggestion results to appear</p>
<p>cache = [],                   // simple array with cacheData key values, MRU is the first element</p>
<p>cacheData = [],         // associative array holding actual cached data</p>
<p>cacheSize = 0,                // size of cache in bytes (cache up to o.maxCacheBytes bytes)</p>
<p>delim = &#8216;\u25CA&#8217;,       // use an obscure unicode character (lozenge) as the cache key delimiter</p>
<p>scrolling = false,</p>
<p>pageSize = o.paging &amp;&amp; o.paging.pageSize ? o.paging.pageSize : 0,</p>
<p>retrievingRemoteData = false,</p>
<p>$div = $(div).css(&#8216;position&#8217;, &#8216;relative&#8217;).css(&#8216;z-index&#8217;, 0);</p>
<p>&nbsp;</p>
<p>// The hiddenField MUST be appended to the div before the input, or IE7 does not shift the dropdown below the input field (it overlaps)</p>
<p>var $hdn = $(&#8216;&lt;input type=&nbsp;&raquo;hidden&nbsp;&raquo;/&gt;&#8217;)</p>
<p>.attr(&#8216;id&#8217;, $div.attr(&#8216;id&#8217;) + &#8216;_hidden&#8217;)</p>
<p>.attr(&#8216;name&#8217;, $div.attr(&#8216;id&#8217;))</p>
<p>.val(o.initialValue)</p>
<p>.appendTo($div);</p>
<p>var $input = $(&#8216;&lt;input/&gt;&#8217;)</p>
<p>.attr(&#8216;id&#8217;, $div.attr(&#8216;id&#8217;) + &#8216;_input&#8217;)</p>
<p>.attr(&#8216;autocomplete&#8217;, &#8216;off&#8217;)</p>
<p>.addClass(o.inputClass)</p>
<p>.css(&#8216;width&#8217;, o.width + &#8216;px&#8217;)</p>
<p>.appendTo($div)</p>
<p>.click(function (e) {</p>
<p>if (o.watermark !== &nbsp;&raquo; &amp;&amp; this.value === o.watermark)</p>
<p>this.value = &nbsp;&raquo;;</p>
<p>else</p>
<p>this.select();</p>
<p>})</p>
<p>.focus(function (e) {</p>
<p>$(this).removeClass(&#8216;watermark&#8217;);</p>
<p>})</p>
<p>.blur(function (e) {</p>
<p>if (this.value === &nbsp;&raquo;) $hdn.val(&nbsp;&raquo;);</p>
<p>setTimeout(function () { if (!$input.data(&#8216;active&#8217;)) hideResults(); }, 200);</p>
<p>})</p>
<p>.keydown(processKeyDown);</p>
<p>&nbsp;</p>
<p>if (o.initialValue !== &nbsp;&raquo;)</p>
<p>$input.val(o.initialValue).removeClass(&#8216;watermark&#8217;);</p>
<p>else</p>
<p>$input.val(o.watermark).addClass(&#8216;watermark&#8217;);</p>
<p>&nbsp;</p>
<p>var arrowWidth = 0;</p>
<p>if (o.showArrow &amp;&amp; o.showResults) {</p>
<p>var arrowClick = function () {</p>
<p>if ($ctr.is(&#8216;:visible&#8217;)) {</p>
<p>hideResults();</p>
<p>}</p>
<p>else {</p>
<p>$input.focus();</p>
<p>if (o.watermark !== &nbsp;&raquo; &amp;&amp; $input.val() === o.watermark)</p>
<p>$input.val(&nbsp;&raquo;);</p>
<p>else</p>
<p>$input.select();</p>
<p>if (timeout)</p>
<p>clearTimeout(timeout);</p>
<p>timeout = setTimeout(function () { flexbox(1, true, o.arrowQuery); }, o.queryDelay);</p>
<p>}</p>
<p>};</p>
<p>var $arrow = $(&#8216;&lt;span&gt;&lt;/span&gt;&#8217;)</p>
<p>.attr(&#8216;id&#8217;, $div.attr(&#8216;id&#8217;) + &#8216;_arrow&#8217;)</p>
<p>.addClass(o.arrowClass)</p>
<p>.addClass(&#8216;out&#8217;)</p>
<p>.hover(function () {</p>
<p>$(this).removeClass(&#8216;out&#8217;).addClass(&#8216;over&#8217;);</p>
<p>}, function () {</p>
<p>$(this).removeClass(&#8216;over&#8217;).addClass(&#8216;out&#8217;);</p>
<p>})</p>
<p>.mousedown(function () {</p>
<p>$(this).removeClass(&#8216;over&#8217;).addClass(&#8216;active&#8217;);</p>
<p>})</p>
<p>.mouseup(function () {</p>
<p>$(this).removeClass(&#8216;active&#8217;).addClass(&#8216;over&#8217;);</p>
<p>})</p>
<p>.click(arrowClick)</p>
<p>.appendTo($div);</p>
<p>arrowWidth = $arrow.width();</p>
<p>$input.css(&#8216;width&#8217;, (o.width &#8211; arrowWidth) + &#8216;px&#8217;);</p>
<p>}</p>
<p>if (o.selectBehavior)</p>
<p>{ o.selectFirstMatch = false; $input.click(arrowClick); } // simulate &lt;select&gt; behavior</p>
<p>&nbsp;</p>
<p>// Handle presence of CSS Universal Selector (*) that defines padding by verifying what the browser thinks the outerHeight is.</p>
<p>// In FF, the outerHeight() will not pick up the correct input field padding</p>
<p>var inputPad = $input.outerHeight() &#8211; $input.height() &#8211; 2;</p>
<p>var inputWidth = $input.outerWidth() &#8211; 2;</p>
<p>var top = $input.outerHeight();</p>
<p>&nbsp;</p>
<p>if (inputPad === 0) {</p>
<p>inputWidth += 4;</p>
<p>top += 4;</p>
<p>}</p>
<p>else if (inputPad !== 4) {</p>
<p>inputWidth += inputPad;</p>
<p>top += inputPad;</p>
<p>}</p>
<p>&nbsp;</p>
<p>var $ctr = $(&#8216;&lt;div&gt;&lt;/div&gt;&#8217;)</p>
<p>.attr(&#8216;id&#8217;, $div.attr(&#8216;id&#8217;) + &#8216;_ctr&#8217;)</p>
<p>.css(&#8216;width&#8217;, inputWidth + arrowWidth)</p>
<p>.css(&#8216;top&#8217;, top)</p>
<p>.css(&#8216;left&#8217;, 0)</p>
<p>.addClass(o.containerClass)</p>
<p>.appendTo($div)</p>
<p>.mousedown(function (e) {</p>
<p>$input.data(&#8216;active&#8217;, true);</p>
<p>})</p>
<p>.hide();</p>
<p>&nbsp;</p>
<p>var $content = $(&#8216;&lt;div&gt;&lt;/div&gt;&#8217;)</p>
<p>.addClass(o.contentClass)</p>
<p>.appendTo($ctr)</p>
<p>.scroll(function () {</p>
<p>scrolling = true;</p>
<p>});</p>
<p>&nbsp;</p>
<p>var $paging = $(&#8216;&lt;div&gt;&lt;/div&gt;&#8217;).appendTo($ctr);</p>
<p>$div.css(&#8216;height&#8217;, $input.outerHeight());</p>
<p>&nbsp;</p>
<p>function processKeyDown(e) {</p>
<p>// handle modifiers</p>
<p>var mod = 0;</p>
<p>if (typeof (e.ctrlKey) !== &#8216;undefined&#8217;) {</p>
<p>if (e.ctrlKey) mod |= 1;</p>
<p>if (e.shiftKey) mod |= 2;</p>
<p>} else {</p>
<p>if (e.modifiers &amp; Event.CONTROL_MASK) mod |= 1;</p>
<p>if (e.modifiers &amp; Event.SHIFT_MASK) mod |= 2;</p>
<p>}</p>
<p>// if the keyCode is one of the modifiers, bail out (we&#8217;ll catch it on the next keypress)</p>
<p>if (/16$|17$/.test(e.keyCode)) return; // 16 = Shift, 17 = Ctrl</p>
<p>&nbsp;</p>
<p>var tab = e.keyCode === 9, esc = e.keyCode === 27;</p>
<p>var tabWithModifiers = e.keyCode === 9 &amp;&amp; mod &gt; 0;</p>
<p>var backspace = e.keyCode === 8; // we will end up extending the delay time for backspaces&#8230;</p>
<p>&nbsp;</p>
<p>// tab is a special case, since we want to bubble events&#8230;</p>
<p>if (tab) if (getCurr()) selectCurr();</p>
<p>&nbsp;</p>
<p>// handling up/down/escape/right arrow/left arrow requires results to be visible</p>
<p>// handling enter requires that AND a result to be selected</p>
<p>if ((/27$|38$|33$|34$/.test(e.keyCode) &amp;&amp; $ctr.is(&#8216;:visible&#8217;)) ||</p>
<p>(/13$|40$/.test(e.keyCode)) || !o.allowInput) {</p>
<p>&nbsp;</p>
<p>if (e.preventDefault) e.preventDefault();</p>
<p>if (e.stopPropagation) e.stopPropagation();</p>
<p>&nbsp;</p>
<p>e.cancelBubble = true;</p>
<p>e.returnValue = false;</p>
<p>&nbsp;</p>
<p>switch (e.keyCode) {</p>
<p>case 38: // up arrow</p>
<p>prevResult();</p>
<p>break;</p>
<p>case 40: // down arrow</p>
<p>if ($ctr.is(&#8216;:visible&#8217;)) nextResult();</p>
<p>else flexboxDelay(true);</p>
<p>break;</p>
<p>case 13: // enter</p>
<p>if (getCurr()) selectCurr();</p>
<p>else flexboxDelay(true);</p>
<p>break;</p>
<p>case 27: //   escape</p>
<p>hideResults();</p>
<p>break;</p>
<p>case 34: // page down</p>
<p>if (!retrievingRemoteData) {</p>
<p>if (o.paging) $(&#8216;#&#8217; + $div.attr(&#8216;id&#8217;) + &#8216;n&#8217;).click();</p>
<p>else nextPage();</p>
<p>}</p>
<p>break;</p>
<p>case 33: // page up</p>
<p>if (!retrievingRemoteData) {</p>
<p>if (o.paging) $(&#8216;#&#8217; + $div.attr(&#8216;id&#8217;) + &#8216;p&#8217;).click();</p>
<p>else prevPage();</p>
<p>}</p>
<p>break;</p>
<p>default:</p>
<p>if (!o.allowInput) { return; }</p>
<p>}</p>
<p>} else if (!esc &amp;&amp; !tab &amp;&amp; !tabWithModifiers) { // skip esc and tab key and any modifiers</p>
<p>flexboxDelay(false, backspace);</p>
<p>}</p>
<p>}</p>
<p>&nbsp;</p>
<p>function flexboxDelay(simulateArrowClick, increaseDelay) {</p>
<p>if (timeout) clearTimeout(timeout);</p>
<p>var delay = increaseDelay ? o.queryDelay * 5 : o.queryDelay;</p>
<p>timeout = setTimeout(function () { flexbox(1, simulateArrowClick, &nbsp;&raquo;); }, delay);</p>
<p>}</p>
<p>&nbsp;</p>
<p>function flexbox(p, arrowOrPagingClicked, prevQuery) {</p>
<p>if (arrowOrPagingClicked) prevQuery = &nbsp;&raquo;;</p>
<p>var q = prevQuery &amp;&amp; prevQuery.length &gt; 0 ? prevQuery : $.trim($input.val());</p>
<p>&nbsp;</p>
<p>if (q.length &gt;= o.minChars || arrowOrPagingClicked) {</p>
<p>// If we are getting data from the server, set the height of the content box so it doesn&#8217;t shrink when navigating between pages, due to the $content.html(&nbsp;&raquo;) below&#8230;</p>
<p>if ($content.outerHeight() &gt; 0)</p>
<p>$content.css(&#8216;height&#8217;, $content.outerHeight());</p>
<p>$content.html(&nbsp;&raquo;).attr(&#8216;scrollTop&#8217;, 0);</p>
<p>&nbsp;</p>
<p>var cached = checkCache(q, p);</p>
<p>&nbsp;</p>
<p>if ((cached &amp;&amp; !arrowOrPagingClicked &amp;&amp; o.selectBehavior) || (cached &amp;&amp; !o.selectBehavior)) {</p>
<p>$content.css(&#8216;height&#8217;, &#8216;auto&#8217;);</p>
<p>displayItems(cached.data, q);</p>
<p>showPaging(p, cached.t);</p>
<p>}</p>
<p>else {</p>
<p>var params = { q: q, p: p, s: pageSize, contentType: &#8216;application/json; charset=utf-8&#8242; };</p>
<p>var callback = function (data, overrideQuery) {</p>
<p>if (overrideQuery === true) q = overrideQuery; // must compare to boolean because by default, the string value &laquo;&nbsp;success&nbsp;&raquo; is passed when the jQuery $.getJSON method&#8217;s callback is called</p>
<p>var totalResults = parseInt(data[o.totalProperty]);</p>
<p>&nbsp;</p>
<p>// Handle client-side paging, if any paging configuration options were specified</p>
<p>if (isNaN(totalResults) &amp;&amp; o.paging) {</p>
<p>if (o.maxCacheBytes &lt;= 0) alert(&#8216;The &laquo;&nbsp;maxCacheBytes&nbsp;&raquo; configuration option must be greater\nthan zero when implementing client-side paging.&#8217;);</p>
<p>totalResults = data[o.resultsProperty].length;</p>
<p>&nbsp;</p>
<p>var pages = totalResults / pageSize;</p>
<p>if (totalResults % pageSize &gt; 0) pages = parseInt(++pages);</p>
<p>&nbsp;</p>
<p>for (var i = 1; i &lt;= pages; i++) {</p>
<p>var pageData = {};</p>
<p>pageData[o.totalProperty] = totalResults;</p>
<p>pageData[o.resultsProperty] = data[o.resultsProperty].splice(0, pageSize);</p>
<p>if (i === 1) totalSize = displayItems(pageData, q);</p>
<p>updateCache(q, i, pageSize, totalResults, pageData, totalSize);</p>
<p>}</p>
<p>}</p>
<p>else {</p>
<p>var totalSize = displayItems(data, q);</p>
<p>updateCache(q, p, pageSize, totalResults, data, totalSize);</p>
<p>}</p>
<p>showPaging(p, totalResults);</p>
<p>$content.css(&#8216;height&#8217;, &#8216;auto&#8217;);</p>
<p>retrievingRemoteData = false;</p>
<p>};</p>
<p>if (typeof (o.source) === &#8216;object&#8217;) {</p>
<p>if ((!o.allowInput || o.selectBehavior) &amp;&amp; arrowOrPagingClicked)</p>
<p>callback(o.source);</p>
<p>else</p>
<p>callback(filter(o.source, params));</p>
<p>&nbsp;</p>
<p>}</p>
<p>else {</p>
<p>retrievingRemoteData = true;</p>
<p>if (o.method.toUpperCase() == &#8216;POST&#8217;) $.post(o.source, params, callback, &#8216;json&#8217;);</p>
<p>else $.getJSON(o.source, params, callback);</p>
<p>}</p>
<p>}</p>
<p>} else</p>
<p>hideResults();</p>
<p>}</p>
<p>&nbsp;</p>
<p>function filter(data, params) {</p>
<p>var filtered = {};</p>
<p>filtered[o.resultsProperty] = [];</p>
<p>filtered[o.totalProperty] = 0;</p>
<p>var index = 0;</p>
<p>&nbsp;</p>
<p>for (var i = 0; i &lt; data[o.resultsProperty].length; i++) {</p>
<p>var indexOfMatch = data[o.resultsProperty][i][o.displayValue].toLowerCase().indexOf(params.q.toLowerCase());</p>
<p>if ((o.matchAny &amp;&amp; indexOfMatch !== -1) || (!o.matchAny &amp;&amp; indexOfMatch === 0)) {</p>
<p>filtered[o.resultsProperty][index++] = data[o.resultsProperty][i];</p>
<p>filtered[o.totalProperty] += 1;</p>
<p>}</p>
<p>}</p>
<p>if (o.paging) {</p>
<p>var start = (params.p &#8211; 1) * params.s;</p>
<p>var howMany = (start + params.s) &gt; filtered[o.totalProperty] ? filtered[o.totalProperty] &#8211; start : params.s;</p>
<p>filtered[o.resultsProperty] = filtered[o.resultsProperty].splice(start, howMany);</p>
<p>}</p>
<p>return filtered;</p>
<p>}</p>
<p>&nbsp;</p>
<p>function showPaging(p, totalResults) {</p>
<p>$paging.html(&nbsp;&raquo;).removeClass(o.paging.cssClass); // clear out for threshold scenarios</p>
<p>if (o.showResults &amp;&amp; o.paging &amp;&amp; totalResults &gt; pageSize) {</p>
<p>var pages = totalResults / pageSize;</p>
<p>if (totalResults % pageSize &gt; 0) pages = parseInt(++pages);</p>
<p>outputPagingLinks(pages, p, totalResults);</p>
<p>}</p>
<p>}</p>
<p>&nbsp;</p>
<p>function handleKeyPress(e, page, totalPages) {</p>
<p>if (/^13$|^39$|^37$/.test(e.keyCode)) {</p>
<p>if (e.preventDefault)</p>
<p>e.preventDefault();</p>
<p>if (e.stopPropagation)</p>
<p>e.stopPropagation();</p>
<p>&nbsp;</p>
<p>e.cancelBubble = true;</p>
<p>e.returnValue = false;</p>
<p>&nbsp;</p>
<p>switch (e.keyCode) {</p>
<p>case 13: // Enter</p>
<p>if (/^\d+$/.test(page) &amp;&amp; page &gt; 0 &amp;&amp; page &lt;= totalPages)</p>
<p>flexbox(page, true);</p>
<p>else</p>
<p>alert(&#8216;Please enter a page number between 1 and &#8216; + totalPages);</p>
<p>// TODO: make this alert a function call, and a customizable parameter</p>
<p>break;</p>
<p>case 39: // right arrow</p>
<p>$(&#8216;#&#8217; + $div.attr(&#8216;id&#8217;) + &#8216;n&#8217;).click();</p>
<p>break;</p>
<p>case 37: // left arrow</p>
<p>$(&#8216;#&#8217; + $div.attr(&#8216;id&#8217;) + &#8216;p&#8217;).click();</p>
<p>break;</p>
<p>}</p>
<p>}</p>
<p>}</p>
<p>&nbsp;</p>
<p>function handlePagingClick(e) {</p>
<p>flexbox(parseInt($(this).attr(&#8216;page&#8217;)), true, $input.attr(&#8216;pq&#8217;)); // pq == previous query</p>
<p>return false;</p>
<p>}</p>
<p>&nbsp;</p>
<p>function outputPagingLinks(totalPages, currentPage, totalResults) {</p>
<p>// TODO: make these configurable images</p>
<p>var first = &#8216;&amp;lt;&amp;lt;&#8217;,</p>
<p>prev = &#8216;&amp;lt;&#8217;,</p>
<p>next = &#8216;&amp;gt;&#8217;,</p>
<p>last = &#8216;&amp;gt;&amp;gt;&#8217;,</p>
<p>more = &#8216;&#8230;&#8217;;</p>
<p>&nbsp;</p>
<p>$paging.addClass(o.paging.cssClass);</p>
<p>&nbsp;</p>
<p>// set up our base page link element</p>
<p>var $link = $(&#8216;&lt;a/&gt;&#8217;)</p>
<p>.attr(&#8216;href&#8217;, &#8216;#&#8217;)</p>
<p>.addClass(&#8216;page&#8217;)</p>
<p>.click(handlePagingClick),</p>
<p>$span = $(&#8216;&lt;span&gt;&lt;/span&gt;&#8217;).addClass(&#8216;page&#8217;),</p>
<p>divId = $div.attr(&#8216;id&#8217;);</p>
<p>&nbsp;</p>
<p>// show first page</p>
<p>if (currentPage &gt; 1) {</p>
<p>$link.clone(true).attr(&#8216;id&#8217;, divId + &#8216;f&#8217;).attr(&#8216;page&#8217;, 1).html(first).appendTo($paging);</p>
<p>$link.clone(true).attr(&#8216;id&#8217;, divId + &#8216;p&#8217;).attr(&#8216;page&#8217;, currentPage &#8211; 1).html(prev).appendTo($paging);</p>
<p>}</p>
<p>else {</p>
<p>$span.clone(true).html(first).appendTo($paging);</p>
<p>$span.clone(true).html(prev).appendTo($paging);</p>
<p>}</p>
<p>&nbsp;</p>
<p>if (o.paging.style === &#8216;links&#8217;) {</p>
<p>var maxPageLinks = o.paging.maxPageLinks;</p>
<p>// show page numbers</p>
<p>if (totalPages &lt;= maxPageLinks) {</p>
<p>for (var i = 1; i &lt;= totalPages; i++) {</p>
<p>if (i === currentPage) {</p>
<p>$span.clone(true).html(currentPage).appendTo($paging);</p>
<p>}</p>
<p>else {</p>
<p>$link.clone(true).attr(&#8216;page&#8217;, i).html(i).appendTo($paging);</p>
<p>}</p>
<p>}</p>
<p>}</p>
<p>else {</p>
<p>if ((currentPage + parseInt(maxPageLinks / 2)) &gt; totalPages) {</p>
<p>startPage = totalPages &#8211; maxPageLinks + 1;</p>
<p>}</p>
<p>else {</p>
<p>startPage = currentPage &#8211; parseInt(maxPageLinks / 2);</p>
<p>}</p>
<p>&nbsp;</p>
<p>if (startPage &gt; 1) {</p>
<p>$link.clone(true).attr(&#8216;page&#8217;, startPage &#8211; 1).html(more).appendTo($paging);</p>
<p>}</p>
<p>else {</p>
<p>startPage = 1;</p>
<p>}</p>
<p>&nbsp;</p>
<p>for (var i = startPage; i &lt; startPage + maxPageLinks; i++) {</p>
<p>if (i === currentPage) {</p>
<p>$span.clone(true).html(i).appendTo($paging);</p>
<p>}</p>
<p>else {</p>
<p>$link.clone(true).attr(&#8216;page&#8217;, i).html(i).appendTo($paging);</p>
<p>}</p>
<p>}</p>
<p>&nbsp;</p>
<p>if (totalPages &gt; (startPage + maxPageLinks)) {</p>
<p>$link.clone(true).attr(&#8216;page&#8217;, i).html(more).appendTo($paging);</p>
<p>}</p>
<p>}</p>
<p>}</p>
<p>else if (o.paging.style === &#8216;input&#8217;) {</p>
<p>var $pagingBox = $(&#8216;&lt;input/&gt;&#8217;)</p>
<p>.addClass(&#8216;box&#8217;)</p>
<p>.click(function (e) {</p>
<p>this.select();</p>
<p>})</p>
<p>.keypress(function (e) {</p>
<p>return handleKeyPress(e, this.value, totalPages);</p>
<p>})</p>
<p>.val(currentPage)</p>
<p>.appendTo($paging);</p>
<p>}</p>
<p>&nbsp;</p>
<p>if (currentPage &lt; totalPages) {</p>
<p>$link.clone(true).attr(&#8216;id&#8217;, divId + &#8216;n&#8217;).attr(&#8216;page&#8217;, +currentPage + 1).html(next).appendTo($paging);</p>
<p>$link.clone(true).attr(&#8216;id&#8217;, divId + &#8216;l&#8217;).attr(&#8216;page&#8217;, totalPages).html(last).appendTo($paging);</p>
<p>}</p>
<p>else {</p>
<p>$span.clone(true).html(next).appendTo($paging);</p>
<p>$span.clone(true).html(last).appendTo($paging);</p>
<p>}</p>
<p>var startingResult = (currentPage &#8211; 1) * pageSize + 1;</p>
<p>var endingResult = (startingResult &gt; (totalResults &#8211; pageSize)) ? totalResults : startingResult + pageSize &#8211; 1;</p>
<p>&nbsp;</p>
<p>if (o.paging.showSummary) {</p>
<p>var summaryData = {</p>
<p>&laquo;&nbsp;start&nbsp;&raquo;: startingResult,</p>
<p>&laquo;&nbsp;end&nbsp;&raquo;: endingResult,</p>
<p>&laquo;&nbsp;total&nbsp;&raquo;: totalResults,</p>
<p>&laquo;&nbsp;page&nbsp;&raquo;: currentPage,</p>
<p>&laquo;&nbsp;pages&nbsp;&raquo;: totalPages</p>
<p>};</p>
<p>var html = o.paging.summaryTemplate.applyTemplate(summaryData);</p>
<p>$(&#8216;&lt;br/&gt;&#8217;).appendTo($paging);</p>
<p>$(&#8216;&lt;span&gt;&lt;/span&gt;&#8217;)</p>
<p>.addClass(o.paging.summaryClass)</p>
<p>.html(html)</p>
<p>.appendTo($paging);</p>
<p>}</p>
<p>}</p>
<p>&nbsp;</p>
<p>function checkCache(q, p) {</p>
<p>var key = q + delim + p; // use null character as delimiter</p>
<p>if (cacheData[key]) {</p>
<p>for (var i = 0; i &lt; cache.length; i++) { // TODO: is it possible to not loop here?</p>
<p>if (cache[i] === key) {</p>
<p>// pull out the matching element (splice), and add it to the beginning of the array (unshift)</p>
<p>cache.unshift(cache.splice(i, 1)[0]);</p>
<p>return cacheData[key];</p>
<p>}</p>
<p>}</p>
<p>}</p>
<p>return false;</p>
<p>}</p>
<p>&nbsp;</p>
<p>function updateCache(q, p, s, t, data, size) {</p>
<p>if (o.maxCacheBytes &gt; 0) {</p>
<p>while (cache.length &amp;&amp; (cacheSize + size &gt; o.maxCacheBytes)) {</p>
<p>var cached = cache.pop();</p>
<p>cacheSize -= cached.size;</p>
<p>}</p>
<p>var key = q + delim + p; // use null character as delimiter</p>
<p>cacheData[key] = {</p>
<p>q: q,</p>
<p>p: p,</p>
<p>s: s,</p>
<p>t: t,</p>
<p>size: size,</p>
<p>data: data</p>
<p>}; // add the data to the cache at the hash key location</p>
<p>cache.push(key); // add the key to the MRU list</p>
<p>cacheSize += size;</p>
<p>}</p>
<p>}</p>
<p>&nbsp;</p>
<p>function displayItems(d, q) {</p>
<p>var totalSize = 0, itemCount = 0;</p>
<p>&nbsp;</p>
<p>if (!d)</p>
<p>return;</p>
<p>&nbsp;</p>
<p>$hdn.val($input.val());</p>
<p>if (parseInt(d[o.totalProperty]) === 0 &amp;&amp; o.noResultsText &amp;&amp; o.noResultsText.length &gt; 0) {</p>
<p>$content.addClass(o.noResultsClass).html(o.noResultsText);</p>
<p>$ctr.show();</p>
<p>return;</p>
<p>} else $content.removeClass(o.noResultsClass);</p>
<p>&nbsp;</p>
<p>for (var i = 0; i &lt; d[o.resultsProperty].length; i++) {</p>
<p>var data = d[o.resultsProperty][i],</p>
<p>result = o.resultTemplate.applyTemplate(data),</p>
<p>exactMatch = q === result,</p>
<p>selectedMatch = false,</p>
<p>hasHtmlTags = false,</p>
<p>match = data[o.displayValue];</p>
<p>&nbsp;</p>
<p>if (!exactMatch &amp;&amp; o.highlightMatches &amp;&amp; q !== &nbsp;&raquo;) {</p>
<p>var pattern = q,</p>
<p>highlightStart = match.toLowerCase().indexOf(q.toLowerCase()),</p>
<p>replaceString = &#8216;&lt;span&gt;&#8217; + match.substr(highlightStart, q.length) + &#8216;&lt;/span&gt;&#8217;;</p>
<p>if (result.match(&#8216;&lt;(.|\n)*?&gt;&#8217;)) { // see if the content contains html tags</p>
<p>hasHtmlTags = true;</p>
<p>pattern = &#8216;(&gt;)([^&lt;]*?)(&#8216; + q + &#8216;)((.|\n)*?)(&lt;)&#8217;; // TODO: look for a better way</p>
<p>replaceString = &#8216;$1$2&lt;span&gt;$3&lt;/span&gt;$4$6&#8242;;</p>
<p>}</p>
<p>result = result.replace(new RegExp(pattern, o.highlightMatchesRegExModifier), replaceString);</p>
<p>}</p>
<p>&nbsp;</p>
<p>// write the value of the first match to the input box, and select the remainder,</p>
<p>// but only if autoCompleteFirstMatch is set, and there are no html tags in the response</p>
<p>if (o.autoCompleteFirstMatch &amp;&amp; !hasHtmlTags &amp;&amp; i === 0) {</p>
<p>if (q.length &gt; 0 &amp;&amp; match.toLowerCase().indexOf(q.toLowerCase()) === 0) {</p>
<p>$input.attr(&#8216;pq&#8217;, q); // pq == previous query</p>
<p>$hdn.val(data[o.hiddenValue]);</p>
<p>$input.val(data[o.displayValue]);</p>
<p>selectedMatch = selectRange(q.length, $input.val().length);</p>
<p>}</p>
<p>}</p>
<p>&nbsp;</p>
<p>if (!o.showResults) return;</p>
<p>&nbsp;</p>
<p>$row = $(&#8216;&lt;div&gt;&lt;/div&gt;&#8217;)</p>
<p>.attr(&#8216;id&#8217;, data[o.hiddenValue])</p>
<p>.attr(&#8216;val&#8217;, data[o.displayValue])</p>
<p>.addClass(&#8216;row&#8217;)</p>
<p>.html(result)</p>
<p>.appendTo($content);</p>
<p>&nbsp;</p>
<p>if (exactMatch || (++itemCount == 1 &amp;&amp; o.selectFirstMatch) || selectedMatch) {</p>
<p>$row.addClass(o.selectClass);</p>
<p>}</p>
<p>totalSize += result.length;</p>
<p>}</p>
<p>&nbsp;</p>
<p>if (totalSize === 0) {</p>
<p>hideResults();</p>
<p>return;</p>
<p>}</p>
<p>&nbsp;</p>
<p>$ctr.parent().css(&#8216;z-index&#8217;, 11000);</p>
<p>$ctr.show();</p>
<p>&nbsp;</p>
<p>$content</p>
<p>.children(&#8216;div&#8217;)</p>
<p>.mouseover(function () {</p>
<p>$content.children(&#8216;div&#8217;).removeClass(o.selectClass);</p>
<p>$(this).addClass(o.selectClass);</p>
<p>})</p>
<p>.mouseup(function (e) {</p>
<p>e.preventDefault();</p>
<p>e.stopPropagation();</p>
<p>selectCurr();</p>
<p>});</p>
<p>&nbsp;</p>
<p>if (o.maxVisibleRows &gt; 0) {</p>
<p>var maxHeight = $row.outerHeight() * o.maxVisibleRows;</p>
<p>$content.css(&#8216;max-height&#8217;, maxHeight);</p>
<p>}</p>
<p>&nbsp;</p>
<p>return totalSize;</p>
<p>}</p>
<p>&nbsp;</p>
<p>function selectRange(s, l) {</p>
<p>var tb = $input[0];</p>
<p>if (tb.createTextRange) {</p>
<p>var r = tb.createTextRange();</p>
<p>r.moveStart(&#8216;character&#8217;, s);</p>
<p>r.moveEnd(&#8216;character&#8217;, l &#8211; tb.value.length);</p>
<p>r.select();</p>
<p>} else if (tb.setSelectionRange) {</p>
<p>tb.setSelectionRange(s, l);</p>
<p>}</p>
<p>tb.focus();</p>
<p>return true;</p>
<p>}</p>
<p>&nbsp;</p>
<p>String.prototype.applyTemplate = function (d) {</p>
<p>try {</p>
<p>if (d === &nbsp;&raquo;) return this;</p>
<p>return this.replace(/{([^{}]*)}/g,</p>
<p>function (a, b) {</p>
<p>var r;</p>
<p>if (b.indexOf(&#8216;.&#8217;) !== -1) { // handle dot notation in {}, such as {Thumbnail.Url}</p>
<p>var ary = b.split(&#8216;.&#8217;);</p>
<p>var obj = d;</p>
<p>for (var i = 0; i &lt; ary.length; i++)</p>
<p>obj = obj[ary[i]];</p>
<p>r = obj;</p>
<p>}</p>
<p>else</p>
<p>r = d[b];</p>
<p>if (typeof r === &#8216;string&#8217; || typeof r === &#8216;number&#8217;) return r; else throw (a);</p>
<p>}</p>
<p>);</p>
<p>} catch (ex) {</p>
<p>alert(&#8216;Invalid JSON property &#8216; + ex + &#8216; found when trying to apply resultTemplate or paging.summaryTemplate.\nPlease check your spelling and try again.&#8217;);</p>
<p>}</p>
<p>};</p>
<p>&nbsp;</p>
<p>function hideResults() {</p>
<p>$input.data(&#8216;active&#8217;, false); // for input blur</p>
<p>$div.css(&#8216;z-index&#8217;, 0);</p>
<p>$ctr.hide();</p>
<p>}</p>
<p>&nbsp;</p>
<p>function getCurr() {</p>
<p>if (!$ctr.is(&#8216;:visible&#8217;))</p>
<p>return false;</p>
<p>&nbsp;</p>
<p>var $curr = $content.children(&#8216;div.&#8217; + o.selectClass);</p>
<p>&nbsp;</p>
<p>if (!$curr.length)</p>
<p>$curr = false;</p>
<p>&nbsp;</p>
<p>return $curr;</p>
<p>}</p>
<p>&nbsp;</p>
<p>function selectCurr() {</p>
<p>$curr = getCurr();</p>
<p>&nbsp;</p>
<p>if ($curr) {</p>
<p>$hdn.val($curr.attr(&#8216;id&#8217;));</p>
<p>$input.val($curr.attr(&#8216;val&#8217;)).focus();</p>
<p>hideResults();</p>
<p>&nbsp;</p>
<p>if (o.onSelect) {</p>
<p>o.onSelect.apply($hdn[0]);</p>
<p>}</p>
<p>}</p>
<p>}</p>
<p>&nbsp;</p>
<p>function supportsGetBoxObjectFor() {</p>
<p>try {</p>
<p>document.getBoxObjectFor(document.body);</p>
<p>return true;</p>
<p>}</p>
<p>catch (e) {</p>
<p>return false;</p>
<p>}</p>
<p>}</p>
<p>&nbsp;</p>
<p>function supportsGetBoundingClientRect() {</p>
<p>try {</p>
<p>document.body.getBoundingClientRect();</p>
<p>return true;</p>
<p>}</p>
<p>catch (e) {</p>
<p>return false;</p>
<p>}</p>
<p>}</p>
<p>&nbsp;</p>
<p>function nextPage() {</p>
<p>$curr = getCurr();</p>
<p>&nbsp;</p>
<p>if ($curr &amp;&amp; $curr.next().length &gt; 0) {</p>
<p>$curr.removeClass(o.selectClass);</p>
<p>&nbsp;</p>
<p>for (var i = 0; i &lt; o.maxVisibleRows; i++) {</p>
<p>if ($curr.next().length &gt; 0) {</p>
<p>$curr = $curr.next();</p>
<p>}</p>
<p>}</p>
<p>&nbsp;</p>
<p>$curr.addClass(o.selectClass);</p>
<p>var scrollPos = $content.attr(&#8216;scrollTop&#8217;);</p>
<p>$content.attr(&#8216;scrollTop&#8217;, scrollPos + $content.height());</p>
<p>}</p>
<p>else if (!$curr)</p>
<p>$content.children(&#8216;div:first-child&#8217;).addClass(o.selectClass);</p>
<p>}</p>
<p>&nbsp;</p>
<p>function prevPage() {</p>
<p>$curr = getCurr();</p>
<p>&nbsp;</p>
<p>if ($curr &amp;&amp; $curr.prev().length &gt; 0) {</p>
<p>$curr.removeClass(o.selectClass);</p>
<p>&nbsp;</p>
<p>for (var i = 0; i &lt; o.maxVisibleRows; i++) {</p>
<p>if ($curr.prev().length &gt; 0) {</p>
<p>$curr = $curr.prev();</p>
<p>}</p>
<p>}</p>
<p>&nbsp;</p>
<p>$curr.addClass(o.selectClass);</p>
<p>var scrollPos = $content.attr(&#8216;scrollTop&#8217;);</p>
<p>$content.attr(&#8216;scrollTop&#8217;, scrollPos &#8211; $content.height());</p>
<p>}</p>
<p>else if (!$curr)</p>
<p>$content.children(&#8216;div:last-child&#8217;).addClass(o.selectClass);</p>
<p>}</p>
<p>&nbsp;</p>
<p>function nextResult() {</p>
<p>$curr = getCurr();</p>
<p>&nbsp;</p>
<p>if ($curr &amp;&amp; $curr.next().length &gt; 0) {</p>
<p>$curr.removeClass(o.selectClass).next().addClass(o.selectClass);</p>
<p>var scrollPos = $content.attr(&#8216;scrollTop&#8217;),</p>
<p>curr = $curr[0], parentBottom, bottom, height;</p>
<p>if (supportsGetBoxObjectFor()) {</p>
<p>parentBottom = document.getBoxObjectFor($content[0]).y + $content.attr(&#8216;offsetHeight&#8217;);</p>
<p>bottom = document.getBoxObjectFor(curr).y + $curr.attr(&#8216;offsetHeight&#8217;);</p>
<p>height = document.getBoxObjectFor(curr).height;</p>
<p>}</p>
<p>else if (supportsGetBoundingClientRect()) {</p>
<p>parentBottom = $content[0].getBoundingClientRect().bottom;</p>
<p>var rect = curr.getBoundingClientRect();</p>
<p>bottom = rect.bottom;</p>
<p>height = bottom &#8211; rect.top;</p>
<p>}</p>
<p>if (bottom &gt;= parentBottom)</p>
<p>$content.attr(&#8216;scrollTop&#8217;, scrollPos + height);</p>
<p>}</p>
<p>else if (!$curr)</p>
<p>$content.children(&#8216;div:first-child&#8217;).addClass(o.selectClass);</p>
<p>}</p>
<p>&nbsp;</p>
<p>function prevResult() {</p>
<p>$curr = getCurr();</p>
<p>&nbsp;</p>
<p>if ($curr &amp;&amp; $curr.prev().length &gt; 0) {</p>
<p>$curr.removeClass(o.selectClass).prev().addClass(o.selectClass);</p>
<p>var scrollPos = $content.attr(&#8216;scrollTop&#8217;),</p>
<p>curr = $curr[0],</p>
<p>parent = $curr.parent()[0],</p>
<p>parentTop, top, height;</p>
<p>if (supportsGetBoxObjectFor()) {</p>
<p>height = document.getBoxObjectFor(curr).height;</p>
<p>parentTop = document.getBoxObjectFor($content[0]).y &#8211; (height * 2); // TODO: this is not working when i add another control&#8230;</p>
<p>top = document.getBoxObjectFor(curr).y &#8211; document.getBoxObjectFor($content[0]).y;</p>
<p>}</p>
<p>else if (supportsGetBoundingClientRect()) {</p>
<p>parentTop = parent.getBoundingClientRect().top;</p>
<p>var rect = curr.getBoundingClientRect();</p>
<p>top = rect.top;</p>
<p>height = rect.bottom &#8211; top;</p>
<p>}</p>
<p>if (top &lt;= parentTop)</p>
<p>$content.attr(&#8216;scrollTop&#8217;, scrollPos &#8211; height);</p>
<p>}</p>
<p>else if (!$curr)</p>
<p>$content.children(&#8216;div:last-child&#8217;).addClass(o.selectClass);</p>
<p>}</p>
<p>};</p>
<p>&nbsp;</p>
<p>$.fn.flexbox = function (source, options) {</p>
<p>if (!source)</p>
<p>return;</p>
<p>&nbsp;</p>
<p>try {</p>
<p>var defaults = $.fn.flexbox.defaults;</p>
<p>var o = $.extend({}, defaults, options);</p>
<p>&nbsp;</p>
<p>for (var prop in o) {</p>
<p>if (defaults[prop] === undefined) throw (&#8216;Invalid option specified: &#8216; + prop + &#8216;\nPlease check your spelling and try again.&#8217;);</p>
<p>}</p>
<p>o.source = source;</p>
<p>&nbsp;</p>
<p>if (options) {</p>
<p>o.paging = (options.paging || options.paging == null) ? $.extend({}, defaults.paging, options.paging) : false;</p>
<p>&nbsp;</p>
<p>for (var prop in o.paging) {</p>
<p>if (defaults.paging[prop] === undefined) throw (&#8216;Invalid option specified: &#8216; + prop + &#8216;\nPlease check your spelling and try again.&#8217;);</p>
<p>}</p>
<p>&nbsp;</p>
<p>if (options.displayValue &amp;&amp; !options.hiddenValue) {</p>
<p>o.hiddenValue = options.displayValue;</p>
<p>}</p>
<p>}</p>
<p>&nbsp;</p>
<p>this.each(function () {</p>
<p>new $.flexbox(this, o);</p>
<p>});</p>
<p>&nbsp;</p>
<p>return this;</p>
<p>} catch (ex) {</p>
<p>if (typeof ex === &#8216;object&#8217;) alert(ex.message); else alert(ex);</p>
<p>}</p>
<p>};</p>
<p>&nbsp;</p>
<p>// plugin defaults &#8211; added as a property on our plugin function so they can be set independently</p>
<p>$.fn.flexbox.defaults = {</p>
<p>source : [],</p>
<p>method: &#8216;GET&#8217;, // One of &#8216;GET&#8217; or &#8216;POST&#8217;</p>
<p>queryDelay: 100, // num of milliseconds before query is run.</p>
<p>allowInput: true, // set to false to disallow the user from typing in queries</p>
<p>selectBehavior: true, // set to false to disallow the select behavior</p>
<p>containerClass: &#8216;ffb&#8217;,</p>
<p>contentClass: &#8216;content&#8217;,</p>
<p>selectClass: &#8216;ffb-sel&#8217;,</p>
<p>inputClass: &#8216;ffb-input&#8217;,</p>
<p>arrowClass: &#8216;ffb-arrow&#8217;,</p>
<p>matchClass: &#8216;ffb-match&#8217;,</p>
<p>noResultsText: &#8216;No matching results&#8217;, // text to show when no results match the query</p>
<p>noResultsClass: &#8216;ffb-no-results&#8217;, // class to apply to noResultsText</p>
<p>showResults: true, // whether to show results at all, or just typeahead</p>
<p>selectFirstMatch: true, // whether to highlight the first matching value</p>
<p>autoCompleteFirstMatch: false, // whether to complete the first matching value in the input box</p>
<p>highlightMatches: true, // whether all matches within the string should be highlighted with matchClass</p>
<p>highlightMatchesRegExModifier: &#8216;i&#8217;, // &#8216;i&#8217; for case-insensitive, &#8216;g&#8217; for global (all occurrences), or combine</p>
<p>matchAny: true, // for client-side filtering ONLY, match any occurrence of the search term in the result (e.g. &laquo;&nbsp;ar&nbsp;&raquo; would find &laquo;&nbsp;area&nbsp;&raquo; and &laquo;&nbsp;cart&nbsp;&raquo;)</p>
<p>minChars: 1, // the minimum number of characters the user must enter before a search is executed</p>
<p>showArrow: true, // set to false to simulate google suggest</p>
<p>arrowQuery: &nbsp;&raquo;, // the query to run when the arrow is clicked</p>
<p>onSelect: false, // function to run when a result is selected</p>
<p>maxCacheBytes: 32768, // in bytes, 0 means caching is disabled</p>
<p>resultTemplate: &#8216;{name}&#8217;, // html template for each row (put json properties in curly braces)</p>
<p>displayValue: &#8216;name&#8217;, // json element whose value is displayed on select</p>
<p>hiddenValue: &#8216;id&#8217;, // json element whose value is submitted when form is submitted</p>
<p>initialValue: &nbsp;&raquo;, // what should the value of the input field be when the form is loaded?</p>
<p>watermark: &nbsp;&raquo;, // text that appears when flexbox is loaded, if no initialValue is specified.  style with css class &#8216;.ffb-input.watermark&#8217;</p>
<p>width: 200, // total width of flexbox.  auto-adjusts based on showArrow value</p>
<p>resultsProperty: &#8216;results&#8217;, // json property in response that references array of results</p>
<p>totalProperty: &#8216;total&#8217;, // json property in response that references the total results (for paging)</p>
<p>maxVisibleRows: 0, // default is 0, which means it is ignored.  use either this, or paging.pageSize</p>
<p>paging: {</p>
<p>style: &#8216;input&#8217;, // or &#8216;links&#8217;</p>
<p>cssClass: &#8216;paging&#8217;, // prefix with containerClass (e.g. .ffb .paging)</p>
<p>pageSize: 10, // acts as a threshold.  if &lt;= pageSize results, paging doesn&#8217;t appear</p>
<p>maxPageLinks: 5, // used only if style is &#8216;links&#8217;</p>
<p>showSummary: true, // whether to show &#8216;displaying 1-10 of 200 results&#8217; text</p>
<p>summaryClass: &#8216;summary&#8217;, // class for &#8216;displaying 1-10 of 200 results&#8217;, prefix with containerClass</p>
<p>summaryTemplate: &#8216;Displaying {start}-{end} of {total} results&#8217; // can use {page} and {pages} as well</p>
<p>}</p>
<p>};</p>
<p>&nbsp;</p>
<p>$.fn.setValue = function (val) {</p>
<p>var id = &#8216;#&#8217; + this.attr(&#8216;id&#8217;);</p>
<p>var input = $(id + &#8216;_input&#8217;);</p>
<p>input.val(val).removeClass(&#8216;watermark&#8217;);</p>
<p>};</p>
<p>&nbsp;</p>
<p>$.fn.setIdValue = function (val) {</p>
<p>var id = &#8216;#&#8217; + this.attr(&#8216;id&#8217;);</p>
<p>$(id + &laquo;&nbsp;_hidden&nbsp;&raquo;).val(val);</p>
<p>};</p>
<p>})(jQuery);</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/yoannr.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/yoannr.wordpress.com/188/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/yoannr.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/yoannr.wordpress.com/188/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/yoannr.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/yoannr.wordpress.com/188/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/yoannr.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/yoannr.wordpress.com/188/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/yoannr.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/yoannr.wordpress.com/188/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/yoannr.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/yoannr.wordpress.com/188/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/yoannr.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/yoannr.wordpress.com/188/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yoannr.wordpress.com&amp;blog=6541953&amp;post=188&amp;subd=yoannr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://yoannr.wordpress.com/2011/09/26/flexbox-according-to-my-needs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b70a8002f84b4100aba364db4b440efc?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Arthis</media:title>
		</media:content>
	</item>
		<item>
		<title>Gestion des Exceptions, Unit Testing, MsTests</title>
		<link>http://yoannr.wordpress.com/2011/06/17/gestion-des-exceptions-unit-testing-mstests/</link>
		<comments>http://yoannr.wordpress.com/2011/06/17/gestion-des-exceptions-unit-testing-mstests/#comments</comments>
		<pubDate>Fri, 17 Jun 2011 13:26:27 +0000</pubDate>
		<dc:creator>yoannr</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">https://yoannr.wordpress.com/2011/06/17/gestion-des-exceptions-unit-testing-mstests/</guid>
		<description><![CDATA[J‘aimerai avoir une fonction de ce type la pour tester mon code : static void Throws&#60;T&#62;(Action action, string expectedMessage) where T : Exception Malheureusement celle ci n’existe pas dans la collection Assert. J ai donc vu de part le net qu’il me fallait créer ma propre classe MyAssert avec cette méthode. Et tant qu’à faire [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yoannr.wordpress.com&amp;blog=6541953&amp;post=187&amp;subd=yoannr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>J‘aimerai avoir une fonction de ce type la pour tester mon code :</p>
<p>static void Throws&lt;T&gt;(Action action, string expectedMessage) where T : Exception</p>
<p>Malheureusement celle ci n’existe pas dans la collection Assert. J ai donc vu de part le net qu’il me fallait créer ma propre classe MyAssert avec cette méthode. Et tant qu’à faire je me suis dit que j’allais le faire en TDD.</p>
<p>Throws&lt;T&gt; va contenir des accès direct&#160; à Assert, et par conséquent sera difficilement testable (encore que maintenant que j’ècris ce lignes je trouve que je me suis compliquée la vie, mais bon… <img style="border-style:none;" class="wlEmoticon wlEmoticon-smile" alt="Sourire" src="http://yoannr.files.wordpress.com/2011/06/wlemoticon-smile.png?w=500" /> )</p>
<p>Je me susi donc créer cette classe :</p>
<p>public class AssertAnswer   <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; public bool Success { get; set; }    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; public string Message { get; set; }    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p>
<p>et un fonction qui contiendrait le corps de ma logique :</p>
<p>public static AssertAnswer AssertAction&lt;T&gt;(Action action, string expectedMessage) where T : Exception   <br />{    <br />}</p>
<p>C’est cette fonction que je compte tester. J’écris donc mes tests :</p>
<p>private void ThrowNullReferenceException(string msg)   <br />&#160;&#160;&#160;&#160;&#160; {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; throw new NullReferenceException(msg);    <br />&#160;&#160;&#160;&#160;&#160; }    <br />private void DoNotThrowException(string msg)    <br />&#160;&#160;&#160;&#160;&#160; {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //do nothing    <br />&#160;&#160;&#160;&#160;&#160; }    </p>
<p>[TestMethod]   <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public void MyAssert_AssertAction_Exception_Awaited()    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; string msg = &quot;test&quot;;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var actual = MyAssert.AssertAction&lt;System.NullReferenceException&gt;(() =&gt; ThrowNullReferenceException(msg), msg);</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Assert.AreEqual(true, actual.Success);   <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Assert.AreEqual(msg, actual.Message);    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p>
<p>[TestMethod]   <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public void MyAssert_AssertAction_Different_Exception()    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; string msg = &quot;test&quot;;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var actual = MyAssert.AssertAction&lt;System.ArgumentException&gt;(() =&gt; ThrowNullReferenceException(msg), msg);</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Assert.AreEqual(false, actual.Success);   <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Assert.AreEqual(&quot;A different Exception was thrown System.NullReferenceException.&quot;, actual.Message);    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p>
<p>[TestMethod]   <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public void MyAssert_AssertAction_No_Exception()    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; string msg = &quot;test&quot;;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var actual = MyAssert.AssertAction&lt;System.ArgumentException&gt;(() =&gt; DoNotThrowException(msg), msg);</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Assert.AreEqual(false, actual.Success);   <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Assert.AreEqual(&quot;Exception of type System.ArgumentException should be thrown.&quot;, actual.Message);    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p>
<p>Ces trois tests couvrent l’ensemble des cas de figure qui peuvent se passer.</p>
<p>Il ne reste plus qu’à écrire le code&#160; de la fonction :</p>
<p>public static AssertAnswer AssertAction&lt;T&gt;(Action action, string expectedMessage) where T : Exception   <br />&#160;&#160;&#160;&#160;&#160;&#160; {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; AssertAnswer answer = new AssertAnswer();</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; try   <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; action.Invoke();</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; answer.Success = false;   <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; answer.Message = string.Format(&quot;Exception of type {0} should be thrown.&quot;, typeof(T));    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; catch (T exc)    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; answer.Success = true;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; answer.Message = expectedMessage;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; catch (Exception e)    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; answer.Success = false;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; answer.Message = string.Format(&quot;A different Exception was thrown {0}.&quot;, e.GetType());    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return answer;   <br />&#160;&#160;&#160;&#160;&#160;&#160; }</p>
<p>Mes tests passent je peux continuer , et revenir a mon besoin initial , en réécrivant d’autres tests pour vraiment tester la fonction que je compte appeler plus tard :</p>
<p>[TestMethod]   <br />&#160;&#160;&#160;&#160;&#160;&#160; public void MyAssert_Throws_Exception_Awaited()    <br />&#160;&#160;&#160;&#160;&#160;&#160; {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; string msg = &quot;test&quot;;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; MyAssert.Throws&lt;System.NullReferenceException&gt;(() =&gt; ThrowNullReferenceException(msg), msg);    <br />&#160;&#160;&#160;&#160;&#160;&#160; }</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160; [TestMethod]   <br />&#160;&#160;&#160;&#160;&#160;&#160; public void MyAssert_Throws_Different_Exception()    <br />&#160;&#160;&#160;&#160;&#160;&#160; {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; try    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; string msg = &quot;test&quot;;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; MyAssert.Throws&lt;System.ArgumentException&gt;(() =&gt; ThrowNullReferenceException(msg), msg);</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Assert.Fail();   <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; catch (Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException e)    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }   <br />&#160;&#160;&#160;&#160;&#160;&#160; }</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160; [TestMethod]   <br />&#160;&#160;&#160;&#160;&#160;&#160; public void MyAssert_Throws_No_Exception()    <br />&#160;&#160;&#160;&#160;&#160;&#160; {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; try    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; string msg = &quot;test&quot;;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; MyAssert.Throws&lt;System.ArgumentException&gt;(() =&gt; DoNotThrowException(msg), msg);</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Assert.Fail();   <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; catch (Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException e)    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }   <br />&#160;&#160;&#160;&#160;&#160;&#160; }    </p>
<p>&#160;</p>
<p>et ensuite le code le fonction pour réussir ces tests :</p>
<p>public static void Throws&lt;T&gt;(Action action, string expectedMessage) where T : Exception   <br />&#160;&#160;&#160;&#160;&#160;&#160; {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; AssertAnswer answer = AssertAction&lt;T&gt;(action, expectedMessage);</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Assert.IsTrue(answer.Success);   <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Assert.AreEqual(expectedMessage, answer.Message);    <br />&#160;&#160;&#160;&#160;&#160;&#160; }    </p>
<p>&#160;</p>
<p>et voila, ma fonction est prête à être utilisé dans d’autres tests. Maintenant , il est vrai que j’aurais pu m’épargner la création de la fonction AssertAction et tester directement le code de ma fonction, mais que voulez vous, il faut bien débuter un jour et faire quelques erreurs.. d’ailleurs si vous en voyez d’autres n’hésitez pas..</p>
<p>++   </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/yoannr.wordpress.com/187/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/yoannr.wordpress.com/187/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/yoannr.wordpress.com/187/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/yoannr.wordpress.com/187/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/yoannr.wordpress.com/187/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/yoannr.wordpress.com/187/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/yoannr.wordpress.com/187/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/yoannr.wordpress.com/187/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/yoannr.wordpress.com/187/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/yoannr.wordpress.com/187/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/yoannr.wordpress.com/187/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/yoannr.wordpress.com/187/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/yoannr.wordpress.com/187/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/yoannr.wordpress.com/187/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yoannr.wordpress.com&amp;blog=6541953&amp;post=187&amp;subd=yoannr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://yoannr.wordpress.com/2011/06/17/gestion-des-exceptions-unit-testing-mstests/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b70a8002f84b4100aba364db4b440efc?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Arthis</media:title>
		</media:content>

		<media:content url="http://yoannr.files.wordpress.com/2011/06/wlemoticon-smile.png" medium="image">
			<media:title type="html">Sourire</media:title>
		</media:content>
	</item>
		<item>
		<title>Jstree , Json et IEnumerable &amp; Extension Method&#8230;</title>
		<link>http://yoannr.wordpress.com/2010/03/30/jstree-json-et-ienumerable-extension-method/</link>
		<comments>http://yoannr.wordpress.com/2010/03/30/jstree-json-et-ienumerable-extension-method/#comments</comments>
		<pubDate>Tue, 30 Mar 2010 12:12:45 +0000</pubDate>
		<dc:creator>yoannr</dc:creator>
				<category><![CDATA[Extension Method]]></category>
		<category><![CDATA[MVC]]></category>

		<guid isPermaLink="false">http://yoannr.wordpress.com/2010/03/30/jstree-json-et-ienumerable-extension-method/</guid>
		<description><![CDATA[Bonjour, Je suis toujours à ma découverte de JQuery, et dernièrement je me suis frotté á la problématique du treeview avec Jquery. Il n’y a pas encore de tree officiel dans Jquery et j’ai opté pour un des arbres qui est présent sur la road map de JQuery, j’ai nommé jstree (http://www.jstree.com/). Ce tree permet [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yoannr.wordpress.com&amp;blog=6541953&amp;post=171&amp;subd=yoannr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Bonjour,</p>
<p><span style="font-size:x-small;">Je suis toujours à ma découverte de JQuery, et dernièrement je me suis frotté á la problématique du treeview avec Jquery. Il n’y a pas encore de tree officiel dans Jquery et j’ai opté pour un des arbres qui est présent sur la road map de JQuery, j’ai nommé jstree (<a href="http://www.jstree.com/">http://www.jstree.com/</a>).</span></p>
<p>Ce tree permet de faire tout ce dont j’ai envie, créer des nodes insérer, effectuer des postback, travailler sur du HTML, du Json. Bref il me semble vraiment complet et assez convivial dans son ergonomie.</p>
<p><span style="font-size:x-small;">La documentation est assez bien faite et elle m’a amené a vouloir développer mon arbre en prenant comme source du Json et en mode asynchrone. Pour ce faire rien de plus simple il y a un exemple dans la doc  que j’ai remanié pour avoir cela:</span></p>
<p><span style="font-size:x-small;"> </span></p>
<p>&lt;script type=&nbsp;&raquo;text/javascript&nbsp;&raquo; class=&nbsp;&raquo;source&nbsp;&raquo;&gt;<br />
$(function()<br />
{<br />
$(&laquo;&nbsp;#MyTree&nbsp;&raquo;).tree(<br />
{<br />
data:<br />
{<br />
type: &laquo;&nbsp;json&nbsp;&raquo;,<br />
async: true,<br />
opts:<br />
{<br />
url: &laquo;&nbsp;/localisation/GetTree&nbsp;&raquo;<br />
}<br />
}<br />
});<br />
});<br />
&lt;/script&gt;<br />
&lt;div id=&nbsp;&raquo;MyTree&nbsp;&raquo;&gt;<br />
&lt;/div&gt;</p>
<p>l’arbre “myTree”  prend en donnée du Json, de maniére asynchrone et sa source de donnée sera un appel À l’URL &laquo;&nbsp;/localisation/GetTree”. Localisation est evidemment le nom de mon controlleur et GetTree le nom de l’action associée:</p>
<p>public string GetTree(int? id)<br />
{</p>
<p>Localisation localisation = CreateLocalisation();</p>
<p>//fetch all groups<br />
localisation.Groups = servicelocalisation.GetLocalisationGroups();</p>
<p>string returnvalue = string.Empty;<br />
returnvalue = localisation.Groups.ToJsTreeJson(g=&gt;g.ID.Value, g=&gt;g.Name, g=&gt; g.ChildGroups);</p>
<p>return returnvalue;<br />
}</p>
<p>Le service localisation va récupérer nos donnée et nous rendre une List&lt;LocalisationGroup&gt;  stockée dans localisation.Groups .</p>
<p>J’ai ensuite développé une extension méthode afin de transformer mon IEnumerable&lt;T&gt; en Json afin que mon jsTree puisse interpréter correctement ma liste de groupe.</p>
<p>Si on détaille cette extension méthode, on voit trois choses entrée en argument :</p>
<ul>
<li>g=&gt;g.ID.Value</li>
<li>g=&gt;g.Name</li>
<li>g=&gt; g.ChildGroups</li>
</ul>
<p>Ces trois expression lambdas vont nous aider a retrouver nos informations dans un LocalisationGroup. Elles vont servir respectivement a retrouver l’identifiant de notre groupe, le nom de notre groupe, et les groupes enfant de notre groupe.</p>
<p>Passons de l’autre coté du miroir et regardons de plus prés cette extension method:</p>
<p>public static string ToJsTreeJson&lt;TElement&gt;(<br />
this IEnumerable&lt;TElement&gt; elements,<br />
Func&lt;TElement, int&gt; GetIDElement,<br />
Func&lt;TElement, string&gt; GetDataElement,<br />
Func&lt;TElement, IEnumerable&lt;TElement&gt;&gt; GetChildrenElements)<br />
{<br />
string returnvalue = string.Empty;</p>
<p>JsTree tree = new JsTree();<br />
foreach (TElement element in elements)<br />
{<br />
tree.RootNodes.Add(CreateJstreeNode(element,GetIDElement, GetDataElement,GetChildrenElements));<br />
}</p>
<p>returnvalue = tree.Serialize();</p>
<p>return returnvalue;<br />
}</p>
<p>Les choses se compliquent? pas tant que ca…  C’est une extension méthode donc la liste de groupe que j’avais au départ est en fait passé en argument et nous allons la retrouver sous le nom éléments. Et que vois t’on? Que pour chaque élément de cette liste je vais ajouter un treenode à notre tree. Normal c’est ce que l’on veut faire. Et pour ce faire on utilise la méthode CreateJstreeNode.</p>
<p>Cette méthode prend en argument presque la même chose que notre extension methode:</p>
<p>private static  JsTreeNode CreateJstreeNode&lt;TElement&gt;(<br />
TElement element ,<br />
Func&lt;TElement, int&gt; GetIDElement,<br />
Func&lt;TElement, string&gt; GetDataElement,<br />
Func&lt;TElement, IEnumerable&lt;TElement&gt;&gt; GetChildrenElements)<br />
{<br />
JsTreeNode node = new JsTreeNode();</p>
<p>node.data = GetDataElement(element);<br />
node.attributes = new jsAttribute();<br />
node.attributes.id =  GetIDElement(element).ToString();<br />
foreach (TElement e in GetChildrenElements(element))<br />
{<br />
node.children.Add(CreateJstreeNode(e,GetIDElement, GetDataElement, GetChildrenElements));<br />
}</p>
<p>return node;<br />
}</p>
<p>Sauf que au lieu de s’attacher à voir ce qui se passe dans une liste d’éléments, cette dernière ne s’intéresse qu’au noeud qu’on lui donne en argument. Et grâce aux fonctions données précédemment (g=&gt;g.ID.Value, g=&gt;g.Name, g=&gt; g.ChildGroups), elle va être capable de comprendre comment décortiquer notre objet afin d’instancier un JsTreeNode .<br />
Pour finir, cette méthode s’appelle récursivement afin de détailler tous les éléments enfants qui pourraient appartenir à un élément.</p>
<p>Pour chaque élément de notre liste cette méthode va être appelée et ensuite notre objet JsTree sera rempli. Il ne suffria plus alors qu’à lui demander de se sérialiser afin de produire le json correspondant.</p>
<p>Afin d’être exhaustif voici le modèle utilisé pour représenter mon jstree :</p>
<p>public class JsTree<br />
{<br />
delegate string GetData();<br />
public IList&lt;JsTreeNode&gt; RootNodes { get; set; }</p>
<p>public JsTree()<br />
{<br />
RootNodes = new List&lt;JsTreeNode&gt;();<br />
}</p>
<p>public string Serialize()<br />
{<br />
string returnvalue = &laquo;&nbsp;[";<br />
foreach (JsTreeNode node in RootNodes)<br />
{<br />
returnvalue += JSONSerializer.Serialize&lt;JsTreeNode&gt;(node)+",";<br />
}<br />
if (returnvalue.Length &gt; 1)<br />
{<br />
returnvalue = returnvalue.Substring(0, returnvalue.Length - 1);<br />
}<br />
returnvalue += "]&laquo;&nbsp;;</p>
<p>return returnvalue;<br />
}<br />
}</p>
<p>public class jsAttribute<br />
{<br />
public string id { get; set; }<br />
}</p>
<p>public class JsTreeNode<br />
{<br />
private List&lt;JsTreeNode&gt; _children;</p>
<p>public string data { get; set; }<br />
public jsAttribute attributes { get; set; }<br />
public List&lt;JsTreeNode&gt; children<br />
{<br />
get<br />
{<br />
if (_children == null)<br />
_children = new List&lt;JsTreeNode&gt;();<br />
return _children;<br />
}<br />
set<br />
{<br />
_children = value;<br />
}<br />
}<br />
}</p>
<p>et voilà pour le Json Serializer :</p>
<p>public class JSONSerializer<br />
{<br />
public string unescapedUrl { get; set; }</p>
<p>public static T Deserialise&lt;T&gt;(string json)<br />
{<br />
T obj = Activator.CreateInstance&lt;T&gt;();<br />
using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))<br />
{<br />
DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());<br />
obj = (T)serializer.ReadObject(ms);<br />
return obj;<br />
}<br />
}</p>
<p>public static string Serialize&lt;T&gt;(T obj)<br />
{<br />
DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());<br />
using (MemoryStream ms = new MemoryStream())<br />
{<br />
serializer.WriteObject(ms, obj);<br />
return Encoding.Default.GetString(ms.ToArray());<br />
}<br />
}<br />
}</p>
<p>Comme toujours, si vous avez des questions ou des commentaires sur ma manière de procéder , ne vous gêner pas, ce blog est un peu fait pour ca!</p>
<p>a++</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/yoannr.wordpress.com/171/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/yoannr.wordpress.com/171/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/yoannr.wordpress.com/171/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/yoannr.wordpress.com/171/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/yoannr.wordpress.com/171/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/yoannr.wordpress.com/171/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/yoannr.wordpress.com/171/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/yoannr.wordpress.com/171/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/yoannr.wordpress.com/171/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/yoannr.wordpress.com/171/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/yoannr.wordpress.com/171/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/yoannr.wordpress.com/171/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/yoannr.wordpress.com/171/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/yoannr.wordpress.com/171/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yoannr.wordpress.com&amp;blog=6541953&amp;post=171&amp;subd=yoannr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://yoannr.wordpress.com/2010/03/30/jstree-json-et-ienumerable-extension-method/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b70a8002f84b4100aba364db4b440efc?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Arthis</media:title>
		</media:content>
	</item>
		<item>
		<title>Des container pour les objets transversaux dans une applications ASP.net (suite)</title>
		<link>http://yoannr.wordpress.com/2010/02/25/des-container-pour-les-objets-transversaux-dans-une-applications-asp-net-suite/</link>
		<comments>http://yoannr.wordpress.com/2010/02/25/des-container-pour-les-objets-transversaux-dans-une-applications-asp-net-suite/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 11:20:17 +0000</pubDate>
		<dc:creator>yoannr</dc:creator>
				<category><![CDATA[Architecture]]></category>

		<guid isPermaLink="false">http://yoannr.wordpress.com/2010/02/25/des-container-pour-les-objets-transversaux-dans-une-applications-asp-net-suite/</guid>
		<description><![CDATA[Cet petit article fait suite à celui ci où j’expliquais ma façon de gérer le stockage des données dans mon application. Les exemples choisis étaient volontairement simple afin de mieux me concentrer sur l’architecture que je proposais. Aujourd’hui, je vais continuer en proposant un nouveau type de container pour faire persister les objets. Je travaille [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yoannr.wordpress.com&amp;blog=6541953&amp;post=170&amp;subd=yoannr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Cet petit article fait suite à <a href="http://yoannr.wordpress.com/2009/08/19/des-container-pour-les-objets-transversaux-dans-une-applications-asp-net/" target="_blank">celui ci</a> où j’expliquais ma façon de gérer le stockage des données dans mon application. Les exemples choisis étaient volontairement simple afin de mieux me concentrer sur l’architecture que je proposais. Aujourd’hui, je vais continuer en proposant un nouveau type de container pour faire persister les objets.</p>
<p>Je travaille actuellement sur un site web hébergé en Web Farm. Il doit y avoir un dizaine de serveur je pense dans ma ferme, et je me heurte par conséquent À un problème, celui des variables d’application.</p>
<p>En effet si je modifie dynamiquement ma variable d’application via un interface web, je ne l’aurais fait en fait que sur un seul serveur pas sur les 9 autres, qui continueront avec leurs propres collection de variable d’application. Pour mettre à jour, le s9 autres , il va falloir que que je rappelle ma site plusieurs fois afin d’avoir la chance de tomber sur tous mes serveurs de ma ferme et ainsi mettre a jour ma valeur. Bref pas très pratique tout ca..</p>
<p>Pour cela j’ai imaginé un nouveau type de container. Rien de bien sorcier en fait, il s’agit juste d’un cache avec une durée d’expiration et qui prend en entrée une fonction. Cette fonction lui indique comme aller chercher les données à mettre à jour.</p>
<p>Ainsi, si je mets a jour une variable d’application, je met a jour en même temps ma base de données, et au bout de x minutes, chaque container ira de lui même , grâce à la fonction, rechercher la valeur qui va bien pour chaque serveur de ma web farm.</p>
<p>Un peu de code pour illustrer mon propos. Voici une classe MonApplication qui contient les données générales propres au contexte de mon appli.</p>
<blockquote><p><em>public class MonApplication<br />
{<br />
public DateTime? AppOfflineStartDate { get; set; }<br />
public DateTime? AppOfflineEndDate{ get; set; }<br />
public bool IsAppOffline{ get; set; }<br />
public Robots Robot{ get; set; } </em></p>
<p><em> </em><em> public bool GetApplicationOnline()<br />
{<br />
bool returnvalue = this.IsAppOffline; </em></p>
<p><em> //the dates indicated have priority on the status to put the application  offline<br />
if (this.AppOfflineStartDate.HasValue &amp;&amp; this.AppOfflineEndDate.HasValue)<br />
{<br />
if (DateTime.Now &gt; this.AppOfflineStartDate.Value &amp;&amp; DateTime.Now &lt; this.AppOfflineEndDate)<br />
returnvalue = true;<br />
}<br />
else<br />
{<br />
// either AppOfflineStartDate or AppOfflineEndDate is null, may be both of them </em></p>
<p><em> if (this.AppOfflineStartDate.HasValue)<br />
{<br />
if (DateTime.Now &gt; this.AppOfflineStartDate.Value)<br />
returnvalue = true;<br />
} </em></p>
<p><em> if (this.AppOfflineEndDate.HasValue)<br />
{<br />
if (DateTime.Now &lt; this.AppOfflineEndDate)<br />
returnvalue = true;<br />
} </em></p>
<p><em> if (!this.AppOfflineStartDate.HasValue &amp;&amp; !this.AppOfflineEndDate.HasValue)<br />
{<br />
//do nothing the basic IsAppOnline should prevail<br />
}<br />
} </em></p>
<p><em> return returnvalue;<br />
} </em></p>
<p><em> }</em></p></blockquote>
<p>Rien de Bien compliqué ici. Il s’agit juste de savoir si mon application doit être on line ou non. Et pour cela, on va chercher les informations dans un base de données grâce à ce service.</p>
<blockquote><p><em>public class KjuApplicationService<br />
{<br />
public KjuApplication GetKjuApplication()<br />
{ </em></p>
<p><em> KjuApplication kjuappli = new KjuApplication();<br />
</em></p>
<p><em> //Bloc de code pour aller chercher les données dans la base de données ici</em></p>
<p><em> Robots Bob = new Robots();<br />
Bob.Indexed = true;<br />
Bob.LinkTofollows = true; </em></p>
<p><em> kjuappli.Robot = Bob; </em></p>
<p><em> return kjuappli;<br />
}<br />
}</em></p></blockquote>
<p>L’appel À notre container va se faire de la sorte :</p>
<blockquote><p><em>public static MonApplication monAppli {<br />
get {<br />
StoringContainerProvider container = StoringContainerFactory.GetInstance(StoringContainerFactory.E_StoringContainerType.DynamiqCache);<br />
KjuApplicationService kas =new KjuApplicationService();<br />
return (KjuApplication)((StoringContainerDynamiqCache)container).LoadObject(&laquo;&nbsp;KjuAppli&nbsp;&raquo;, kas.GetKjuApplication, 5);<br />
}<br />
set {<br />
StoringContainerProvider container = StoringContainerFactory.GetInstance(StoringContainerFactory.E_StoringContainerType.DynamiqCache);<br />
container.SaveObject(value,&nbsp;&raquo;KjuAppli&nbsp;&raquo;);<br />
}<br />
}</em></p></blockquote>
<p>Ce qui change ici est exclusivement la partie get, car avec mon nouveau container “DynamiqCache”, je vais lui donner la fonction du service que j’ai détaillée avant.</p>
<blockquote><p><em>public object LoadObject(string ContainerKey, Func&lt;Object&gt; FetchObject, double minutes)<br />
{<br />
//have a look if the cached object is not present<br />
if (HttpContext.Current.Cache.Get(ContainerKey) == null)<br />
{<br />
Object ObjToBeSaved = FetchObject();<br />
this.SaveObject(ObjToBeSaved, ContainerKey, minutes);<br />
}<br />
return HttpContext.Current.Cache[ContainerKey];<br />
}</em></p></blockquote>
<p>Et voilà le travail, j’ai maintenant un container générique qui va pouvoir mettre À jour ses données si on lui dit comment faire.</p>
<p>N’hésitez pas à me laisser des commentaires si vous voyez des erreurs ou si si vous trouvez qu’il y a des choses À améliorer.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/yoannr.wordpress.com/170/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/yoannr.wordpress.com/170/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/yoannr.wordpress.com/170/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/yoannr.wordpress.com/170/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/yoannr.wordpress.com/170/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/yoannr.wordpress.com/170/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/yoannr.wordpress.com/170/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/yoannr.wordpress.com/170/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/yoannr.wordpress.com/170/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/yoannr.wordpress.com/170/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/yoannr.wordpress.com/170/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/yoannr.wordpress.com/170/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/yoannr.wordpress.com/170/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/yoannr.wordpress.com/170/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yoannr.wordpress.com&amp;blog=6541953&amp;post=170&amp;subd=yoannr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://yoannr.wordpress.com/2010/02/25/des-container-pour-les-objets-transversaux-dans-une-applications-asp-net-suite/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b70a8002f84b4100aba364db4b440efc?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Arthis</media:title>
		</media:content>
	</item>
		<item>
		<title>Voyage vers MVC2 et EF2 : &#233;tape 4, pour affronter le scorbut, servir des proc&#233;dures stock&#233;es fraiches&#8230;</title>
		<link>http://yoannr.wordpress.com/2010/01/26/voyage-vers-mvc2-et-ef2-tape-4-pour-affronter-le-scorbut-servir-des-procdures-stockes-fraiches/</link>
		<comments>http://yoannr.wordpress.com/2010/01/26/voyage-vers-mvc2-et-ef2-tape-4-pour-affronter-le-scorbut-servir-des-procdures-stockes-fraiches/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 10:57:17 +0000</pubDate>
		<dc:creator>yoannr</dc:creator>
				<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[MVC]]></category>

		<guid isPermaLink="false">http://yoannr.wordpress.com/2010/01/26/voyage-vers-mvc2-et-ef2-tape-4-pour-affronter-le-scorbut-servir-des-procdures-stockes-fraiches/</guid>
		<description><![CDATA[Bon je continue mon petit bonhomme de chemin. Aujourd’hui je vais tacher de rendre ma liste de groupe un peu plus sexy en lui rajoutant des informations intéressantes. le nom du groupe dans lequel je me trouve le chemin du groupe dans lequel je me trouve pour le point 1 pas de gros souci, mais [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yoannr.wordpress.com&amp;blog=6541953&amp;post=167&amp;subd=yoannr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Bon je continue mon petit bonhomme de chemin. Aujourd’hui je vais tacher de rendre ma liste de groupe un peu plus sexy en lui rajoutant des informations intéressantes.</p>
<ol>
<li>le nom du groupe dans lequel je me trouve</li>
<li>le chemin du groupe dans lequel je me trouve</li>
</ol>
<p>pour le point 1 pas de gros souci, mais cela va me permettre de détailler un peu le fonctionnement d’accès aux données que j’ai changer depuis mon dernier <a href="http://yoannr.wordpress.com/2009/11/19/voyage-vers-mvc-2-et-entity-framework-2-tape-2-on-quitte-le-port-doucement/" target="_blank">billet</a>. Maintenant mon contrôleur n’accède plus directement au repository mais plutôt à une couche de service. cela me permet d’écrire le code suivant dans mon contrôleur.</p>
<p><em>// GET: /Localisation/ListGroup/id<br />
public ActionResult ListGroup(int? ParentGroupId)<br />
{<br />
Localisation localisation = CreateLocalisation();<br />
localisation.Groups = servicelocalisation.GetLocalisationGroups(ParentGroupId);<br />
if (ParentGroupId.HasValue)<br />
{<br />
localisation.CurrentGroup = servicelocalisation.GetLocalisationGroup(ParentGroupId.Value);<br />
localisation.GroupParents = servicelocalisation.GetLocalisationGroupParents(ParentGroupId.Value);<br />
}<br />
return View(&laquo;&nbsp;ListGroup&nbsp;&raquo;, localisation);<br />
}</em></p>
<p>localisation.CurrentGroup va contenir le groupe parent de ma liste, celui dont j’explore les groupes enfants. Et pour le récupérer je vais faire un appel à la fonction GetLocalisationGroup du service servicelocalisation. Cette fonction renvoie un localisation group et interroge le repository :</p>
<p><em>public LocalisationGroup GetLocalisationGroup(int LocalisationGroupId)<br />
{<br />
LocalisationGroup group = _repository.FindLocalisationGroup(LocalisationGroupId);<br />
return group;<br />
}</em></p>
<p>Au vu de cet exemple on pourrait se poser la question du bien fondé d’avoir une couche service, mais celle ci prend tout son sens pour par exemple pour les fonctions GetLocalisationGroups() et GetLocalisationGroups(int? GroupParentId) qui servent respectivement à récupérer tous les groupes et à récupérer tous les groupes possédant un certain groupe parent. On verrait alors deux traitements différents d’un appel à la même fonction de notre repository FindAllLocalisationGroup.</p>
<p><em>//get all the groups in the database<br />
public IList&lt;LocalisationGroup&gt; GetLocalisationGroups()<br />
{<br />
IQueryable&lt;LocalisationGroup&gt; groups = _repository.FindAllLocalisationGroup();<br />
}</em></p>
<p>et</p>
<p><em>//get the groups whom parent id is given<br />
public IList&lt;LocalisationGroup&gt; GetLocalisationGroups(int? GroupParentId)<br />
{<br />
IQueryable&lt;LocalisationGroup&gt; groups = _repository.FindAllLocalisationGroup().Where(x =&gt; (x.ParentGroup.Id == GroupParentId) || (x.ParentGroup==null &amp;&amp; !GroupParentId.HasValue));<br />
return groups.ToList();<br />
}</em></p>
<p>L’intérêt ici est que ce qui sort de notre repository n’est qu’un IQueryable, ce qui signifie que l’appel à la base de données n’a pas été fait. Il ne sera fait que dans notre couche service, et donc la requête SQL sera appropriée a la demande initiale. Il n’y aura pas de requête du style : “ Select * from ma table”, pour ensuite faire un filtrage sur les résultats, ce qui serait un gâchis énorme.</p>
<p>Trêve de digression, je reviens à mon sujet initial. Et j’aborde le point 2. Beaucoup plus intéressant. Je veux connaitre pour un groupe donné tous les parents  de celui ci. Pour ce faire, j’ai de la chance j’ai une procédure stockée qui me renvoie l’information sous forme de liste. Parfait, il n’y a plus qu’à extraire ces informations de ma procédure stockée!</p>
<p>La première chose à faire est d’écrire ma proc. stock dans ma base de données. Elle a pour nom [SP_LocalisationGroup_GetParents] et prend en argument un entier nullable : @localisationgroup_childid int=null</p>
<p>Maintenant tâche à nous de faire comprendre à EF ce que nous voulons. Je me place donc dans mon modèle de données.</p>
<p><a href="http://yoannr.files.wordpress.com/2010/01/ef21.jpg"><img style="display:inline;border:0;" title="ef2-1" src="http://yoannr.files.wordpress.com/2010/01/ef21_thumb.jpg?w=244&#038;h=171" border="0" alt="ef2-1" width="244" height="171" /></a></p>
<p>et je fais un clic droit pour actualiser mon modèle depuis ma base de données.</p>
<p>je choisis ma procédure stockée à ajouter.</p>
<p><a href="http://yoannr.files.wordpress.com/2010/01/ef22.jpg"><img style="display:inline;border:0;" title="ef2-2" src="http://yoannr.files.wordpress.com/2010/01/ef22_thumb.jpg?w=244&#038;h=224" border="0" alt="ef2-2" width="244" height="224" /></a></p>
<p>Et je valide.</p>
<p>Ensuite je me place dans le model Browser et dans localisation.Store, je vois ma procédure stockée qui a été rajouté. Afin d’avoir un accès facile à cette dernière, je clic droit sur elle et je choisis add function import.</p>
<p><a href="http://yoannr.files.wordpress.com/2010/01/ef23.jpg"><img style="display:inline;border:0;" title="ef2-3" src="http://yoannr.files.wordpress.com/2010/01/ef23_thumb.jpg?w=219&#038;h=244" border="0" alt="ef2-3" width="219" height="244" /></a></p>
<p>Cela va me rajouter une fonction d’import dans mon conteneur et ainsi me permettre de prendre en main l’appel à cette procédure stockée de cette façon :</p>
<p><em>public IList&lt;LocalisationGroup&gt; GetLocalisationGroupParents(int groupid)<br />
{<br />
IList&lt;LocalisationGroup&gt; parentgroups = container.SP_LocalisationGroup_GetParents(groupid).ToList();<br />
return parentgroups;<br />
}</em></p>
<p>Vous remarquerez ici que l’accès à la base de données est immédiat. cela signifie donc que lorsque j’appellerais cette fonction, je ferais un appel à ma base, en renvoyant un IQueryable ce n’est pas le cas. Mais ici ce n’est pas important, car je récupère directement ce qui m’intéresse sans avoir à faire un traitement particulier dessus.</p>
<p>Voilà, je pense avoir rajouter une petite brique de plus. Je vais continuer à travailler sur ce petit projet au rythme de mon temps disponible… donc ne vous étonnez pas d’avoir des nouvelles dans 48 heures ou dans 3 mois!</p>
<p>Merci de votre lecture, et comme d’habitude si vous avez des suggestions, des commentaires, ou autres, surtout n’hésitez pas.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/yoannr.wordpress.com/167/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/yoannr.wordpress.com/167/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/yoannr.wordpress.com/167/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/yoannr.wordpress.com/167/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/yoannr.wordpress.com/167/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/yoannr.wordpress.com/167/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/yoannr.wordpress.com/167/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/yoannr.wordpress.com/167/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/yoannr.wordpress.com/167/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/yoannr.wordpress.com/167/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/yoannr.wordpress.com/167/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/yoannr.wordpress.com/167/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/yoannr.wordpress.com/167/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/yoannr.wordpress.com/167/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yoannr.wordpress.com&amp;blog=6541953&amp;post=167&amp;subd=yoannr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://yoannr.wordpress.com/2010/01/26/voyage-vers-mvc2-et-ef2-tape-4-pour-affronter-le-scorbut-servir-des-procdures-stockes-fraiches/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b70a8002f84b4100aba364db4b440efc?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Arthis</media:title>
		</media:content>

		<media:content url="http://yoannr.files.wordpress.com/2010/01/ef21_thumb.jpg" medium="image">
			<media:title type="html">ef2-1</media:title>
		</media:content>

		<media:content url="http://yoannr.files.wordpress.com/2010/01/ef22_thumb.jpg" medium="image">
			<media:title type="html">ef2-2</media:title>
		</media:content>

		<media:content url="http://yoannr.files.wordpress.com/2010/01/ef23_thumb.jpg" medium="image">
			<media:title type="html">ef2-3</media:title>
		</media:content>
	</item>
		<item>
		<title>Voyage vers MVC2 et EF2 : &#233;tape 3, perdu en pleine mer, bon dieu o&#249; est l&#8217;&#233;toile polaire ?!</title>
		<link>http://yoannr.wordpress.com/2010/01/25/voyage-vers-mvc2-et-ef2-tape-3-perdu-en-pleine-mer-bon-dieu-o-est-ltoile-polaire/</link>
		<comments>http://yoannr.wordpress.com/2010/01/25/voyage-vers-mvc2-et-ef2-tape-3-perdu-en-pleine-mer-bon-dieu-o-est-ltoile-polaire/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 14:00:04 +0000</pubDate>
		<dc:creator>yoannr</dc:creator>
				<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[MVC]]></category>

		<guid isPermaLink="false">http://yoannr.wordpress.com/2010/01/25/voyage-vers-mvc2-et-ef2-tape-3-perdu-en-pleine-mer-bon-dieu-o-est-ltoile-polaire/</guid>
		<description><![CDATA[Bon ca fait un petit moment que je devais revenir. J’avais prévu une semaine, au final, cela aura fait deux mois. Entre temps beaucoup de tafs et d#autres choses mais on est pas la pour parler de ma vie, enfin pas que.. Je me suis beaucoup intéresse au développement sous AJAX ces derniers temps, et [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yoannr.wordpress.com&amp;blog=6541953&amp;post=156&amp;subd=yoannr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Bon ca fait un petit moment que je devais revenir. J’avais prévu une semaine, au final, cela aura fait deux mois. Entre temps beaucoup de tafs et d#autres choses mais on est pas la pour parler de ma vie, enfin pas que.. <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Je me suis beaucoup intéresse au développement sous AJAX ces derniers temps, et surtout ce qui est faisable avec MVC ASP.net. Le résultat n’est pas encore probant, je n’ai pas encore réussi a faire vraiment ce que je voulais, mais je vais vous livrer une première ébauche de ce vers quoi je tends, avec un peu de chance, j’aurais peut être même deux ou trois commentaires qui me guideront vers la sortie…</p>
<p>L’objectif est pour le moment de faire apparaitre  un tableau avec les valeurs de ma table de LocalisationGroup et de pouvoir une popup pour éditer un élément de ma table.</p>
<p>Pour cela j’ai le code suivant :</p>
<p><em>&lt;h2&gt;Groups&lt;/h2&gt;<br />
&lt;div id=&nbsp;&raquo;GroupList&nbsp;&raquo;&gt;&lt;/div&gt;<br />
&lt;div id=&nbsp;&raquo;GroupDetail&nbsp;&raquo; title=&nbsp;&raquo;Detail Group&nbsp;&raquo;&gt;<br />
&lt;/div&gt;</em></p>
<p>Comme vous pouvez le voir ridiculeusement simple. Ma div grouplist sera peuplé par un appel javascript :</p>
<p><em>function RefreshListGroup(id) {<br />
//load the list of group<br />
$(&laquo;&nbsp;#GroupList&nbsp;&raquo;).load(&laquo;&nbsp;/Localisation/ListGroup&nbsp;&raquo;, { ParentGroupId: id });<br />
} </em></p>
<p><em> //Intialisation of the page<br />
RefreshListGroup(null);</em></p>
<p>Cet appel JavaScript va charger le contenu Html qui sera renvoyé lors de l’appel à l’action ListGroup du contrôleur Localisation, et elle prend en paramètre le parent group id car je le rappelle, ma liste de données possède une structure hiérarchique.</p>
<p><a href="http://yoannr.files.wordpress.com/2010/01/tableau.jpg"><img style="display:inline;border-width:0;" title="tableau" src="http://yoannr.files.wordpress.com/2010/01/tableau_thumb.jpg?w=244&#038;h=156" border="0" alt="tableau" width="244" height="156" /></a></p>
<p>De quoi est composé cette action :</p>
<p><em>// GET: /Localisation/ListGroup/id<br />
public ActionResult ListGroup(int? ParentGroupId)<br />
{<br />
Localisation localisation = CreateLocalisation();<br />
localisation.Groups = servicelocalisation.GetLocalisationGroups(ParentGroupId);<br />
localisation.AllGroups = servicelocalisation.GetLocalisationGroups();<br />
return View(&laquo;&nbsp;ListGroup&nbsp;&raquo;, localisation);<br />
}</em></p>
<p>Elle renvoie une vue nommé List group qui correspond à un usercontrol qui contient mon tableau. J’aurais pu associer a ce usercontrol une banale liste de localisationgroup, mais je vais avoir besoin de plus d’information ensuite, donc j’ai un DTO qui m’assure le transport de toutes mes informations vers ma vue.</p>
<p>Ce contrôle qui contient mon code Html est le suivant:</p>
<p><em>&lt;%@ Control Language=&nbsp;&raquo;C#&nbsp;&raquo; Inherits=&nbsp;&raquo;System.Web.Mvc.ViewUserControl&lt;Localisation&gt;&nbsp;&raquo; %&gt; </em></p>
<p><em> &lt;table class=&nbsp;&raquo;list&nbsp;&raquo; width=&nbsp;&raquo;100%&nbsp;&raquo; cellspacing=&nbsp;&raquo;0&#8243; border=&nbsp;&raquo;1&#8243; rules=&nbsp;&raquo;all&nbsp;&raquo;&gt;<br />
&lt;tr class=&nbsp;&raquo;headerStyle&nbsp;&raquo;&gt;<br />
&lt;td&gt;<br />
&amp;nbsp;<br />
&lt;/td&gt;<br />
&lt;td&gt;<br />
&lt;input type=&nbsp;&raquo;checkbox&nbsp;&raquo; enabled=&nbsp;&raquo;false&nbsp;&raquo; /&gt;<br />
&lt;/td&gt;<br />
&lt;td&gt;<br />
&lt;asp:Image ID=&nbsp;&raquo;Image2&#8243; runat=&nbsp;&raquo;server&nbsp;&raquo; ImageUrl=&nbsp;&raquo;~/App_Themes/dynamiq/true.gif&nbsp;&raquo; /&gt;<br />
&lt;/td&gt;<br />
&lt;td width=&nbsp;&raquo;100%&nbsp;&raquo;&gt;<br />
Name<br />
&lt;/td&gt;<br />
&lt;td &gt;<br />
&amp;nbsp;<br />
&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;% foreach (Data.LocalisationGroup group in Model.Groups )<br />
{%&gt;<br />
&lt;tr class=&nbsp;&raquo;itemStyle&nbsp;&raquo;&gt;<br />
&lt;td&gt;<br />
&lt;%<br />
if (Model.CurrentGroup.Id&gt;0)<br />
{<br />
Response.Write(Html.Image(this.ResolveUrl(&laquo;&nbsp;~/App_Themes/dynamiq/attention.gif&nbsp;&raquo;),<br />
&laquo;&nbsp;The dates of this group are not in the boundaries of its parent&nbsp;&raquo;,<br />
!group.MatchParentKeyDates(Model.CurrentGroup.StartDate, Model.CurrentGroup.EndDate)));<br />
}<br />
%&gt;<br />
&lt;/td&gt;<br />
&lt;td&gt;<br />
&amp;nbsp;<br />
&lt;/td&gt;<br />
&lt;td&gt;<br />
&lt;%= group.IsReleased %&gt;<br />
&lt;/td&gt;<br />
&lt;td &gt;<br />
&lt;a href=&nbsp;&raquo;Javascript:RefreshListGroup(&lt;%= group.Id %&gt;);&nbsp;&raquo;&gt;&lt;%= group.Name %&gt;&lt;/a&gt;<br />
&lt;/td&gt;<br />
&lt;td &gt;<br />
&lt;%= Ajax.ActionLink(&laquo;&nbsp;Edit&nbsp;&raquo;, &laquo;&nbsp;DetailLocalisationGroup&nbsp;&raquo;, new { id = group.Id }, new AjaxOptions() { UpdateTargetId = &laquo;&nbsp;DetailLocalisationGroup&nbsp;&raquo;, OnSuccess = &laquo;&nbsp;InitialisationDetailGroup&nbsp;&raquo; })%&gt;<br />
&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;%  }%&gt;<br />
&lt;/table&gt;</em></p>
<p>Rien de bien compliqué ici, je me contente d’afficher les informations dans différentes lignes. La seule dynamicité est là :</p>
<p><em>&lt;a href=&nbsp;&raquo;Javascript:RefreshListGroup(&lt;%= group.Id %&gt;);&nbsp;&raquo;&gt;&lt;%= group.Name %&gt;&lt;/a&gt;</em></p>
<p>Cet appel me permet de recharger ma list de localisationGroup, au cas ou je désire naviguer dans ma liste hiérarchique.</p>
<p>et le deuxième point est là :</p>
<p><em>&lt;%= Ajax.ActionLink(&laquo;&nbsp;Edit&nbsp;&raquo;, &laquo;&nbsp;DetailLocalisationGroup&nbsp;&raquo;, new { id = group.Id }, new AjaxOptions() { UpdateTargetId = &laquo;&nbsp;DetailLocalisationGroup&nbsp;&raquo;, OnSuccess = &laquo;&nbsp;InitialisationDetailGroup&nbsp;&raquo; })%&gt;</em></p>
<p>Ici j’utilise une propriété du framework MVC . Il s’agit là d’appeler l’action DetailLocalisationGroup du contrôleur Localisation, et de rendre l’html produit dans la div DetailLocalisationGroup.</p>
<p>Ainsi en cliquant sur le lien  , le contenu du div groupdetail contiendra le formulaire de modification de mon objet localisationgroup</p>
<p><em>&lt;h2&gt;Groups&lt;/h2&gt;<br />
&lt;div id=&nbsp;&raquo;GroupList&nbsp;&raquo;&gt;&lt;/div&gt;<br />
&lt;div id=&nbsp;&raquo;GroupDetail&nbsp;&raquo; title=&nbsp;&raquo;Detail Group&nbsp;&raquo;&gt;<br />
&lt;/div&gt;</em></p>
<p>l’action du controleur Localisation est la suivante :</p>
<p><em>[AcceptVerbs("POST")]<br />
public ActionResult DetailLocalisationGroup(int id)<br />
{<br />
LocalisationGroup group = servicelocalisation.GetLocalisationGroup(id);<br />
return View(&laquo;&nbsp;DetailGroup&nbsp;&raquo;, group);<br />
}</em></p>
<p>Elle renvoie un usercontrol nommé DetailGroup, avec le group demandé :</p>
<p><em>&lt;%@ Control Language=&nbsp;&raquo;C#&nbsp;&raquo; Inherits=&nbsp;&raquo;System.Web.Mvc.ViewUserControl&lt;Data.LocalisationGroup&gt;&nbsp;&raquo; %&gt;<br />
&lt;form id=&nbsp;&raquo;EditLocalisationGroupForm&nbsp;&raquo; &gt;<br />
&lt;p&gt;<br />
Id:<br />
&lt;%= Html.Encode(Model.Id)%&gt;<br />
&lt;%= Html.TextBox(&laquo;&nbsp;Id&nbsp;&raquo;, Html.Encode(Model.Id), new { @readonly = &laquo;&nbsp;true&nbsp;&raquo; })%&gt;<br />
&lt;/p&gt;<br />
&lt;p&gt;<br />
Name:<br />
&lt;%= Html.TextBox(&laquo;&nbsp;Name&nbsp;&raquo;, Html.Encode(Model.Name))%&gt;<br />
&lt;%= Html.ValidationMessage(&laquo;&nbsp;Name&nbsp;&raquo;, &laquo;&nbsp;*&nbsp;&raquo;)%&gt;<br />
&lt;/p&gt;<br />
&lt;p&gt;<br />
ParentGroupId:  &lt;%= Html.TextBox(&laquo;&nbsp;ParentGroupId&nbsp;&raquo;, Html.Encode(Model.ParentGroupId))%&gt;<br />
&lt;/p&gt;<br />
&lt;/form&gt;</em></p>
<p>A ce stade, je me retrouverait donc avec mes deux div de départ chargés du Html qui va bien. Et pour mettre un peu de bonhommie dans tout ca, j’aurais pris soin d’utiliser un peu de Jquery pour mettre en forme mon formulaire d’edition, et ce JQuery provoquera aussi la soumission de mes informations :</p>
<p><em> $(function () { </em></p>
<p><em> $(&laquo;&nbsp;#DetailLocalisationGroup&nbsp;&raquo;).dialog({<br />
bgiframe: true,<br />
autoOpen: false,<br />
height: 500,<br />
width: 300,<br />
modal: true,<br />
buttons: {<br />
&#8216;Save&#8217;: function () {<br />
var bValid = true;</em></p>
<p><em> //Validation du contenu : bValid=true or false </em></p>
<p><em> </em></p>
<p><em> if (bValid) {<br />
dataString = $(&laquo;&nbsp;#EditLocalisationGroupForm&nbsp;&raquo;).serialize(); </em></p>
<p><em> </em></p>
<p><em>$.ajax(<br />
{<br />
type: &laquo;&nbsp;POST&nbsp;&raquo;,<br />
url: &laquo;&nbsp;/Localisation/EditLocalisationGroup&nbsp;&raquo;,<br />
data: dataString,<br />
dataType: &laquo;&nbsp;html&nbsp;&raquo;,<br />
success: function (data) {<br />
$(&laquo;&nbsp;#GroupList&nbsp;&raquo;).html(data);<br />
},<br />
error: function (httpRequest, textStatus, errorThrown) {<br />
alert(&laquo;&nbsp;status=&nbsp;&raquo; + textStatus + &laquo;&nbsp;,error=&nbsp;&raquo; + errorThrown);<br />
}<br />
}<br />
);</em></p>
<p><em> $(this).dialog(&#8216;close&#8217;);<br />
}<br />
},<br />
Cancel: function () {<br />
$(this).dialog(&#8216;close&#8217;);<br />
}<br />
},<br />
close: function () {<br />
allFields.val(&nbsp;&raquo;).removeClass(&#8216;ui-state-error&#8217;);<br />
}<br />
}); </em></p>
<p><em> $(&#8216;#create-user&#8217;).click(function () {<br />
$(&#8216;#DetailLocalisationGroup&#8217;).dialog(&#8216;open&#8217;);<br />
})<br />
$(&#8216;#edit-group&#8217;).click(function () {<br />
$(&#8216;#DetailLocalisationGroup&#8217;).dialog(&#8216;open&#8217;);<br />
}); </em></p>
<p><em> });</em></p>
<p><em> </em></p>
<p><a href="http://yoannr.files.wordpress.com/2010/01/edit.jpg"><img style="display:inline;border-width:0;" title="Edit" src="http://yoannr.files.wordpress.com/2010/01/edit_thumb.jpg?w=151&#038;h=244" border="0" alt="Edit" width="151" height="244" /></a></p>
<p>J’utilise ceci pour envoyer mes données à l’action EditLocalisationGroup du controleur Localisation :</p>
<p><em> dataString = $(&laquo;&nbsp;#EditLocalisationGroupForm&nbsp;&raquo;).serialize(); </em></p>
<p><em>$.ajax(<br />
{<br />
type: &laquo;&nbsp;POST&nbsp;&raquo;,<br />
url: &laquo;&nbsp;/Localisation/EditLocalisationGroup&nbsp;&raquo;,<br />
data: dataString,<br />
dataType: &laquo;&nbsp;html&nbsp;&raquo;,<br />
success: function (data) {<br />
$(&laquo;&nbsp;#GroupList&nbsp;&raquo;).html(data);<br />
},<br />
error: function (httpRequest, textStatus, errorThrown) {<br />
alert(&laquo;&nbsp;status=&nbsp;&raquo; + textStatus + &laquo;&nbsp;,error=&nbsp;&raquo; + errorThrown);<br />
}<br />
}<br />
);</em></p>
<p>Le contrôleur récupère un groupe qu’il tachera de sauvegarder dans la base de données :</p>
<p><em>[AcceptVerbs("POST")]<br />
public ActionResult EditLocalisationGroup(LocalisationGroup group)<br />
{<br />
servicelocalisation.SaveLocalisationGroup(group);<br />
return ListGroup(group.ParentGroupId);<br />
}</em></p>
<p>En cas de succès, je récupère le contenu de mon tableau que je rempalce dans ma div. je referme ensuitema popup:</p>
<p><em>$(this).dialog(&#8216;close&#8217;);</em></p>
<p>Voilà pour l’instant , où j’en suis rendu. Les choses avancent tout doucement. Il y a plusieurs choses que je n’aime pas trop comme le fait de faire appel a des postback via Jquery . J’aurais préféré quelque chose de plus intégré dans le Framework asp.net MVC. Mais peut être m’y suis je mal pris, je compte continuer un peu mes investigations dans ce domaine.</p>
<p>Si vous avez des idées, des commentaires ou des remarques a faire sur la façon que j’ai de procéder n’hésiter surtout pas, je suis dans une phase d’exploration en ce moment…</p>
<p>le projet est téléchargeable en l’état, c’est à dire en construction <a href="http://dl.free.fr/pxBmrVR9a" target="_blank">ici</a>.</p>
<p>merci de votre lecture,</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/yoannr.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/yoannr.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/yoannr.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/yoannr.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/yoannr.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/yoannr.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/yoannr.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/yoannr.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/yoannr.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/yoannr.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/yoannr.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/yoannr.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/yoannr.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/yoannr.wordpress.com/156/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yoannr.wordpress.com&amp;blog=6541953&amp;post=156&amp;subd=yoannr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://yoannr.wordpress.com/2010/01/25/voyage-vers-mvc2-et-ef2-tape-3-perdu-en-pleine-mer-bon-dieu-o-est-ltoile-polaire/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b70a8002f84b4100aba364db4b440efc?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Arthis</media:title>
		</media:content>

		<media:content url="http://yoannr.files.wordpress.com/2010/01/tableau_thumb.jpg" medium="image">
			<media:title type="html">tableau</media:title>
		</media:content>

		<media:content url="http://yoannr.files.wordpress.com/2010/01/edit_thumb.jpg" medium="image">
			<media:title type="html">Edit</media:title>
		</media:content>
	</item>
		<item>
		<title>Voyage vers MVC 2 et Entity Framework 2 : &#233;tape 2 on quitte le port doucement&#8230;.</title>
		<link>http://yoannr.wordpress.com/2009/11/19/voyage-vers-mvc-2-et-entity-framework-2-tape-2-on-quitte-le-port-doucement/</link>
		<comments>http://yoannr.wordpress.com/2009/11/19/voyage-vers-mvc-2-et-entity-framework-2-tape-2-on-quitte-le-port-doucement/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 09:15:07 +0000</pubDate>
		<dc:creator>yoannr</dc:creator>
				<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[MVC]]></category>

		<guid isPermaLink="false">http://yoannr.wordpress.com/2009/11/19/voyage-vers-mvc-2-et-entity-framework-2-tape-2-on-quitte-le-port-doucement/</guid>
		<description><![CDATA[Avant de se lancer dans des développements un peu trop compliqué, je voudrais savoir un peu comment marche la chose, au moins dans ses grandes lignes, et comment je vais pouvoir en tirer parti. Entity Framework &#160; Le modele edmx ( il va falloir que je me renseigne sur les termes avant la fin, moi…) [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yoannr.wordpress.com&amp;blog=6541953&amp;post=147&amp;subd=yoannr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Avant de se lancer dans des développements un peu trop compliqué, je voudrais savoir un peu comment marche la chose, au moins dans ses grandes lignes, et comment je vais pouvoir en tirer parti.</p>
<h2>Entity Framework</h2>
<p>&nbsp;</p>
<p>Le modele edmx ( il va falloir que je me renseigne sur les termes avant la fin, moi…) me génère mes objets tout seul. ca j’apprécie beaucoup. je me retrouve donc avec un objet comme suit ( en fait c’est beaucoup plus long, mais j’ai décidé de me retreindre à l’essentiel) :</p>
<p><em>[EdmEntityTypeAttribute(NamespaceName="Localisation", Name="Culture")]<br />
[Serializable()]<br />
[DataContractAttribute(IsReference=true)]<br />
public partial class Culture : EntityObject<br />
{<br />
    public global::System.Int32 Id {get; set;}<br />
    public global::System.String Language {get; set;}<br />
    public global::System.String Country {get; set;}<br />
}</em></p>
<p>Pour l’instant, je ne regarderais pas plus avant ce qu&#8217; il y a dedans.</p>
<p>Et je ne m’attarderais pas non plus sur toutes les fonctions possibles contenues le modele edmx, mais par contre je vais les utiliser dans un classe RepositoryCulture.</p>
<p><em>public class CultureRepository: ICultureRepository<br />
   { </em></p>
<p><em>       LocalisationContainer container ; </em></p>
<p><em>       public CultureRepository(string connectionstring)<br />
       {<br />
           container = new LocalisationContainer(connectionstring);<br />
       } </em></p>
<p><em>       // Query Methods<br />
       public IQueryable&lt;Culture&gt; FindAllCulture()<br />
       {<br />
           return  container.T_Culture;<br />
       }<br />
       public Culture FindCulture(int CultureId)<br />
       {<br />
           var culture=  from c in FindAllCulture()<br />
                          where c.Id == CultureId<br />
                           select c;<br />
           return culture.SingleOrDefault();<br />
       } </em></p>
<p><em>       // Insert/Delete<br />
       public void AddCulture(Culture c)<br />
       {<br />
           container.T_Culture.AddObject(c);<br />
           container.SaveChanges();<br />
       }<br />
       public void DeleteCulture(Culture c)<br />
       {<br />
           container.T_Culture.DeleteObject(c);<br />
           container.SaveChanges();<br />
       } </em></p>
<p><em>       // Persistence<br />
       public void Save()<br />
       {<br />
           container.SaveChanges();<br />
       }<br />
   }</em></p>
<p>Cette dernière va me permettre de manipuler mon edmx, de façon sereine. Mais cela veut donc dire que je vais utiliser une interface afin de me préserver d’un éventuel changement d’humeur de ma part ( je pourrais avoir envie d’essayer Nhibernate par exemple, plus tard…  grrr…)</p>
<p><em>public interface ICultureRepository<br />
    {<br />
    // Query Methods<br />
    IQueryable&lt;Culture&gt; FindAllCulture();<br />
    Culture FindCulture(int CultureId); </em></p>
<p><em>    // Insert/Delete<br />
    void AddCulture(Culture c);<br />
    void DeleteCulture(Culture c);<br />
    // Persistence<br />
    void Save(); </em></p>
<p><em>    }</em></p>
<p>&nbsp;</p>
<p>Je dispose donc maintenant d’une méthode conviviale pour jouer avec mes données de Culture. Passons au coté MVC…</p>
<h3>MVC</h3>
<h4>l’acces aux donnés</h4>
<p>De la même façon, que je suis parti sur un concept simple pour le coté Entity Framework, je ferais de même pour ma première approche de MVC.</p>
<p>La première chose que je veux faire, c’est de pouvoir accéder aux donnés facilement dans mon application MVC, je vais donc poursuivre le travail effectué plus avant, et généraliser ma façon d’accéder aux infos. Pour ce faire, je vais utilser un composant d’injection de dépendance / Inversion de Contrôle  nommé <a href="http://structuremap.sourceforge.net/Default.htm" target="_blank">StructureMap</a></p>
<p>Je ne susi réellement pas un expert de ce genre de composé, j ai donc repiqué beaucoup d’idée a un tutorial MVC de microsoft. Mais voilà ce que j’ai pu en tirer pour mon cas présent.</p>
<p>dans mon application_start , j’ai rajouté</p>
<blockquote><p><em>        BootStrapper.ConfigureStructureMap(); </em></p></blockquote>
<p><em>           ControllerBuilder.Current.SetControllerFactory(<br />
               new StructureMapControllerFactory()<br />
               );</em></p>
<p>Cela me permet d’initialiser le composant. la classe BootStrapper consiste en deux lignes :</p>
<p><em>public class BootStrapper<br />
   {<br />
       public static void ConfigureStructureMap()<br />
       {<br />
           StructureMapConfiguration.AddRegistry(new DBServiceRegistry()); <br />
           StructureMapConfiguration.AddRegistry(new StorefrontRegistry());<br />
       }<br />
   }</em></p>
<p>Et la classe DBServiceReigistry, va me permettre d’instancier ma conenction à la bonne base pour entity :</p>
<p><em>public class DBServiceRegistry : Registry<br />
    {<br />
        public string ConnectionString<br />
        {<br />
            get<br />
            {<br />
                if (WebConfigurationManager.ConnectionStrings["Application"]==null)<br />
                    throw new InvalidOperationException(&laquo;&nbsp;Conenction string Application cannot be null.&nbsp;&raquo;);<br />
                if (string.IsNullOrEmpty(WebConfigurationManager.ConnectionStrings["Application"].ToString()))<br />
                    throw new InvalidOperationException(&laquo;&nbsp;Connection string Application cannot be empty.&nbsp;&raquo;); </em></p>
<p><em>                return WebConfigurationManager.ConnectionStrings["Application"].ToString();<br />
            }<br />
        } </em></p>
<p><em>        protected override void configure()<br />
        { </em></p>
<p><em>            ForRequestedType&lt;System.Data.EntityClient.EntityConnection&gt;()<br />
                .TheDefaultIs(() =&gt; new System.Data.EntityClient.EntityConnection(ConnectionString))<br />
                .CacheBy(InstanceScope.Hybrid); </em></p>
<p><em>        }<br />
    }</em></p>
<p>tandis que StoreFrontRegistryx lui cataloguera, les différents repository que je peux avoir et instanciera la bonne classe.</p>
<p><em>public class StorefrontRegistry : Registry<br />
    {<br />
        protected override void configure()<br />
        { </em></p>
<p><em>            #region repository<br />
            ForRequestedType&lt;ICultureRepository&gt;()<br />
              .TheDefaultIsConcreteType&lt;CultureRepository&gt;(); </em></p>
<p><em>            ForRequestedType&lt;ILocalisationRepository&gt;()<br />
              .TheDefaultIsConcreteType&lt;LocalisationRepository&gt;();<br />
            #endregion<br />
        }<br />
    }</em></p>
<p>Pour l’instant, j’utilise une autre classe StructureMapControllerFactory, mais je n’ai pas encore pris le temps de changer quelque chose à l’intérieur, le besoin ne s’en est pas fait sentir tout du moins.</p>
<h4>les routes</h4>
<p>Pour mes routes je ne me suis pas trop embêté pour l’instant, et j ‘ai tapé dans le simple et efficace. J’ai codé en dur Localisation/Culture afin de faire un différence significative avec ce qui pourrait arrivé ensuite :</p>
<p>&nbsp;</p>
<p><em>public static void RegisterRoutes(RouteCollection routes)<br />
        {<br />
            routes.IgnoreRoute(&laquo;&nbsp;{resource}.axd/{*pathInfo}&nbsp;&raquo;); </em></p>
<p><em>            routes.MapRoute(<br />
                &laquo;&nbsp;home&nbsp;&raquo;,                                                  // Route name<br />
                &laquo;&nbsp;home/{controller}/{action}/{id}&nbsp;&raquo;,                       // URL with parameters<br />
                new { controller = &laquo;&nbsp;Home&nbsp;&raquo;, action = &laquo;&nbsp;Index&nbsp;&raquo;, id = &laquo;&nbsp;&nbsp;&raquo; }   // Parameter defaults<br />
            ); </em></p>
<p><em>            routes.MapRoute(<br />
               &laquo;&nbsp;localisation&nbsp;&raquo;,                                              // Route name<br />
               &laquo;&nbsp;localisation/culture/{action}/{id}&nbsp;&raquo;,                        // URL with parameters<br />
                new { controller = &laquo;&nbsp;Culture&nbsp;&raquo;, action = &laquo;&nbsp;Index&nbsp;&raquo;, id = &laquo;&nbsp;&nbsp;&raquo; }   // Parameter defaults<br />
           ); </em></p>
<p><em>        }</em></p>
<p>Par ailleurs avant d’aller plus loin , j ai installé un autre composant RouteDebug.dll qui me permet de debugger mes routes, je pense que tôt ou tard, j’en aurais besoin.</p>
<p>Pour ce faire, j’ai rajouter mais commenté pour le moment l’instruction suivante :</p>
<p>          <em>// ROUTES<br />
           RegisterRoutes(RouteTable.Routes);<br />
           //uncomment this line for route debugging<br />
           //RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);</em></p>
<p>On peut voir dans ma route que j’instancie :</p>
<p><em>       new { controller = &laquo;&nbsp;Culture&nbsp;&raquo;, action = &laquo;&nbsp;Index&nbsp;&raquo;, id = &laquo;&nbsp;&nbsp;&raquo; }  </em></p>
<p>Ce faisant, j’instancie un contrôle nommé Culture.</p>
<h4>le controller</h4>
<p>Rien de plus simple que ce controller. Mais tout d’abord, faire attention à son vrai nom CultureController. C’est important afin que MVC ne se mélange pas les pinceaux.</p>
<p>Ensuite détaillons le controller :</p>
<p><span style="text-decoration:underline;">son constructeur :</span></p>
<p><em>#region constructor </em></p>
<p><em>       public CultureController(ICultureRepository repository)<br />
       {<br />
           _repository = repository;<br />
           if (_repository == null)<br />
               throw new Exception(&laquo;&nbsp;Repository cannot be null&nbsp;&raquo;);<br />
       } </em></p>
<p><em>       #endregion</em></p>
<p>Il prend en entrée un ICultureRepository  qui sera instancié par StructureMap avec la bonne classe.</p>
<p>et ensuite correspondant à l’ {action} de ma route :</p>
<p><em>      // GET: /Localisation/Culture/Index ou /Localisation/Culture<br />
        public ActionResult Index()<br />
        {<br />
            IQueryable&lt;Culture&gt; cultures = _repository.FindAllCulture();<br />
            return View(&laquo;&nbsp;Index&nbsp;&raquo;, cultures);<br />
        }</em></p>
<p>Suivant l’url /Localisation/Culture/Index ou /Localisation/Culture, j’appellerais le Controller Culture et j’effectuerais l’action Index, qui me renverra la vue Index.</p>
<p>La vue Index prend en parametre un IQueryable&lt;Cultures&gt;, que je vais chercher au moment ou j’en ai besoin.</p>
<p>Cela fonctionne de la même facon pour les autres actions, avec un petit détail à voir, à savoir la méthode utilisé pour appeler l’url qui permettra sur la même Url De procéder à plusieurs actions différentes :</p>
<p><em>public ActionResult Details(int id)<br />
public ActionResult Create()</em></p>
<p><em>[AcceptVerbs(HttpVerbs.Post)]<br />
public ActionResult Create(FormCollection collection)</em></p>
<p><em>[AcceptVerbs(HttpVerbs.Get)]<br />
public ActionResult Edit(int id)</em></p>
<p><em>[AcceptVerbs(HttpVerbs.Post)]<br />
public ActionResult Edit(int id, FormCollection collection)</em></p>
<p><em>[AcceptVerbs(HttpVerbs.Get)]<br />
public ActionResult Delete(int id)</em></p>
<p>Sur ce , il n’ y a plus qu’à créer les vues correspondantes</p>
<h4>les Views</h4>
<p>Personnellement, et pour le début, je ne me suis pas embêté, et j’ai pris l’assistant de visual studio pour les créer.  J’ai donc créé un répertoire Culture dans Views. Ceci est aussi important pour MVC.</p>
<p>Je pense qu il doit y avoir un moyen de changer ce paramètre par défaut , mais ce sera l’occasion de plus amples investigations.</p>
<p>Voilà ,c’est tout pour aujourd’hui. Bon c’est bien évidemment hyper débutant comme approche, mais c’Est ce que je suis, et je me disais que d’autres pourraient être intéressé par mon cheminement personnel, si jamais il y avait des amateurs de MVC et d’entity framework dans les parages!</p>
<p>La suite la semaine prochaine,</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/yoannr.wordpress.com/147/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/yoannr.wordpress.com/147/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/yoannr.wordpress.com/147/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/yoannr.wordpress.com/147/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/yoannr.wordpress.com/147/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/yoannr.wordpress.com/147/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/yoannr.wordpress.com/147/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/yoannr.wordpress.com/147/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/yoannr.wordpress.com/147/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/yoannr.wordpress.com/147/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/yoannr.wordpress.com/147/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/yoannr.wordpress.com/147/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/yoannr.wordpress.com/147/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/yoannr.wordpress.com/147/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yoannr.wordpress.com&amp;blog=6541953&amp;post=147&amp;subd=yoannr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://yoannr.wordpress.com/2009/11/19/voyage-vers-mvc-2-et-entity-framework-2-tape-2-on-quitte-le-port-doucement/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b70a8002f84b4100aba364db4b440efc?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Arthis</media:title>
		</media:content>
	</item>
		<item>
		<title>Voyage vers MVC 2 et Entity Framework 2 :                &#233;tape 1 on pr&#233;pare le bateau et on  largue les amarres</title>
		<link>http://yoannr.wordpress.com/2009/11/18/voyage-vers-mvc-2-et-entity-framework-2-tape-1-on-prpare-le-bateau-et-on-largue-les-amarres/</link>
		<comments>http://yoannr.wordpress.com/2009/11/18/voyage-vers-mvc-2-et-entity-framework-2-tape-1-on-prpare-le-bateau-et-on-largue-les-amarres/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 15:23:22 +0000</pubDate>
		<dc:creator>yoannr</dc:creator>
				<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[MVC]]></category>

		<guid isPermaLink="false">http://yoannr.wordpress.com/2009/11/18/voyage-vers-mvc-2-et-entity-framework-2-tape-1-on-prpare-le-bateau-et-on-largue-les-amarres/</guid>
		<description><![CDATA[L’objectif que je me fixe dans les jours qui viennent est de réaliser une petite application de localisation en ASP.net et MVC. Il s’agit pour moi surtout de me familiariser avec ces techniques, et peut être que je pourrais vous emmener avec moi sur un petit bout de chemin, qui sait? Tout d’abord le but, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yoannr.wordpress.com&amp;blog=6541953&amp;post=141&amp;subd=yoannr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>L’objectif que je me fixe dans les jours qui viennent est de réaliser une petite application de localisation en ASP.net et MVC. Il s’agit pour moi surtout de me familiariser avec ces techniques, et peut être que je pourrais vous emmener avec moi sur un petit bout de chemin, qui sait?</p>
<p>Tout d’abord le but, je vais m’exprimer avec les mots que je connais a savoir ceux de l’univers webform: Avoir une librairie de contrôle qui accepteront un clé (localisationKey) et un langage. Cette clé possède une date de départ et une date de fin. Et associé à cette clé, je veux avoir un article (LocalisationItem) qui lui contiendra le texte a afficher en fonction du langage. Cela permettra de pouvoir aficher un texte en plusieurs langues et qui pourra changer aussi en fonction de la date.</p>
<p>Bref, rien de bien compliqué, surtout que j’ai déjà fait tout ca en webform. Il s’agit aussi pour moi, de voir l’effort à fournir pour transoposer vers le support MVC.net du travail déjà fait en webform.</p>
<p>Dernière petite précision, l’intérêt va être aussi d’utiliser Entity framework de façon à générer ma base de données à partir du modèle.</p>
<p>Les outils à ma disposition :</p>
<ul>
<li>Visual Studio 2010</li>
<li>Visual Studio 2005 expresse édition</li>
</ul>
<p>Tout d’abord mon premier schéma de données :</p>
<p><a href="http://yoannr.files.wordpress.com/2009/11/mvc1.gif"><img style="display:inline;border:0;" title="MVC1" src="http://yoannr.files.wordpress.com/2009/11/mvc1_thumb.gif?w=240&#038;h=105" border="0" alt="MVC1" width="240" height="105" /></a></p>
<p>Comme vous pouvez le constater, je pars du principe que je vais avoir des groupes qui contiendront des  groupes enfants, ou et des clés.</p>
<p>Et à chacune de ces clés, j’associe un item.</p>
<p>Lors de la création de mon schéma j’ai pris soin de spécifier pour chacun des id , la propriété StoreGeneratedPAttern=Identity. Cela me permet d’avoir un champ auto incrémenté du coté de ma base de données.</p>
<p>Du coté de ma solution, je m’oriente vers différents projets :</p>
<ul>
<li>site MVC</li>
<li>Data</li>
<li>Services</li>
<li>Test</li>
</ul>
<p>Tout ce ci n’est évidemment qu’une première approche, au fur et á mesure de l’avancée du projet j’affinerais un peu tout ca.</p>
<p>Voici le projet utilisé actuellement : <a href="http://dl.free.fr/bw9mru0KX" target="_blank">solution VS 2010</a></p>
<p>Suite dans l’étape 2&#8230;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/yoannr.wordpress.com/141/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/yoannr.wordpress.com/141/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/yoannr.wordpress.com/141/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/yoannr.wordpress.com/141/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/yoannr.wordpress.com/141/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/yoannr.wordpress.com/141/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/yoannr.wordpress.com/141/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/yoannr.wordpress.com/141/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/yoannr.wordpress.com/141/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/yoannr.wordpress.com/141/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/yoannr.wordpress.com/141/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/yoannr.wordpress.com/141/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/yoannr.wordpress.com/141/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/yoannr.wordpress.com/141/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yoannr.wordpress.com&amp;blog=6541953&amp;post=141&amp;subd=yoannr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://yoannr.wordpress.com/2009/11/18/voyage-vers-mvc-2-et-entity-framework-2-tape-1-on-prpare-le-bateau-et-on-largue-les-amarres/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b70a8002f84b4100aba364db4b440efc?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Arthis</media:title>
		</media:content>

		<media:content url="http://yoannr.files.wordpress.com/2009/11/mvc1_thumb.gif" medium="image">
			<media:title type="html">MVC1</media:title>
		</media:content>
	</item>
		<item>
		<title>Des container pour les objets transversaux dans une applications ASP.net</title>
		<link>http://yoannr.wordpress.com/2009/08/19/des-container-pour-les-objets-transversaux-dans-une-applications-asp-net/</link>
		<comments>http://yoannr.wordpress.com/2009/08/19/des-container-pour-les-objets-transversaux-dans-une-applications-asp-net/#comments</comments>
		<pubDate>Wed, 19 Aug 2009 14:36:51 +0000</pubDate>
		<dc:creator>yoannr</dc:creator>
				<category><![CDATA[Architecture]]></category>

		<guid isPermaLink="false">http://yoannr.wordpress.com/?p=115</guid>
		<description><![CDATA[Bonjour, Dans les applications ASP.net, on doit comme dans la plupart des application stocker  nos données lors de l&#8217;exécution du programme. En ASP.net, cela peut ête dans des variables d&#8217;application, de session, dans le cache, dans le viewstate. Mais on peut imaginer aussi un conteneur exprès pour accueillir des objets un certain laps de temps, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yoannr.wordpress.com&amp;blog=6541953&amp;post=115&amp;subd=yoannr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Bonjour,</p>
<p>Dans les applications ASP.net, on doit comme dans la plupart des application stocker  nos données lors de l&#8217;exécution du programme. En ASP.net, cela peut ête dans des variables d&#8217;application, de session, dans le cache, dans le viewstate. Mais on peut imaginer aussi un conteneur exprès pour accueillir des objets un certain laps de temps, ou d&#8217;autres choses encore plus fantaisistes mais pourtant tellement quotidienne&#8230;</p>
<p>Par ailleurs, dans les applications asp.net, on peut etre confronté aussi à un autre problème: Comment arriver à obtenir de la souplesse avec le mode d&#8217;hébergement? je m&#8217;explique par un exemple, comment faire dans un site de e-commerce pour passer d&#8217;un caddie hébergé en variable de session à un caddie hébergé dans le viewstate ou dans le cache, etc..</p>
<p>Dans mes applications, j&#8217;utilise une seule classe avec des méthodes static . Et des lors que je veux quelque chose entreposé dans un container c&#8217;est à cette classe que je m&#8217;adresse. Un petit exemple avant de continuer :</p>
<p><span style="line-height:normal;"><span style="font-size:10pt;font-family:&quot;color:gray;" lang="EN-GB">///</span><span style="font-size:10pt;font-family:&quot;color:green;" lang="EN-GB"> </span><span style="font-size:10pt;font-family:&quot;color:gray;" lang="EN-GB">&lt;summary&gt;</span></span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:gray;">///</span><span style="color:green;"> this class defines where to get all the items used to make the web site work</span></span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:gray;">///</span><span style="color:green;"> This is where to define the storage of every item</span></span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:gray;">///</span><span style="color:green;"> </span><span style="color:gray;">&lt;/summary&gt;</span></span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">public</span> <span style="color:blue;">class</span> <span style="color:#2b91af;">MonContext</span></span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>{</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:gray;">///</span><span style="color:green;"> </span><span style="color:gray;">&lt;summary&gt;</span></span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:gray;">///</span><span style="color:green;"> Stored in the session</span></span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:gray;">///</span><span style="color:green;"> </span><span style="color:gray;">&lt;/summary&gt;</span></span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:gray;">///</span><span style="color:green;"> </span><span style="color:gray;">&lt;returns&gt;&lt;/returns&gt;</span></span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">public</span> <span style="color:blue;">static</span> <span style="color:#2b91af;">UserProvider</span> GetCurrentUser()</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>{</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:#2b91af;">StoringContainerProvider</span> container = <span style="color:#2b91af;">StoringContainerFactory</span>.GetInstance(_<br />
<span style="color:#2b91af;">StoringContainerFactory</span>.<span style="color:#2b91af;">E_StoringContainerType</span>.Session);</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">if</span> (container.LoadObject(<span style="color:#a31515;">&laquo;&nbsp;User&nbsp;&raquo;</span>) == <span style="color:blue;">null</span>)</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>{</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:#2b91af;">UserProvider</span> user = <span style="color:blue;">new</span> <span style="color:#2b91af;">UserProvider</span>();</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>container.SaveObject(user, <span style="color:#a31515;">&laquo;&nbsp;user&nbsp;&raquo;</span>);</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">return</span> (<span style="color:#2b91af;">UserProvider</span>)container.LoadObject(<span style="color:#a31515;">&laquo;&nbsp;User&nbsp;&raquo;</span>);</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"><span> </span>}</span></p>
<p class="MsoNormal">
<p>Cette méthode <span style="font-size:10pt;font-family:&quot;" lang="EN-GB">GetCurrentUser() va être responsable du container pour entreposer ma variable. Ici nous voyons un container de type simple : une session. Rien de bien excitant.<br />
Mais de la même facon, je pourrais appeler un autre type de conteneur. Maintenant , un petit tour sur la fabrication d&#8217;un conteneur. Celui ci va devoir implémenter l&#8217;interface suivante :</span></p>
<p><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;color:blue;" lang="EN-GB">public</span><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"> <span style="color:blue;">interface</span> <span style="color:#2b91af;">IContainer</span><span> </span>{</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">string</span> GetContainerKey(<span style="color:blue;">params</span> <span style="color:#2b91af;">Object</span>[] listparams);</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:#2b91af;">List</span>&lt;<span style="color:blue;">string</span>&gt; GetKeys();</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">bool</span> HasObject(<span style="color:blue;">string</span> ContainerKey);</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">object</span> LoadObject(<span style="color:blue;">string</span> ContainerKey);</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">void</span> SaveObject(<span style="color:#2b91af;">Object</span> objtoBeSaved, <span style="color:blue;">string</span> ContainerKey);</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span></span><span style="font-size:10pt;font-family:&quot;color:blue;">void</span><span style="font-size:10pt;font-family:&quot;"> DeleteObject(<span style="color:blue;">string</span> ContainerKey);</span></p>
<p><span style="font-size:10pt;font-family:&quot;"><span> </span>}</span></p>
<p><span style="font-size:10pt;font-family:&quot;">Et j&#8217;aurais alors une factory qui me permettra de choisir le type du conteneur qui m&#8217;interesse :</span></p>
<p><span style="font-size:10pt;font-family:&quot;"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;color:blue;" lang="EN-GB">public</span><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"> <span style="color:blue;">sealed</span> <span style="color:blue;">class</span> <span style="color:#2b91af;">StoringContainerFactory</span></span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>{</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:gray;">///</span><span style="color:green;"> </span><span style="color:gray;">&lt;summary&gt;</span></span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:gray;">///</span><span style="color:green;"> Type of container available </span></span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:gray;">///</span><span style="color:green;"> </span><span style="color:gray;">&lt;/summary&gt;</span></span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">public</span> <span style="color:blue;">enum</span> <span style="color:#2b91af;">E_StoringContainerType</span>{<span style="color:#2b91af;"> </span></span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>none,</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>Session,</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>Application,</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>RawCache,</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>MonWebContainer</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">private</span> <span style="color:#2b91af;">E_StoringContainerType</span> _StoringContainerType;</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">public</span> <span style="color:#2b91af;">E_StoringContainerType</span> StoringContainerType{</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">get</span>{ <span style="color:blue;">return</span> _StoringContainerType; }</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">set</span>{_StoringContainerType = <span style="color:blue;">value</span>; }</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">public</span> <span style="color:blue;">static</span> <span style="color:#2b91af;">StoringContainerProvider</span> GetInstance(_</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span style="color:#2b91af;"> E_StoringContainerType</span> containertype){</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:#2b91af;">StoringContainerProvider</span> Instance = <span style="color:blue;">null</span>;</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">switch</span> (containertype)</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>{</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">case</span> <span style="color:#2b91af;">E_StoringContainerType</span>.none:</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>Instance = <span style="color:blue;">new</span> ConcreteProvider.<span style="color:#2b91af;">StoringContainerNone</span>();</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">break</span>;</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">case</span> <span style="color:#2b91af;">E_StoringContainerType</span>.Session:</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>Instance = <span style="color:blue;">new</span> ConcreteProvider.<span style="color:#2b91af;">StoringContainerSession</span>();</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">break</span>;</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">case</span> <span style="color:#2b91af;">E_StoringContainerType</span>.Application:</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>Instance = <span style="color:blue;">new</span> ConcreteProvider.<span style="color:#2b91af;">StoringContainerApplication</span>();</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span> </span><span style="color:blue;">break</span>;</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">case</span> <span style="color:#2b91af;">E_StoringContainerType</span>.RawCache:</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>Instance = <span style="color:blue;">new</span> ConcreteProvider.<span style="color:#2b91af;">StoringContainerRawCache</span>();</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">break</span>;</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">case</span> <span style="color:#2b91af;">E_StoringContainerType</span>.MonWebContainer:</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span> </span>Instance = <span style="color:blue;">new</span> ConcreteProvider.<span style="color:#2b91af;">StoringContainerMonWebContainer</span>();</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span></span><span style="font-size:10pt;font-family:&quot;color:blue;">break</span><span style="font-size:10pt;font-family:&quot;">;</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"><span> </span><span style="color:blue;">return</span> Instance;</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"><span> </span>}</span></p>
<p><span style="font-size:10pt;font-family:&quot;"><span> </span>}</span></p>
<p><span style="font-size:10pt;font-family:&quot;">J&#8217;utilise un énuméré <span style="line-height:normal;color:#2b91af;">E_StoringContainerType <span style="color:#000000;line-height:19px;">dans ma factory car je trouve cela plus tranquille de connaitre les possibilités que j&#8217;ai d&#8217;entreposer des choses.</span></span></span></p>
<p>Cette factory nous renvoie des objets abstraits  de type <span style="line-height:normal;"><span style="color:#2b91af;">StoringContainerProvider</span> :</span></p>
<p><span style="line-height:normal;"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;color:blue;" lang="EN-GB">public</span><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"> <span style="color:blue;">abstract</span> <span style="color:blue;">class</span> <span style="color:#2b91af;">StoringContainerProvider</span> : <span style="color:#2b91af;">IContainer</span>,<span style="color:#2b91af;">IDisposable</span>{</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">public</span> <span style="color:blue;">string</span> GetContainerKey(<span style="color:blue;">params</span> <span style="color:#2b91af;">Object</span>[] listparams){</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">string</span> returnvalue=<span style="color:blue;">string</span>.Empty;</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">for</span> (<span style="color:blue;">int</span> i = 0; i &lt; listparams.GetLength(0); i++)</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>{</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">if</span> (listparams[i] != <span style="color:blue;">null</span>)</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>{</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>returnvalue += listparams[i].ToString();</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">else</span></span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>{</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span> </span>returnvalue += <span style="color:#a31515;">&laquo;&nbsp;null&nbsp;&raquo;</span>;</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">return</span> returnvalue;</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">public</span> <span style="color:blue;">abstract</span> <span style="color:blue;">void</span> DeleteObject(<span style="color:blue;">string</span> ContainerKey);</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">public</span> <span style="color:blue;">abstract</span> <span style="color:#2b91af;">List</span>&lt;<span style="color:blue;">string</span>&gt; GetKeys();</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span> </span><span style="color:blue;">public</span> <span style="color:blue;">abstract</span> <span style="color:blue;">bool</span> HasObject(<span style="color:blue;">string</span> ContainerKey);</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">public</span> <span style="color:blue;">abstract</span> <span style="color:#2b91af;">Object</span> LoadObject(<span style="color:blue;">string</span> ContainerKey);</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">public</span> <span style="color:blue;">abstract</span> <span style="color:blue;">void</span> SaveObject(<span style="color:#2b91af;">Object</span> ObjToBeSaved, <span style="color:blue;">string</span> ContainerKey);</span></p>
<p class="MsoNormal"><span style="font-size:10pt;line-height:115%;font-family:&quot;" lang="EN-GB"><span> </span></span><span style="font-size:10pt;line-height:115%;font-family:&quot;">}</span></p>
<p class="MsoNormal"><span style="font-size:10pt;line-height:115%;font-family:&quot;">Ces objets abstraits ne sont rien tant qu&#8217;ils ne sont pas instanciés avec un objet plus concret. Prenons l&#8217;exemple de rawCache:</span></p>
<p class="MsoNormal"><span style="font-size:10pt;line-height:115%;font-family:&quot;"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;color:blue;" lang="EN-GB">public</span><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"> <span style="color:blue;">class</span> <span style="color:#2b91af;">StoringContainerRawCache</span> : <span style="color:#2b91af;">StoringContainerProvider</span>{<span style="color:#2b91af;"> </span></span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">public</span> <span style="color:blue;">override</span> <span style="color:blue;">bool</span> HasObject(<span style="color:blue;">string</span> ContainerKey)</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>{</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">return</span> (<span style="color:#2b91af;">HttpContext</span>.Current.Cache[ContainerKey.ToLower()] != <span style="color:blue;">null</span>);</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">public</span> <span style="color:blue;">override</span> <span style="color:blue;">object</span> LoadObject(<span style="color:blue;">string</span> ContainerKey)</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>{</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">return</span> <span style="color:#2b91af;">HttpContext</span>.Current.Cache[ContainerKey.ToLower()];</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">public</span> <span style="color:blue;">override</span> <span style="color:blue;">void</span> SaveObject(<span style="color:#2b91af;">Object</span> ObjToBeSaved, <span style="color:blue;">string</span> ContainerKey)</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>{</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">if</span> (ObjToBeSaved == <span style="color:blue;">null</span>)</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>{</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">this</span>.DeleteObject(ContainerKey.ToLower());</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">else</span></span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>{</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:#2b91af;">HttpContext</span>.Current.Cache[ContainerKey.ToLower()] = ObjToBeSaved;</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span></span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">public</span> <span style="color:blue;">override</span> <span style="color:blue;">void</span> DeleteObject(<span style="color:blue;">string</span> ContainerKey)</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>{</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:#2b91af;">HttpContext</span>.Current.Cache.Remove(ContainerKey.ToLower());</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">public</span> <span style="color:blue;">override</span> <span style="color:#2b91af;">List</span>&lt;<span style="color:blue;">string</span>&gt; GetKeys()</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>{</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:#2b91af;">List</span>&lt;<span style="color:blue;">string</span>&gt; ls = <span style="color:blue;">new</span> <span style="color:#2b91af;">List</span>&lt;<span style="color:blue;">string</span>&gt;();</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:#2b91af;">IDictionaryEnumerator</span> d =<span> </span><span style="color:#2b91af;">HttpContext</span>.Current.Cache.GetEnumerator();</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>d.MoveNext();</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">for</span> (<span style="color:blue;">int</span> i = 0; i &lt; <span style="color:#2b91af;">HttpContext</span>.Current.Cache.Count;i++ )</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>{</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">if</span> (d.Current != <span style="color:blue;">null</span>)</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span> </span>{</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>ls.Add(d.Key.ToString());</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span></span><span style="font-size:10pt;font-family:&quot;">d.MoveNext();</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"><span> </span></span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"><span> </span><span style="color:blue;">return</span> ls;</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"><span> </span>}</span></p>
<p class="MsoNormal"><span style="font-size:10pt;line-height:115%;font-family:&quot;"><span> </span>}</span></p>
<p class="MsoNormal">Ici la gestion est aussi très simple, mais on pourrait imaginer , une gestion plus complexe qui aurait lieu dans cette classe. Ensuite Tout dépend des besoins d l&#8217;application à vrai dire. J&#8217;espère  vous avoir introduit à un système de gestion de vos conteneurs dans vos applications.</p>
<p class="MsoNormal">C&#8217;est agréable de travailler de la sorte ensuite, car vous ne vous poser plus aucune question sur l&#8217;endroit ou sont stockées vos objets, et vous pouvez ainsi disposer d&#8217;un vrai tableau de bord pour assigner tel ou tel objet dans tel ou tel conteneur afin d&#8217;optimiser vos sites et vos applications web.</p>
<p class="MsoNormal">Merci de votre lecture, si vous êtes arrivés jusque là&#8230;</p>
<p><span style="line-height:normal;"><br />
</span></p>
<div id="_mcePaste" style="overflow:hidden;position:absolute;left:-10000px;top:80px;width:1px;height:1px;"><!--[if gte mso 9]&gt;  Normal 0   21   false false false  DE-AT X-NONE X-NONE              MicrosoftInternetExplorer4              &lt;![endif]--><!--[if gte mso 9]&gt;                                                                                                                                            &lt;![endif]--><!--  /* Font Definitions */  @font-face 	{font-family:"Cambria Math"; 	panose-1:2 4 5 3 5 4 6 3 2 4; 	mso-font-charset:1; 	mso-generic-font-family:roman; 	mso-font-format:other; 	mso-font-pitch:variable; 	mso-font-signature:0 0 0 0 0 0;} @font-face 	{font-family:Calibri; 	panose-1:2 15 5 2 2 2 4 3 2 4; 	mso-font-charset:0; 	mso-generic-font-family:swiss; 	mso-font-pitch:variable; 	mso-font-signature:-1610611985 1073750139 0 0 159 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-parent:""; 	margin-top:0cm; 	margin-right:0cm; 	margin-bottom:10.0pt; 	margin-left:0cm; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:Calibri; 	mso-fareast-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-fareast-language:EN-US;} .MsoChpDefault 	{mso-style-type:export-only; 	mso-default-props:yes; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:Calibri; 	mso-fareast-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-fareast-language:EN-US;} .MsoPapDefault 	{mso-style-type:export-only; 	margin-bottom:10.0pt; 	line-height:115%;} @page Section1 	{size:612.0pt 792.0pt; 	margin:70.85pt 70.85pt 2.0cm 70.85pt; 	mso-header-margin:36.0pt; 	mso-footer-margin:36.0pt; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --><!--[if gte mso 10]&gt; &lt;!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:&quot;Normale Tabelle&quot;; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:&quot;&quot;; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin-top:0cm; 	mso-para-margin-right:0cm; 	mso-para-margin-bottom:10.0pt; 	mso-para-margin-left:0cm; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:&quot;Times New Roman&quot;; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin;} --> <!--[endif]--></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:green;"> this class defines where to get all the items used to make the web site work</span></span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:gray;">///</span><span style="color:green;"> This is where to define the storage of every item</span></span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:gray;">///</span><span style="color:green;"> </span><span style="color:gray;">&lt;/summary&gt;</span></span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">public</span> <span style="color:blue;">class</span> <span style="color:#2b91af;">MonContext</span></span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>{</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:gray;">///</span><span style="color:green;"> </span><span style="color:gray;">&lt;summary&gt;</span></span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:gray;">///</span><span style="color:green;"> Stored in the session</span></span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:gray;">///</span><span style="color:green;"> </span><span style="color:gray;">&lt;/summary&gt;</span></span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:gray;">///</span><span style="color:green;"> </span><span style="color:gray;">&lt;returns&gt;&lt;/returns&gt;</span></span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">public</span> <span style="color:blue;">static</span> <span style="color:#2b91af;">UserProvider</span> GetCurrentUser()</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>{</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:#2b91af;">StoringContainerProvider</span> container = <span style="color:#2b91af;">StoringContainerFactory</span>.GetInstance(<span style="color:#2b91af;">StoringContainerFactory</span>.<span style="color:#2b91af;">E_StoringContainerType</span>.Session);</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">if</span> (container.LoadObject(<span style="color:#a31515;">&laquo;&nbsp;User&nbsp;&raquo;</span>) == <span style="color:blue;">null</span>)</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>{</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:#2b91af;">UserProvider</span> user = <span style="color:blue;">new</span> <span style="color:#2b91af;">UserProvider</span>();</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>container.SaveObject(user, <span style="color:#a31515;">&laquo;&nbsp;user&nbsp;&raquo;</span>);</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span><span style="color:blue;">return</span> (<span style="color:#2b91af;">UserProvider</span>)container.LoadObject(<span style="color:#a31515;">&laquo;&nbsp;User&nbsp;&raquo;</span>);</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;" lang="EN-GB"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"> </span></p>
<p class="MsoNormal" style="margin-bottom:.0001pt;line-height:normal;"><span style="font-size:10pt;font-family:&quot;"><span> </span>}</span></p>
</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/yoannr.wordpress.com/115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/yoannr.wordpress.com/115/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/yoannr.wordpress.com/115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/yoannr.wordpress.com/115/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/yoannr.wordpress.com/115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/yoannr.wordpress.com/115/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/yoannr.wordpress.com/115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/yoannr.wordpress.com/115/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/yoannr.wordpress.com/115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/yoannr.wordpress.com/115/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/yoannr.wordpress.com/115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/yoannr.wordpress.com/115/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/yoannr.wordpress.com/115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/yoannr.wordpress.com/115/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yoannr.wordpress.com&amp;blog=6541953&amp;post=115&amp;subd=yoannr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://yoannr.wordpress.com/2009/08/19/des-container-pour-les-objets-transversaux-dans-une-applications-asp-net/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b70a8002f84b4100aba364db4b440efc?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Arthis</media:title>
		</media:content>
	</item>
	</channel>
</rss>
