<?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/"
	>

<channel>
	<title>Le blog de Hinault Romaric Donfack &#187; C#</title>
	<atom:link href="https://blog.developpez.com/lilroma/pcategory/net/c/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/lilroma</link>
	<description>Bienvenue sur ce blog. Vous y trouverez du .NET, du .NET...  encore du .NET, toujours du .NET et très peu de chose sur moi</description>
	<lastBuildDate>Sat, 27 Aug 2016 14:24:30 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Optimisation du temps de chargement d’une page ASP.NET MVC Part 2 : La mise en cache</title>
		<link>https://blog.developpez.com/lilroma/p11207/net/optimisation_du_temps_de_chargement_d_un</link>
		<comments>https://blog.developpez.com/lilroma/p11207/net/optimisation_du_temps_de_chargement_d_un#comments</comments>
		<pubDate>Wed, 08 Aug 2012 10:01:09 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP.NET MVC 3]]></category>
		<category><![CDATA[ASP.NET MVC 4]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Pour améliorer les performances de leur application, les développeurs ont couramment recours à l’optimisation côté client et côté serveur. L’optimisation d’une application Web regroupe l’ensemble des techniques qui peuvent aider à accélérer le temps de téléchargement d’une page Web. Parmi &#8230; <a href="https://blog.developpez.com/lilroma/p11207/net/optimisation_du_temps_de_chargement_d_un">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Pour améliorer les performances de leur application, les développeurs ont couramment recours à l’optimisation côté client et côté serveur. L’optimisation d’une application Web regroupe l’ensemble des techniques qui peuvent aider à accélérer le temps de téléchargement d’une page Web. Parmi ces techniques, on retrouve la minification et la compression du CSS et JavaScript, la mise en cache, l’utilisation des CDN, etc.</p>
<p>Ce billet est le second d’une série sur les techniques d’optimisation du temps de chargement d’une application ASP.NET MVC. Le premier article sur la compression et la minification du CSS et JavaScript peut être consulté sur <a href="http://blog.developpez.com/lilroma/p10462/net/asp-net/microsoft-web-optimisation-ou-comment-op/">cette page</a>.</p>
<p><span id="more-44"></span></p>
<p>Les requêtes des utilisateurs sur une page d’un site Web qu’il soit statistique ou dynamique engendre couramment le chargement de plusieurs éléments et de nombreuses opérations (chargement des images, CSS, JavaScript, données depuis une en base de données, etc.). Imaginez un intervalle de temps pendant lequel près de 100 requêtes sont effectuées sur votre site, et que durant cette période, le même contenu est retourné par votre application. Tout le long ce moment, votre application reprend 100 fois les mêmes opérations pour retourner un contenu identique.</p>
<p>La mis en cache est un procédé permettant d’améliorer considérablement le temps de chargement d’une page Web et économiser la bande passante, en évitant d’exécuter plusieurs fois certaines opérations (chargement des données, lecture d’une information dans la base de données, etc.) en stockant le contenu de cette page quelque part.</p>
<p><strong>Activer la mise en cache</strong></p>
<p>Le Framework ASP.NE MVC depuis la version 1 dispose d’un mécanisme pour la mise en a cache d’une application, qui repose essentiellement sur la même technique utilisée par ASP.NET. Il a été amélioré à partir de la version 3 pour coller avec les spécificités de la plateforme.</p>
<p>L’activation de la mise en cache se fait via l’attribut <strong>[OutputCache]</strong> qui peut être ajoutée soit individuellement à une action contrôleur, ou alors à une classe entière d&rsquo;un contrôleur</p>
<p>Le code ci-dessous permet de mettre en cache pendant 30 secondes la sortie de l’action Index.</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">[OutputCache(Duration = 30)] <span style="color: #008000">//mise en cache pour 30 secondes</span><br /><span style="color: #0000ff">public</span> ActionResult Index()<br />{<br />    ViewBag.Message = <span style="color: #006080">&quot;Cette page a été mise e cache à &quot;</span> + DateTime.Now;<br /><br />    <span style="color: #0000ff">return</span> View();<br />}<br /><br /></pre>
<p></div>
<p>Pour mettre en  cache une classe entière d’un contrôleur, il suffit de décorer la classe avec l’attribut OutputCache comme l’illustre le code ci-dessous :</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 400px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">[OutputCache(Duration = 30)] <span style="color: #008000">//mise en cache pour 30 secondes</span><br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> HomeController : Controller<br />    {<br />       <br />        <span style="color: #0000ff">public</span> ActionResult Index()<br />        {<br />            ViewBag.Message = <span style="color: #006080">&quot;Cette page a été mise e cache à &quot;</span> + DateTime.Now;<br /><br />            <span style="color: #0000ff">return</span> View();<br />        }<br /><br />        <span style="color: #0000ff">public</span> ActionResult About()<br />        {<br />            ViewBag.Message = <span style="color: #006080">&quot;Your app description page.&quot;</span>;<br /><br />            <span style="color: #0000ff">return</span> View();<br />        }<br />}<br /></pre>
<p></div>
<p>Si vous exécutez ce code, vous vous rendrez compte que la date et l’heure affichées ne vont pas varier chaque fois que vous allez actualiser la page, jusqu’à ce que les 30 secondes soient écoulées.</p>
<p>NB: Il faut noter que le temps de sauvegarde des données de la page n’est pas garanti. En cas de manque de ressources mémoires, le cache va commencer à vider automatiquement son contenu.</p>
<p><strong>Personnaliser la mise en cache</strong></p>
<p>En dehors de la propriété Duration qui permet de définir le temps de mise en cache, d’autres propriétés dont il est important de connaitre sont disponibles pour vous permettre de personnaliser la mise en cache des données de votre page selon votre convenance et les spécificités de la page.</p>
<p><strong>Location</strong></p>
<p>La propriété location permet de définir l’emplacement pour enregistrer l’objet mis en cache. Il est possible d’enregistre l’objet mis en  cache sur le serveur, le client, les deux ou toutes les autres options de l’enum <strong>OutputCacheLocation</strong>. Les différentes valeurs qu’elle peut prendre sont :</p>
<p>&#8211; Any<br />
&#8211; Client<br />
&#8211; Downstream<br />
&#8211; Server<br />
&#8211; None<br />
&#8211; ServerAndClient </p>
<p>Par défaut, la valeur Any est utilisée lorsque cette propriété n’est pas spécifiée. L’orientation vers la mise en cache côté client, côté serveur ou les deux doit se faire suivant vos besoins. Si vous souhaitez afficher par exemple des informations personnalisées à l’utilisation comme son heure de connexion, son login, ses statistiques, etc. vous devez utiliser dans ce cas la mise en cache côté client.</p>
<p>Le code ci-dessous permet de mettre en cache la méthode d’action Index uniquement chez le client.</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">[OutputCache(Duration = 10, Location = OutputCacheLocation.Client)]<br /> <span style="color: #0000ff">public</span> ActionResult Index()<br /> {<br />     ViewBag.Message = <span style="color: #006080">&quot;Cette page a été mise en cache à &quot;</span> + DateTime.Now;<br /><br />     <span style="color: #0000ff">return</span> View();<br /> }<br /></pre>
<p></div>
<p><strong>VaryByParam</strong></p>
<p>Supposons un instant que vous voulez afficher les détails sur un produit à partir de son identifiant. Cela suppose qu’à chaque fois que l’identifiant du produit va changer, les détails affichés doivent également changer. Comment modifier la mise en cache pour que le contenu change automatiquement lorsque l’ID change. C’est à ce stade qu’intervient la propriété VaryByParam.  Cette propriété permet de créer différentes versions d&rsquo;un même contenu, dès que l&rsquo;un des paramètres du formulaire ou de l&rsquo;URL change. </p>
<p>Le code ci-dessous illustre comment vous pouvez l’utiliser.</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">[OutputCache(Duration = 3600, VaryByParam=<span style="color: #006080;">"id"</span>)]<br />        <span style="color: #0000ff;">public</span> ViewResult Details(<span style="color: #0000ff;">short</span> id)<br />        {<br />            Articles article = db.Articles.Find(id);<br />            <span style="color: #0000ff;">return</span> View(article);<br />        }</pre>
<p></div>
<p>En procédant ainsi, plusieurs versions du contenu de la méthode d’action sont mises en cache jusqu’à expiration de la période de mise en cache.</p>
<p><strong>Créer un profil de cache dans le Web.Config</strong></p>
<p>Le fichier de configuration de votre application peut être utilisé pour créer un profil un cache. L’utilisation de cette technique présente plusieurs avantages :</p>
<p>&#8211; vous pouvez créer un profil de cache et appliquer celui-ci à plusieurs actions ou contrôleurs.</p>
<p>&#8211; vous pouvez modifier le comportement de votre profil de cache dans le Web.config sans avoir besoin de recompiler votre application.</p>
<p>Par exemple, la section de configuration Web « caching » définit un profil de cache nommé MyCacheProfil. Cette section « caching » doit apparaître dans la section « system.web » du fichier Web.Config.</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">&lt;system.web&gt;<br />    &lt;caching&gt;<br />      &lt;outputCacheSettings&gt;<br />        &lt;outputCacheProfiles&gt;<br />          &lt;add name=<span style="color: #006080;">"MyCacheProfile"</span>  duration=<span style="color: #006080;">"60"</span> /&gt;<br />        &lt;/outputCacheProfiles&gt;<br />      &lt;/outputCacheSettings&gt;<br />    &lt;/caching&gt;<br />  &lt;/system.web&gt;</pre>
<p></div>
<p>Le contrôleur suivant illustre comment appliquer le profil MyCacheProfile sur une action contrôleur à l&rsquo;aide de l&rsquo;attribut [OutputCache].</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">[OutputCache(CacheProfile=<span style="color: #006080;">"MyCacheProfile"</span>)]<br />        <span style="color: #0000ff;">public</span> ActionResult Index()<br />        {<br />            ViewBag.Message = <span style="color: #006080;">"Cette page a été mise en cache à "</span> + DateTime.Now;<br /><br />            <span style="color: #0000ff;">return</span> View();<br />        }</pre>
<p></div>
<p>Le cache de sortie fournir un moyen simple pour améliorer radicalement les performances de vos applications ASP.Net MVC. Au travers de cet article, vous avez découvert comment vous pouvez utiliser cette technique. Restez connecté à mon blog pour la suite des astuces sur l’optimisation du temps de chargement d’une page Web.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP.NET MVC et Entity Framework : résoudre l’erreur  System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types</title>
		<link>https://blog.developpez.com/lilroma/p11148/net/asp_net_mvc_et_entity_framework_resoudre</link>
		<comments>https://blog.developpez.com/lilroma/p11148/net/asp_net_mvc_et_entity_framework_resoudre#comments</comments>
		<pubDate>Fri, 13 Jul 2012 10:22:03 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP.NET MVC 3]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Entity Framework]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Lors du déploiement de mon application ASP.NET MVC 3 chez un client, j’ai eu l’erreur « System.Reflection.ReflectionTypeLoadException » pendant l’exécution de celle-ci. Pourtant, l’application fonctionnait correctement sur ma machine de développement. En dehors d’un foutu message “Unable to load one &#8230; <a href="https://blog.developpez.com/lilroma/p11148/net/asp_net_mvc_et_entity_framework_resoudre">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Lors du déploiement de mon application ASP.NET MVC 3 chez un client, j’ai eu l’erreur « System.Reflection.ReflectionTypeLoadException » pendant l’exécution de celle-ci. Pourtant, l’application fonctionnait correctement sur ma machine de développement.</p>
<p>En dehors d’un foutu message “Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information”, rien ne permet d’identifier clairement la source de cette erreur.</p>
<p><span id="more-43"></span></p>
<p>Après plusieurs recherches, il semblerait que l’erreur soit générée par Entity Framework. En effet, lorsque vous utilisez Entity Framework, celui-ci est configuré par défaut pour charger tous les types des assemblys référencées, afin d’identifier les différents types des entités pour votre modèle objet.  Si l’un des types ne peut être chargé, alors Entity Framework va générer cette erreur.</p>
<p>Il existe plusieurs solutions pour fixer ce problème :</p>
<p>&#8211; vous pouvez marquer la copie locale de toutes les assemblys référencées dans votre application à True ;</p>
<p>&#8211; dans une autre mesure, il suffit de supprimer toutes les DLL dans le dossier bin et procéder à une nouvelle génération de votre application.</p>
<p>&#8211; il est également possible que les bibliothèques System.Data.Entity et System.Web.Entity soient corrompues.  Pour mon cas par exemple, lors du déploiement de mon application, après investigation, je me suis rendu compte que les fichiers System.Data.Entity.dll et System.Web.Entity.dll avaient respectivement pour tailles 1640 Ko et 63 ko, pourtant dans le framework .NET, ces fichiers avaient pour tailles 4360 Ko et 135 Ko. En les remplaçant simplement avant le déploiement de l’application, cela a résolu ce bug.</p>
<p>Mais, le véritable problème ici, c’est d’identifier réellement l’assemblys qui pose problème. Pour cela, vous  pouvez simplement utiliser le code suivant :</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 600px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">try</span><br />{<br />    <span style="color: #008000">//Le code qui pose problème.</span><br />}<br /><span style="color: #0000ff">catch</span> (ReflectionTypeLoadException ex)<br />{<br />    StringBuilder sb = <span style="color: #0000ff">new</span> StringBuilder();<br />    <span style="color: #0000ff">foreach</span> (Exception exSub <span style="color: #0000ff">in</span> ex.LoaderExceptions)<br />    {<br />        sb.AppendLine(exSub.Message);<br />        <span style="color: #0000ff">if</span> (exSub <span style="color: #0000ff">is</span> FileNotFoundException)<br />        {<br />            FileNotFoundException exFileNotFound = exSub <span style="color: #0000ff">as</span> FileNotFoundException;<br />            <span style="color: #0000ff">if</span>(!<span style="color: #0000ff">string</span>.IsNullOrEmpty(exFileNotFound.FusionLog))<br />            {<br />                sb.AppendLine(<span style="color: #006080">&quot;Fusion Log:&quot;</span>);<br />                sb.AppendLine(exFileNotFound.FusionLog);<br />            }<br />        }<br />        sb.AppendLine();<br />    }<br />    <span style="color: #0000ff">string</span> errorMessage = sb.ToString();<br />   }<br /></pre>
<p></div>
<p>N’oubliez pas d’ajouter une référence à System.IO et System.Reflection;</p>
<p>Et voilà. Dorénavant, lorsque vous allez exécuter votre application et qu’il y’aura un problème avec le chargement d’un composant, vous aurez un message clair et les détails sur l’assembly qui pose problème.</p>
<p>À noter que ce bug n’existe plus lorsque l’on utilise Entity Framework avec le framework .NET 4.5, il ne scanne plus toutes les assemblys de l’application lors de son exécution.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Création d’une application CRUD avec WebMatrix, Razor et Entity Framework Part 5 : implémentation des fonctionnalités CRUD, cas d&#8217;une table associative</title>
		<link>https://blog.developpez.com/lilroma/p10993/net/creation_d_une_application_crud_avec_web_4</link>
		<comments>https://blog.developpez.com/lilroma/p10993/net/creation_d_une_application_crud_avec_web_4#comments</comments>
		<pubDate>Sat, 28 Apr 2012 11:25:30 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[RAZOR]]></category>
		<category><![CDATA[WebMatrix]]></category>
		<category><![CDATA[WebPages]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Ce tutoriel à pour objectif de fournir une démarche pas à pas pour la création d&#8217;une application CRUD avec WebMatrix, Razor et Entity Framework. &#8211; Part 1 : introduction et présentation des outils &#8211; Part 2 : création de l&#8217;application &#8230; <a href="https://blog.developpez.com/lilroma/p10993/net/creation_d_une_application_crud_avec_web_4">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Ce tutoriel à pour objectif de fournir une démarche pas à pas pour la création d&rsquo;une application CRUD avec WebMatrix, Razor et Entity Framework.</p>
<p>&#8211; Part 1 : <a href="http://blog.developpez.com/lilroma/p10870/">introduction et présentation des outils</a></p>
<p>&#8211; Part 2 : <a href="http://blog.developpez.com/lilroma/p10876/">création de l&rsquo;application et définition du modèle objet</a></p>
<p>&#8211; Part 3 : <a href="http://blog.developpez.com/lilroma/p10896/">création du DBContex et du Repository</a></p>
<p>&#8211; Part 4 : <a href="http://blog.developpez.com/lilroma/p10980/">implémentation des fonctionnalités CRUD</a></p>
<p>Dans cette cinquième et dernière partie de notre tutoriel sur la création d&rsquo;une application CRUD avec WebMatrix, Razor et Entity Framework, nous verrons comment implémenter les interfaces Web pour la lecture, la modification, la suppression et l&rsquo;enregistrement des données pour une table associative.</p>
<p><span id="more-57"></span></p>
<p>La table Affiliations étant une table association, quelques modifications seront donc nécessaires au code utilisé pour Personne et Organisme.</p>
<p><strong>1 &#8211; Implémentation de la grille</strong></p>
<p>Dans le dossier Affiliations, ajoutez un nouveau fichier Index.cshtml.</p>
<p>Dans ce fichier, ajoutez les lignes de code suivantes, qui vont permettre d&rsquo;afficher dans cette page la liste des affiliations qui ont été enregistrées dans la base de données :</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 1200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">@{<br />    <span style="color: #008000">/// Définition du layout et du titre de la page</span><br />    Layout = <span style="color: #006080">&quot;~/_SiteLayout.cshtml&quot;</span>;<br />    Page.Title = <span style="color: #006080">&quot;Gestion des organismes&quot;</span>;<br />    <span style="color: #008000">//déclaration des variables</span><br />    var af = <span style="color: #0000ff">new</span> AffiliationRepository();<br />   <span style="color: #008000">//déclaration de la grille</span><br />    var grid = <span style="color: #0000ff">new</span> WebGrid(af.GetAll(),rowsPerPage : 10);<br />                  <br />}    <br />&lt;hgroup <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;title&quot;</span>&gt;<br />    &lt;h1&gt;Affiliations.&lt;/h1&gt;<br />&lt;/hgroup&gt;  <br /><br />&lt;p&gt;&lt;a href=<span style="color: #006080">&quot;Create&quot;</span>&gt;Ajouter un nouvel enregistrement&lt;/a&gt;&lt;/p&gt;<br />    @* formatage et affichage de la grille *@<br />        @grid.GetHtml(tableStyle:<span style="color: #006080">&quot;grid&quot;</span>,<br />        headerStyle:<span style="color: #006080">&quot;head&quot;</span>,<br />        alternatingRowStyle: <span style="color: #006080">&quot;altrow&quot;</span>,<br />            columns: grid.Columns(<br />                grid.Column(<span style="color: #006080">&quot;Personne.Nom&quot;</span>,<span style="color: #006080">&quot;Employé&quot;</span>),<br />                grid.Column(<span style="color: #006080">&quot;Organisme.Nom&quot;</span>,<span style="color: #006080">&quot;Organisme&quot;</span>),<br />                grid.Column(<span style="color: #006080">&quot;Fonction&quot;</span>, <span style="color: #006080">&quot;Fonction&quot;</span>),<br />                grid.Column(<span style="color: #006080">&quot;Telephone&quot;</span>, <span style="color: #006080">&quot;Téléphone&quot;</span>),<br /><br />                grid.Column(<span style="color: #006080">&quot;&quot;</span>, <span style="color: #006080">&quot;&quot;</span>, format: @&lt;text&gt;&lt;a href=<span style="color: #006080">&quot;Edit?organismeId=@item.OrganismeId&amp;personneId=@item.PersonneId&quot;</span>)&gt;Editer&lt;/a&gt;<br />                        | &lt;a href=<span style="color: #006080">&quot;Details?organismeId=@item.OrganismeId&amp;personneId=@item.PersonneId&quot;</span>)&gt;Détails&lt;/a&gt;<br />                        | &lt;a href=<span style="color: #006080">&quot;Delete?organismeId=@item.OrganismeId&amp;personneId=@item.PersonneId&quot;</span>)&gt;Supprimer&lt;/a&gt;&lt;/text&gt;)<br />                    )<br />        <br />        )</pre>
<p></div>
<p>Vous remarquez certainement pour les colonnes Employé et Organisme, l&rsquo;affichage des propriétés Personne.Nom et Organisme.Nom. En effet, lors de la définition de l&rsquo;entité Affiliation, vous avez défini les classes Personne et Organisme comme propriétés de l&rsquo;entité. Cela permet à Entity Framework de charger automatiquement dans ces propriétés les données correspondantes aux clés étrangères dans la table Affiliations.</p>
<p>A l&rsquo;exécution de cette page, vous obtenez le résultat suivant :</p>
<p><img src="http://rdonfack.developpez.com/tutoriels/dotnet/webmatrix-application-crud-entity-framework/images/listeaffiliations.png" alt="" title="" /></p>
<p><strong>2 &#8211; Affichage détaillé</strong></p>
<p>Dans la page précédente, certaines informations comme l&rsquo;adresse email n&rsquo;ont pas été affichées dans la grille. Pour visualiser ces données, une page d&rsquo;affichage détaillé doit être ajoutée à l&rsquo;application.</p>
<p>Pour ajouter cette page, faites un clic droit sur le dossier Affiliation, sélectionnez l&rsquo;option New File et créez un nouveau fichier Detail.cshtml.</p>
<p>Dans ce fichier, vous allez ajouter les lignes de code suivantes :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 1200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">@{<br />    <br />    Layout = <span style="color: #006080;">"~/_SiteLayout.cshtml"</span>;<br />    Page.Title = <span style="color: #006080;">"Détails"</span>;<br />   <span style="color: #008000;">//Recupération des Id</span><br />    <span style="color: #0000ff;">int</span> personneId = Request[<span style="color: #006080;">"personneId"</span>].AsInt();<br />    <span style="color: #0000ff;">int</span> organismeId = Request[<span style="color: #006080;">"organismeId"</span>].AsInt();<br />    <span style="color: #008000;">//Déclaration des variables</span><br />    var af = <span style="color: #0000ff;">new</span> AffiliationRepository();<br />    var affiliation = <span style="color: #0000ff;">new</span> Affiliation();<br />    <span style="color: #008000;">//Selection de l'élément correspondant aux Id</span><br />   affiliation = af.Find(personneId, organismeId);<br />                  <br />}    <br />&lt;hgroup <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"title"</span>&gt;<br />    &lt;h1&gt;Détails.&lt;/h1&gt;<br />&lt;/hgroup&gt;  <br /> &lt;fieldset&gt;<br />        &lt;legend&gt;&lt;/legend&gt;<br />        &lt;ol&gt;<br />            &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"employe"</span>&gt;<br />                &lt;label&gt;Employé:&lt;/label&gt;<br />                &lt;label&gt;@affiliation.Personne.Prenom @affiliation.Personne.Nom&lt;/label&gt;<br />            &lt;/li&gt;<br />            <br />            &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"organisme"</span>&gt;<br />                &lt;label&gt;Organisme:&lt;/label&gt;<br />                &lt;label&gt;@affiliation.Organisme.Nom&lt;/label&gt;<br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"fonction"</span>&gt;<br />                &lt;label&gt;Fonction:&lt;/label&gt;<br />                &lt;label&gt;@affiliation.Fonction&lt;/label&gt;<br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"email"</span>&gt;<br />                &lt;label&gt;Adresse mail:&lt;/label&gt;<br />                &lt;label&gt;@affiliation.Email&lt;/label&gt;<br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"telephone"</span>&gt;<br />                &lt;label&gt;Téléphone:&lt;/label&gt;<br />                &lt;label&gt;@affiliation.Telephone&lt;/label&gt;<br />            &lt;/li&gt;<br />        &lt;/ol&gt; <br />    &lt;/fieldset&gt;<br /><br />&lt;p&gt;&lt;a href=<span style="color: #006080;">"Edit?organismeId=@affiliation.OrganismeId&amp;personneId=@affiliation.PersonneId"</span>&gt;Editer&lt;/a&gt; |<br /> &lt;a href=<span style="color: #006080;">"Index"</span>&gt;Retour à la liste&lt;/a&gt;<br />&lt;/p&gt;</pre>
<p></div>
<p>A l&rsquo;exécution, vous obtiendrez le résultat suivant :</p>
<p><img src="http://rdonfack.developpez.com/tutoriels/dotnet/webmatrix-application-crud-entity-framework/images/detailsaffiliations.png" alt="" title="" /></p>
<p><strong>3 &#8211; Enregistrement</strong></p>
<p>Compte tenu du fait que Affiliations est une table association, vous allez dans un premier temps charger dans des listes déroulantes les noms des personnes et des organismes.</p>
<p>Pour cela, dans le fichier Create.cshtml que vous avez ajouté au dossier Affiliation, vous allez insérer les lignes de code suivantes :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"><br />    var pr = <span style="color: #0000ff;">new</span> PersonneRepository();<br />    var og = <span style="color: #0000ff;">new</span> OrganismeRepository();<br />   <br />    var personnes = <span style="color: #0000ff;">new</span> List&lt;Personne&gt;();<br />    var organismes = <span style="color: #0000ff;">new</span> List&lt;Organisme&gt;();<br /><br />    personnes = pr.GetAll();<br />    organismes = og.GetAll();</pre>
<p></div>
<p>Une boucle foreach sera utilisée pour charger les données dans une liste déroulante HTML. Le code pour effectuer cela est le suivant :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">&lt;select id=<span style="color: #006080;">"personneId"</span> name=<span style="color: #006080;">"personneId"</span>&gt;<br />                    @<span style="color: #0000ff;">foreach</span>(var p <span style="color: #0000ff;">in</span> personnes){<br />                    &lt;option <span style="color: #0000ff;">value</span>=<span style="color: #006080;">"@p.PersonneId"</span>&gt;@p.Nom&lt;/option&gt;<br />                    }<br />                &lt;/select&gt;</pre>
<p></div>
<p>En plus de la validation des champs, une vérification doit être effectuée pour éviter les contraintes de validation des clés. Le code pour cela est le suivant :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"><span style="color: #0000ff;">if</span> (db.Affiliations.Find(personneId, organismeId) != <span style="color: #0000ff;">null</span>)<br />            { <br />                <br />                <span style="color: #008000;">//Ajout d'un message d'erreur si les Id existent déjà dans la table affiliations</span><br />                 ModelState.AddError(<span style="color: #006080;">"personneId"</span>,<span style="color: #006080;">"Cet enregistrement existe déjà dans la base de données"</span>);<br />            }</pre>
<p></div>
<p>Le code complet de la page Create.cshtml est le suivant :</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 2200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">@{<br />   <span style="color: #008000">// Définition du layout et du titre de la page</span><br />    Layout = <span style="color: #006080">&quot;~/_SiteLayout.cshtml&quot;</span>;<br />    Page.Title = <span style="color: #006080">&quot;Enregistrement d'un organisme&quot;</span>;<br /><br />    <span style="color: #008000">// initialisation des variables</span><br />    var fonction = <span style="color: #006080">&quot;&quot;</span>;<br />    var email = <span style="color: #006080">&quot;&quot;</span>;<br />    var telephone = <span style="color: #006080">&quot;&quot;</span>;<br />    <span style="color: #008000">//Lecture des données sur les personnes et les organismes</span><br />    var pr = <span style="color: #0000ff">new</span> PersonneRepository();<br />    var og = <span style="color: #0000ff">new</span> OrganismeRepository();<br />    var af = <span style="color: #0000ff">new</span> AffiliationRepository();<br /><br />   <br />    var personnes = <span style="color: #0000ff">new</span> List&lt;Personne&gt;();<br />    var organismes = <span style="color: #0000ff">new</span> List&lt;Organisme&gt;();<br /><br />    personnes = pr.GetAll();<br />    organismes = og.GetAll(); <br /><br /><br />     <span style="color: #008000">// Ajout des scripts de validation</span><br />    Scripts.Add(<span style="color: #006080">&quot;~/Scripts/jquery-1.6.2.min.js&quot;</span>);<br />    Scripts.Add(<span style="color: #006080">&quot;~/Scripts/jquery.validate.min.js&quot;</span>);<br />    Scripts.Add(<span style="color: #006080">&quot;~/Scripts/jquery.validate.unobtrusive.min.js&quot;</span>);<br /><br />    <span style="color: #008000">// Validation de la fonction</span><br />    Validation.RequireField(<span style="color: #006080">&quot;fonction&quot;</span>, <span style="color: #006080">&quot;La fonction est obligatoire.&quot;</span>);<br />    <br />   <br />    <span style="color: #0000ff">if</span> (IsPost) {<br />        <span style="color: #0000ff">int</span> personneId = Request.Form[<span style="color: #006080">&quot;personneId&quot;</span>].AsInt();<br />        <span style="color: #0000ff">int</span> organismeId = Request.Form[<span style="color: #006080">&quot;organismeId&quot;</span>].AsInt();<br />        fonction = Request.Form[<span style="color: #006080">&quot;fonction&quot;</span>];<br />        email = Request.Form[<span style="color: #006080">&quot;email&quot;</span>];<br />        telephone = Request.Form[<span style="color: #006080">&quot;telephone&quot;</span>];<br />        <br />        <span style="color: #0000ff">if</span> (af.Find(personneId, organismeId) != <span style="color: #0000ff">null</span>)<br />            { <br />                <br />                <span style="color: #008000">//Ajout d'un message d'erreur si les Id exitent déjà dans la table affiliations</span><br />                 ModelState.AddError(<span style="color: #006080">&quot;personneId&quot;</span>,<span style="color: #006080">&quot;Cet enregistrement existe déjà dans la base de données&quot;</span>);<br />            }<br />  <br />        <br />        <span style="color: #0000ff">if</span> (Validation.IsValid()) { <br />              <br />            <span style="color: #0000ff">if</span>(ModelState.IsValid) {   <br />                 var affiliation = <span style="color: #0000ff">new</span> Affiliation{<br />                PersonneId = personneId, OrganismeId = organismeId, Fonction = fonction, Email = email, Telephone = telephone };<br />           <br />                 af.Add(affiliation);<br />   <br />                 Response.Redirect(<span style="color: #006080">&quot;Index&quot;</span>);<br />             }<br />             }<br /><br />    };<br />   <br />                  <br />        }    <br />   <br /><br />&lt;hgroup <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;title&quot;</span>&gt;<br />    &lt;h2&gt;Enregistrement d<span style="color: #006080">'une affiliation&lt;/h2&gt;<br />&lt;/hgroup&gt;<br /><br />&lt;form method=&quot;post&quot; action=&quot;&quot;&gt;<br />    @* Notification en cas d'</span>erreur de validation *@<br />    @Html.ValidationSummary(<span style="color: #006080">&quot;Veuillez corriger les erreurs suivantes:&quot;</span>)<br /><br />    &lt;fieldset&gt;<br />        &lt;legend&gt;Formlaire &lt;/legend&gt;<br />        &lt;ol&gt;<br />            &lt;li <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;personneId&quot;</span>&gt;<br />                &lt;label <span style="color: #0000ff">for</span>=<span style="color: #006080">&quot;personneId&quot;</span> &gt;Employé:&lt;/label&gt;<br />                &lt;select id=<span style="color: #006080">&quot;personneId&quot;</span> name=<span style="color: #006080">&quot;personneId&quot;</span>&gt;<br />                    @<span style="color: #0000ff">foreach</span>(var p <span style="color: #0000ff">in</span> personnes){<br />                    &lt;option <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;@p.PersonneId&quot;</span>&gt;@p.Nom&lt;/option&gt;<br />                    }<br />                &lt;/select&gt;<br />            &lt;/li&gt;<br />            <br />             &lt;li <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;organismeId&quot;</span>&gt;<br />                &lt;label <span style="color: #0000ff">for</span>=<span style="color: #006080">&quot;organismeId&quot;</span> &gt;Organisme:&lt;/label&gt;<br />                &lt;select id=<span style="color: #006080">&quot;organismeId&quot;</span> name=<span style="color: #006080">&quot;organismeId&quot;</span>&gt;<br />                    @<span style="color: #0000ff">foreach</span>(var o <span style="color: #0000ff">in</span> organismes){<br />                    &lt;option <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;@o.OrganismeId&quot;</span>&gt;@o.Nom&lt;/option&gt;<br />                    }<br />                &lt;/select&gt;<br />            &lt;/li&gt;<br />            <br />            &lt;li <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;fonction&quot;</span>&gt;<br />                &lt;label <span style="color: #0000ff">for</span>=<span style="color: #006080">&quot;fonction&quot;</span> @<span style="color: #0000ff">if</span>(!ModelState.IsValidField(<span style="color: #006080">&quot;fonction&quot;</span>)){&lt;text&gt;<span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;error-label&quot;</span>&lt;/text&gt;}&gt;Fonction:&lt;/label&gt;<br />                &lt;input type=<span style="color: #006080">&quot;text&quot;</span> id=<span style="color: #006080">&quot;fonction&quot;</span> name=<span style="color: #006080">&quot;fonction&quot;</span> title=<span style="color: #006080">&quot;Fonction&quot;</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;@fonction&quot;</span> @Validation.GetHtml(<span style="color: #006080">&quot;fonction&quot;</span>) /&gt;<br />                @Html.ValidationMessage(<span style="color: #006080">&quot;fonction&quot;</span>)<br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;email&quot;</span>&gt;<br />                &lt;label <span style="color: #0000ff">for</span>=<span style="color: #006080">&quot;email&quot;</span>&gt;Adresse mail:&lt;/label&gt;<br />                &lt;input type=<span style="color: #006080">&quot;text&quot;</span> id=<span style="color: #006080">&quot;email&quot;</span> name=<span style="color: #006080">&quot;email&quot;</span> title=<span style="color: #006080">&quot;Email&quot;</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;@email&quot;</span> /&gt;<br />             <br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;telephone&quot;</span>&gt;<br />                &lt;label <span style="color: #0000ff">for</span>=<span style="color: #006080">&quot;telephone&quot;</span>&gt;Numéro de téléphone:&lt;/label&gt;<br />                &lt;input type=<span style="color: #006080">&quot;text&quot;</span> id=<span style="color: #006080">&quot;telephone&quot;</span> name=<span style="color: #006080">&quot;telephone&quot;</span> title=<span style="color: #006080">&quot;Téléphone&quot;</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;@telephone&quot;</span> /&gt;<br />                <br />            &lt;/li&gt;<br />        &lt;/ol&gt;<br />        &lt;input type=<span style="color: #006080">&quot;submit&quot;</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;Enregistrer&quot;</span> title=<span style="color: #006080">&quot;Enregistrer&quot;</span> /&gt;<br />        <br />    &lt;/fieldset&gt;<br />&lt;/form&gt;<br />&lt;a href=<span style="color: #006080">&quot;Index&quot;</span>&gt;Retour à la liste&lt;/a&gt;</pre>
<p></div>
<p>A l&rsquo;exécution, vous obtenez le résultat suivant :</p>
<p><img src="http://rdonfack.developpez.com/tutoriels/dotnet/webmatrix-application-crud-entity-framework/images/enregaffiliation.png" alt="" title="" /></p>
<p><strong>4 &#8211; Modification</strong></p>
<p>Penchons-nous maintenant sur la page permettant de modifier les informations d&rsquo;une affiliation. Une nouvelle page Edit.cshtml doit être ajoutée dans le dossier Affiliation.</p>
<p>Dans cette page, vous allez dans un premier temps écrire le code permettant de retourner les informations sur la ligne qui doit être modifiée :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"><span style="color: #0000ff;">int</span> personneId = Request[<span style="color: #006080;">"personneId"</span>].AsInt();<br />   <span style="color: #0000ff;">int</span> organismeId = Request[<span style="color: #006080;">"organismeId"</span>].AsInt();<br /><br />   <span style="color: #008000;">// initialisation des variables</span><br />   var af = <span style="color: #0000ff;">new</span> AffiliationRepository();<br />   var affiliation = <span style="color: #0000ff;">new</span> Affiliation();<br />   affiliation = af.Find(personneId, organismeId);<br /><br />   var fonction = affiliation.Fonction;<br />   var email = affiliation.Email;<br />   var telephone = affiliation.Telephone;</pre>
<p></div>
<p>Le code permettant de prendre en compte les modifications dans la base de données avec Entity Framework est le suivant :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">affiliation.Fonction = fonction;<br />affiliation.Email = email;<br />affiliation.Telephone = telephone;<br /><span style="color: #008000;">//Modification de l'affiliation</span><br />af.Update(affiliation);</pre>
<p></div>
<p>Le code complet pour cette page est le suivant :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 2200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">@<span style="color: #0000ff;">using</span> System.Data<br />@{<br />    <span style="color: #008000;">// Définition du layout et du titre de la page</span><br />    Layout = <span style="color: #006080;">"~/_SiteLayout.cshtml"</span>;<br />    Page.Title = <span style="color: #006080;">"Modification"</span>;<br /><br />   <br />    <span style="color: #0000ff;">int</span> personneId = Request[<span style="color: #006080;">"personneId"</span>].AsInt();<br />    <span style="color: #0000ff;">int</span> organismeId = Request[<span style="color: #006080;">"organismeId"</span>].AsInt();<br /><br />    <span style="color: #008000;">// initialisation des variables</span><br />    var af = <span style="color: #0000ff;">new</span> AffiliationRepository();<br />    var affiliation = <span style="color: #0000ff;">new</span> Affiliation();<br /><br />    affiliation = af.Find(personneId, organismeId);<br /><br />    var fonction = affiliation.Fonction;<br />    var email = affiliation.Email;<br />    var telephone = affiliation.Telephone;<br />   <br />    <span style="color: #008000;">// Ajout des scripts de validation</span><br />    Scripts.Add(<span style="color: #006080;">"~/Scripts/jquery-1.6.2.min.js"</span>);<br />    Scripts.Add(<span style="color: #006080;">"~/Scripts/jquery.validate.min.js"</span>);<br />    Scripts.Add(<span style="color: #006080;">"~/Scripts/jquery.validate.unobtrusive.min.js"</span>);<br /><br />     <span style="color: #008000;">// Validation de la fonction</span><br />    Validation.RequireField(<span style="color: #006080;">"fonction"</span>, <span style="color: #006080;">"La fonction est obligatoire."</span>);<br />   <br /><br />    <span style="color: #0000ff;">if</span> (IsPost) {<br />        fonction = Request.Form[<span style="color: #006080;">"fonction"</span>];<br />        email = Request.Form[<span style="color: #006080;">"email"</span>];<br />        telephone = Request.Form[<span style="color: #006080;">"telephone"</span>];<br />        <br />          <span style="color: #0000ff;">if</span> (Validation.IsValid()) { <br />                <br />                 affiliation.Fonction = fonction;<br />                 affiliation.Email = email;<br />                 affiliation.Telephone = telephone;<br />                 <span style="color: #008000;">//Modification de l'affiliation</span><br />                 af.Update(affiliation);<br /><br />                 Response.Redirect(<span style="color: #006080;">"Index"</span>);<br />                <br />             }<br />    };<br />   <br />                  <br />        }    <br />   <br /><br />&lt;hgroup <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"title"</span>&gt;<br />    &lt;h2&gt;Modification.&lt;/h2&gt;<br />&lt;/hgroup&gt;<br /><br />&lt;form method=<span style="color: #006080;">"post"</span> action=<span style="color: #006080;">""</span>&gt;<br />     @* Notification en cas d'erreur de validation *@<br />    @Html.ValidationSummary(<span style="color: #006080;">"Veuillez corriger les erreurs suivantes:"</span>)<br /><br />    &lt;fieldset&gt;<br />        &lt;legend&gt;&lt;/legend&gt;<br />        &lt;ol&gt;<br />             &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"employe"</span>&gt;<br />                &lt;label&gt;Employé:&lt;/label&gt;<br />                &lt;label&gt;@affiliation.Personne.Prenom @affiliation.Personne.Nom&lt;/label&gt;<br />            &lt;/li&gt;<br />            <br />            &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"organisme"</span>&gt;<br />                &lt;label&gt;Organisme:&lt;/label&gt;<br />                &lt;label&gt;@affiliation.Organisme.Nom&lt;/label&gt;<br />            &lt;/li&gt;<br />            <br />            &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"fonction"</span>&gt;<br />                &lt;label <span style="color: #0000ff;">for</span>=<span style="color: #006080;">"fonction"</span> @<span style="color: #0000ff;">if</span>(!ModelState.IsValidField(<span style="color: #006080;">"fonction"</span>)){&lt;text&gt;<span style="color: #0000ff;">class</span>=<span style="color: #006080;">"error-label"</span>&lt;/text&gt;}&gt;Fonction:&lt;/label&gt;<br />                &lt;input type=<span style="color: #006080;">"text"</span> id=<span style="color: #006080;">"fonction"</span> name=<span style="color: #006080;">"fonction"</span> title=<span style="color: #006080;">"Fonction"</span> <span style="color: #0000ff;">value</span>=<span style="color: #006080;">"@fonction"</span> @Validation.GetHtml(<span style="color: #006080;">"fonction"</span>) /&gt;<br />                @* Write any email validation errors to the page *@<br />                @Html.ValidationMessage(<span style="color: #006080;">"fonction"</span>)<br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"email"</span>&gt;<br />                &lt;label <span style="color: #0000ff;">for</span>=<span style="color: #006080;">"email"</span>&gt;Adresse mail:&lt;/label&gt;<br />                &lt;input type=<span style="color: #006080;">"text"</span> id=<span style="color: #006080;">"email"</span> name=<span style="color: #006080;">"email"</span> title=<span style="color: #006080;">"Email"</span> <span style="color: #0000ff;">value</span>=<span style="color: #006080;">"@email"</span> /&gt;<br />             <br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"telephone"</span>&gt;<br />                &lt;label <span style="color: #0000ff;">for</span>=<span style="color: #006080;">"telephone"</span>&gt;Numéro de téléphone:&lt;/label&gt;<br />                &lt;input type=<span style="color: #006080;">"text"</span> id=<span style="color: #006080;">"telephone"</span> name=<span style="color: #006080;">"telephone"</span> title=<span style="color: #006080;">"Téléphone"</span> <span style="color: #0000ff;">value</span>=<span style="color: #006080;">"@telephone"</span> /&gt;<br />                <br />            &lt;/li&gt;<br />        &lt;/ol&gt;<br />        &lt;input type=<span style="color: #006080;">"submit"</span> <span style="color: #0000ff;">value</span>=<span style="color: #006080;">"Modifier"</span> title=<span style="color: #006080;">"Edit"</span> /&gt;<br />        <br />    &lt;/fieldset&gt;<br />&lt;/form&gt;<br />&lt;a href=<span style="color: #006080;">"Index"</span>&gt;Retour à la liste&lt;/a&gt;<br /></pre>
<p></div>
<p>qui produit le résultat suivant à l&rsquo;exécution :</p>
<p><img src="http://rdonfack.developpez.com/tutoriels/dotnet/webmatrix-application-crud-entity-framework/images/modifaffiliation.png" alt="" title="" /></p>
<p><strong>5 &#8211; Suppression</strong></p>
<p>Enfin, pour finir avec cette table, vous allez créer la page Delete.cshtml dans le dossier Affiliation.</p>
<p>Le code source de cette page n&rsquo;a rien de particulier et reprend les principes qui ont été utilisés pour implémenter la page de suppression pour la table Personnes.</p>
<p>Le code complet pour cette page est le suivant :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 1200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">@{<br />    <span style="color: #008000;">// Définition du layout et du titre de la page</span><br />    Layout = <span style="color: #006080;">"~/_SiteLayout.cshtml"</span>;<br />    Page.Title = <span style="color: #006080;">"Suppression"</span>;<br /><br />    <span style="color: #0000ff;">int</span> personneId = Request[<span style="color: #006080;">"personneId"</span>].AsInt();<br />    <span style="color: #0000ff;">int</span> organismeId = Request[<span style="color: #006080;">"organismeId"</span>].AsInt();<br /><br />    var af = <span style="color: #0000ff;">new</span> AffiliationRepository();<br />    var affiliation = <span style="color: #0000ff;">new</span> Affiliation();<br />    <span style="color: #008000;">//Recherche de l'affiliation à supprimerf</span><br />    affiliation = af.Find(personneId, organismeId);<br /><br />    <span style="color: #0000ff;">if</span>(IsPost)<br />    {<br />            <span style="color: #008000;">//Supression de l'enregistrement</span><br />            af.Remove(affiliation);<br />            Response.Redirect(<span style="color: #006080;">"Index"</span>);<br />    }<br />                  <br />}    <br />&lt;hgroup <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"title"</span>&gt;<br />    &lt;h1&gt;Suppression.&lt;/h1&gt;<br />   &lt;h3&gt;Êtes-vous sur de vouloir supprimer cet enregistrement ?&lt;/h3&gt;<br />&lt;/hgroup&gt;  <br /> &lt;fieldset&gt;<br />        &lt;legend&gt;&lt;/legend&gt;<br />        &lt;ol&gt;<br />            &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"employe"</span>&gt;<br />                &lt;label&gt;Employé:&lt;/label&gt;<br />                &lt;label&gt;@affiliation.Personne.Prenom @affiliation.Personne.Nom&lt;/label&gt;<br />            &lt;/li&gt;<br />            <br />            &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"organisme"</span>&gt;<br />                &lt;label&gt;Organisme:&lt;/label&gt;<br />                &lt;label&gt;@affiliation.Organisme.Nom&lt;/label&gt;<br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"fonction"</span>&gt;<br />                &lt;label&gt;Fonction:&lt;/label&gt;<br />                &lt;label&gt;@affiliation.Fonction&lt;/label&gt;<br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"email"</span>&gt;<br />                &lt;label&gt;Adresse mail:&lt;/label&gt;<br />                &lt;label&gt;@affiliation.Email&lt;/label&gt;<br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"telephone"</span>&gt;<br />                &lt;label&gt;Téléphone:&lt;/label&gt;<br />                &lt;label&gt;@affiliation.Telephone&lt;/label&gt;<br />            &lt;/li&gt;<br />        &lt;/ol&gt; <br /> <br />    &lt;/fieldset&gt;<br /><br /><br />&lt;form method=<span style="color: #006080;">"post"</span> action=<span style="color: #006080;">""</span>&gt;<br />    &lt;p&gt;<br />    &lt;input type=<span style="color: #006080;">"submit"</span> <span style="color: #0000ff;">value</span>=<span style="color: #006080;">"Supprimer"</span> title=<span style="color: #006080;">"Supprimer"</span> /&gt;<br /> &lt;a href=<span style="color: #006080;">"Index"</span>&gt;Retour à la liste&lt;/a&gt;<br />    &lt;/p&gt;<br />    &lt;/form&gt;</pre>
<p></div>
<p>Il permet d&rsquo;obtenir le résultat suivant à l&rsquo;exécution :</p>
<p><img src="http://rdonfack.developpez.com/tutoriels/dotnet/webmatrix-application-crud-entity-framework/images/deleteaffiliation.png" alt="" title="" /></p>
<p><strong>Conclusion</strong></p>
<p>Entity Framework, la technologie d&rsquo;accès aux données qui est en passe de devenir un standard dans l&rsquo;écosystème .NET peut être assez facilement exploitée avec WebMatrix pour la création d&rsquo;applications Web robustes. Bien que l&rsquo;éditeur WebMatrix manque beaucoup de fonctionnalités et d&rsquo;extensions qui sont disponibles dans Visual Studio, comme l&rsquo;échafaudage pour développer rapidement et facilement des applications utilisant Entity Framework, il permet néanmoins au développeur d&rsquo;exploiter quasiment toutes les fonctionnalités de la librairie et supporte l&rsquo;IntelliSence pour celle-ci.</p>
<p>Ce tutoriel nous a permis de concevoir bout-à-bout une petite solution complète de gestion des affiliations en utilisant Entity Framework, WebMatrix, Razor, NuGet et SQL Server Compact Edition et nous familiariser avec tous ces outils qui sont assez utilisés dans l&rsquo;environnement .NET.</p>
<p>Vous pouvez donc vous baser sur cet exemple ou en modifier le code à votre guise pour développer votre propre application répondant à vos besoins fonctionnels avec WebMatrix.</p>
<p><strong>Sources</strong></p>
<p>Vous pouvez télécharger et modifier les sources ci-dessous à votre convenance.</p>
<p><img src="http://www.developpez.be/images/kitsrc.jpg" alt="" title="" /> <a href="ftp://ftp-developpez.com/rdonfack/WebMatrixCrudApp.rar">Version RAR</a></p>
<p><img src="http://www.developpez.be/images/kitsrc.jpg" alt="" title="" /> <a href="ftp://ftp-developpez.com/rdonfack/WebMatrixCrudApp.zip">Version ZIP</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Microsoft.Web.Optimisation : ou comment optimiser une application ASP.NET en utilisant le regroupement et la minification à la volée du JavaScript et CSS</title>
		<link>https://blog.developpez.com/lilroma/p10462/net/microsoft_web_optimisation_ou_comment_op</link>
		<comments>https://blog.developpez.com/lilroma/p10462/net/microsoft_web_optimisation_ou_comment_op#comments</comments>
		<pubDate>Thu, 03 Nov 2011 16:55:00 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP.NET MVC 3]]></category>
		<category><![CDATA[ASP.NET MVC 4]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Nuget]]></category>
		<category><![CDATA[Visual Basic .NET]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Le temps de chargement d’une page est un facteur important dans l’évaluation des performances d’un site Web. Il a un impact non négligeable sur l’expérience utilisateur et même sur le référencement naturel. Plusieurs techniques peuvent être utilisées pour optimiser les &#8230; <a href="https://blog.developpez.com/lilroma/p10462/net/microsoft_web_optimisation_ou_comment_op">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Le temps de chargement d’une page est un facteur important dans l’évaluation des performances d’un site Web. Il a un impact non négligeable sur l’expérience utilisateur et même sur le référencement naturel.</p>
<p>Plusieurs techniques peuvent être utilisées  pour optimiser les performances d’une application Web (mise en cache, compression des fichiers, minification, etc). Je vais me pencher aujourd’hui sur le package NuGet d’optimisation d’un site Web « <strong><a href="http://nuget.org/List/Packages/Microsoft.Web.Optimization">ASP.NET Optimization – Bundling</a></strong> » qui a été publié récemment par Microsoft.</p>
<p>Ce package ajoute le support du regroupement et de la minification des fichiers JavaScript et CSS &#8211; qui sont des caractéristiques d’ASP.NET 4.5 et ASP.NET MVC 4 (disponibles actuellement en version Developper Preview) – avec le minimum d’effort pour les applications ASP.NET 4 et ASP.NET MVC.</p>
<p><img src="http://blog.developpez.com/media/minification.png" width="235" height="235" alt="" /></p>
<p><span id="more-37"></span></p>
<p>Le regroupement et la minification sont des procédés de réduction de la taille des fichiers en les combinant, et en supprimant les espaces et autres caractères  inutiles. Ces méthodes permettent de rendre l’exécution d’une page Web plus rapide avec le moins de demandes de chargement des fichiers. </p>
<p>Nous verrons dans ce billet de blog comment améliorer les performances d’une application Web ASP.NET MVC en utilisant les techniques de regroupement et de minification introduites par le package Microsoft.Web.Optimisation.</p>
<p>Pour commencer, nous allons créer un nouveau projet ASP.NET MVC 3.<br />
Comme l’illustre l’image ci-dessous, nous constatons que notre application contient par défaut un nombre déjà assez important de fichiers JavaScript et CSS.</p>
<p><img src="http://blog.developpez.com/media/capture1.PNG" width="497" height="339" alt="" /> </p>
<p>En exécutant une page de cette application (LogOn.chtml), nous obtenons les statistiques suivantes issues de l’analyse d’un outil de mesure de performance comme <a href="http://developer.yahoo.com/yslow/help/">YSlow</a>.</p>
<p><img src="http://blog.developpez.com/media/test1_01.PNG" width="640" height="196" alt="" /></p>
<p>Pour cette page,  nous avons un nombre total de 7 requêtes HTTP qui ont été effectuées, avec 4 fichiers JavaScript d’une taille totale de 119,9K qui ont été chargés.</p>
<p>Nous allons maintenant essayer de réduire le nombre de requêtes et la taille des fichiers qui sont chargés en utilisant ASP.NeT Optimisation Bundle.</p>
<p>Pour cela, nous allons  dans un premier temps ajouter une référence à Microsoft.Web.Optimisation dans notre application.</p>
<p>L’ajout de ce composant se fera via NuGet. Pour installer le package en utilisant NuGet voir <a href="http://rdonfack.developpez.com/tutoriels/dotnet/presentation-gestionnaire-packages-net-nuget/">mon article sur NuGet</a>.</p>
<p><img src="http://blog.developpez.com/media/nugetdwnload.PNG" width="620" height="107" alt="" /> </p>
<p>Après avoir installé le package, nous pouvons démarrer le regroupement et la minificatioon de nos fichiers en ajoutant tout simplement la ligne de code suivant dans la procédure Application_Start() du fichier Global.asax.cs.</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">BundleTable.Bundles.EnableDefaultBundles();</pre>
<p></div>
<p>Et c’est tout ;).</p>
<p>N’oubliez pas d’ajouter une référence à Microsoft.Web.Optimization dans le fichier Global.asax.cs :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"><span style="color: #0000ff;">using</span> Microsoft.Web.Optimization;</pre>
<p></div>
<p>Tous les fichiers JavaScript contenus dans le répertoire Scripts (les sous dossiers ne sont pas pris en compte) de notre application seront regroupés, compressés et traités comme un seul fichier.  Ces fichiers seront regroupés par défaut dans un dossier Script.</p>
<p>Ils seront désormais référencés en utilisant la ligne de code suivante :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">script</span> <span style="color: #ff0000;">src</span><span style="color: #0000ff;">="@Url.Content("</span>/<span style="color: #ff0000;">Scripts</span>/<span style="color: #ff0000;">js</span><span style="color: #0000ff;">")"</span> <span style="color: #ff0000;">type</span><span style="color: #0000ff;">="text/javascript"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">script</span><span style="color: #0000ff;">&gt;</span></pre>
<p></div>
<p>De même, les fichiers CSS contenus dans le répertoire Content seront également compactés par défaut dans un dossier Content.</p>
<p>Ils seront référencés en utilisant la ligne de code suivante :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">link</span> <span style="color: #ff0000;">href</span><span style="color: #0000ff;">="@Url.Content("</span>/<span style="color: #ff0000;">Content</span>/<span style="color: #ff0000;">css</span><span style="color: #0000ff;">")"</span> <span style="color: #ff0000;">rel</span><span style="color: #0000ff;">="stylesheet"</span> <span style="color: #ff0000;">type</span><span style="color: #0000ff;">="text/css"</span> <span style="color: #0000ff;">/&gt;</span></pre>
<p></div>
<p>Après avoir appliqué ces modifications, exécutons à nouveau la page précédente. Nous obtenons le résultat suivant :</p>
<p><img src="http://blog.developpez.com/media/test3_01.PNG" width="640" height="233" alt="" /></p>
<p>En comparant avec le résultat précédent, nous constatons que le nombre de requêtes est passé de 7 à 4, avec l’utilisation d’un fichier JavaScript unique, contre quatre précédemment.<br />
C’est déjà une bonne chose. Par contre, on se rend compte que la taille du JavaScript a plutôt augmenté, passant de 119,9k à 437,5k.</p>
<p>Pourquoi avons-nous plutôt une augmentation de la taille du JavaScript ?</p>
<p>En utilisant le dossier Scripts par défaut, ce sont environ une vingtaine de fichiers JavaScript contenus dans notre application ASP.NET MVC qui sont regroupés, minifiés et référencés dans une page qui n’utilise que quatre de ces fichiers.<br />
C’est tout à fait normal donc que malgré l’opération d’optimisation, on se retrouve avec une taille totale de ces fichiers supérieure à celle des quatre référencés dans notre page.  </p>
<p>Pour pallier à cela, nous pouvons définir nos propres regroupements de fichiers.</p>
<p>Avec cette option, nous avons la liberté dans le choix des fichiers qui seront dans un regroupement, ainsi que l’URL qu’aura le regroupement. À ce stade, le choix des dossiers de regroupement doit être fonction de la récurrence des fichiers JavaScript et CSS dans les pages de votre application.</p>
<p>Nous pouvons définir nos regroupements personnalisés en procédant comme suit dans la procédure Application_Start() du fichier Global.asax.cs :</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 400px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">BundleTable.Bundles.EnableDefaultBundles();<br /><br />Bundle jsBundle = <span style="color: #0000ff">new</span> Bundle(<span style="color: #006080">&quot;~/Scripts&quot;</span>,<span style="color: #0000ff">typeof</span>(JsMinify));<br />jsBundle.AddFile(<span style="color: #006080">&quot;~/Scripts/jquery-1.5.1.min.js&quot;</span>);<br />jsBundle.AddFile(<span style="color: #006080">&quot;~/Scripts/modernizr-1.7.min.js&quot;</span>);<br />jsBundle.AddFile(<span style="color: #006080">&quot;~/Scripts/jquery.validate.min.js&quot;</span>);<br />jsBundle.AddFile(<span style="color: #006080">&quot;~/Scripts/jquery.validate.unobtrusive.min.js&quot;</span>);<br /><br />BundleTable.Bundles.Add(jsBundle);<br /><br />Bundle cssBundle = <span style="color: #0000ff">new</span> Bundle(<span style="color: #006080">&quot;~/Style&quot;</span>, <span style="color: #0000ff">typeof</span>(CssMinify));<br />cssBundle.AddFile(<span style="color: #006080">&quot;~/content/themes/site.css&quot;</span>);<br />cssBundle.AddFile(<span style="color: #006080">&quot;~/content/themes/base/jquery.ui.all.css&quot;</span>);<br /><br />BundleTable.Bundles.Add(cssBundle);<br /></pre>
<p></div>
<p>Nous allons désormais  référencer ces regroupements dans notre page comme suit :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"><br /><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">link</span> <span style="color: #ff0000;">href</span><span style="color: #0000ff;">="@Url.Content("</span>~/<span style="color: #ff0000;">Style</span> <span style="color: #0000ff;">")"</span> <span style="color: #ff0000;">rel</span><span style="color: #0000ff;">="stylesheet"</span> <span style="color: #ff0000;">type</span><span style="color: #0000ff;">="text/css"</span> <span style="color: #0000ff;">/&gt;</span><br /><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">script</span> <span style="color: #ff0000;">src</span><span style="color: #0000ff;">="@Url.Content("</span>~/<span style="color: #ff0000;">Scripts</span><span style="color: #0000ff;">")"</span> <span style="color: #ff0000;">type</span><span style="color: #0000ff;">="text/javascript"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">script</span><span style="color: #0000ff;">&gt;</span><br /></pre>
<p></div>
<p>Et en exécutant la page précédente, nous obtenons le résultat suivant :</p>
<p><img src="http://blog.developpez.com/media/test2_01.PNG" width="640" height="223" alt="" /></p>
<p>Et voilà, la taille de nos fichiers JavaScript passe de 119,9K à 2,3K, soit une réduction de plus de 95 %.</p>
<p>Vous pouvez également ajouter à votre regroupement tous les fichiers JavaScript d’un répertoire en procédant comme suit :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">jsBundle.AddDirectory(<span style="color: #006080;">"~/Scripts"</span>, <span style="color: #006080;">"*.js"</span>, <span style="color: #0000ff;">false</span>);</pre>
<p></div>
<p>Nous avons maintenant de quoi compresser et réduire au maximum le nombre de hits de nos pages Web avec souplesse. </p>
<p>Seul bémol, la minification des fichiers contenant du code CSS3 semble ne pas fonctionner pour l&rsquo;instant.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ASP.NET MVC : résoudre l’erreur « A circular reference was detected while serializing an object of type… »</title>
		<link>https://blog.developpez.com/lilroma/p10448/net/asp_net_mvc_resoudre_l_erreur_l_a_circul</link>
		<comments>https://blog.developpez.com/lilroma/p10448/net/asp_net_mvc_resoudre_l_erreur_l_a_circul#comments</comments>
		<pubDate>Thu, 27 Oct 2011 17:39:12 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP.NET MVC 3]]></category>
		<category><![CDATA[ASP.NET MVC 4]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[En travaillant sur une application Web ASP.NET MVC dans laquelle j’utilise Entity Framework 4 Code First, j’ai eu l’erreur suivante : «A circular reference was detected while serializing an object of type… » lorsque j’ai essayé de retourner une classe &#8230; <a href="https://blog.developpez.com/lilroma/p10448/net/asp_net_mvc_resoudre_l_erreur_l_a_circul">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p> En travaillant sur une application Web ASP.NET MVC dans laquelle j’utilise Entity Framework 4 Code First, j’ai eu l’erreur suivante : «<strong>A circular reference was detected while serializing an object of type…</strong> »  lorsque j’ai essayé de retourner une classe Entité au client comme un document JSON.</p>
<p><img src="http://blog.developpez.com/media/circulaire.jpg" width="228" height="221" alt="" align="center"/></p>
<p><span id="more-36"></span></p>
<p>À première vue, il semblerait qu’il y ait une référence circulaire dans ma hiérarchie d’objets qui n’est pas prise en charge par le sérialiseur JSON.</p>
<p>En essayant de procéder au débogage de la procédure, je me suis rendu compte que le problème n’était pas au niveau de mon code, mais plutôt au niveau de la classe qui s’occupe de la sérialisation. </p>
<p>Quelle est donc la cause de cette erreur :</p>
<p>Pour les tables ayant des relations, l’utilitaire de mappage objet relationnel, génère des propriétés de référence dans chaque entité. </p>
<p>Prenons par exemple le schéma suivant de ma base de données :</p>
<p><img src="http://blog.developpez.com/media/schema.PNG" width="573" height="261" alt="" /> </p>
<p>Pour la table Liste_produit, L’objet  généré aura une propriété Facture. Cependant, pour la table Facture, l’objet généré aura également une propriété Liste_produit. Conséquence : l’objet facture est lié à l’objet Liste_produit et vice-versa. </p>
<p>Ce scénario permet bien évidemment de bénéficier de beaucoup plus d’options lors du traitement de ces entités, mais crée cependant une ambiguïté pour le sérialiseur JSON lors de l’opération de sérialisation. D’où la génération de cette erreur.</p>
<p>Comment résoudre cela ?</p>
<p>Pour résoudre ce type de problème, nous pouvons utiliser deux solutions.</p>
<p>La première solution qui est plutôt simple est de marquer la relation comme une propriété interne. </p>
<p><img src="http://blog.developpez.com/media/schema1.PNG" width="323" height="297" alt="" /> </p>
<p>Perso, je préfère ne pas utiliser cette méthode, car elle m’oblige à modifier mon EDM (Entity Data Model). </p>
<p>La seconde solution, qui est celle pour laquelle j’ai opté, consiste en l’utilisation d’un autre ViewModel en lieu et place de celui généré automatiquement par l’utilitaire de mappage objet/relationnel (ORM).</p>
<p>Cette approche est plus élégante dans la mesure ou elle permettra de sélectionner uniquement les données dont nous avons besoin et sérialiser uniquement celles qui nous intéressent. La conséquence directe est la réduction de la taille des données qui seront retournées dans notre vue et une amélioration de performance de notre application.</p>
<p>Pour utiliser cette méthode, nous devons :</p>
<p>&#8211; Dans un premier temps, créer une nouvelle classe qui contiendra uniquement les propriétés dont nous avons besoin.</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 800px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">public</span> <span style="color: #0000ff">partial</span> <span style="color: #0000ff">class</span> ProduitL<br />    {<br /><br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">short</span> Id_produit <br />        {<br />            get; <br />            set; <br />        }<br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Libelle_produit <br />        { <br />            get; <br />            set; <br />        }<br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Conditionnement <br />        { <br />            get; <br />            set; <br />        }<br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">int</span> Quantite <br />        { <br />            get; <br />            set; <br />        }<br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">decimal</span> Prix <br />        { <br />            get; <br />            set; <br />        }<br />    }</pre>
<p></div>
<p>Nous allons ensuite modifier la méthode d’action de notre contrôleur comme suit :</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 400px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">public</span> JsonResult Facture(<span style="color: #0000ff">short</span> id)<br />        {<br /><br />            var results = from lp <span style="color: #0000ff">in</span> db.Liste_produit<br />                    <span style="color: #0000ff">where</span> lp.Id_facture == id<br />                    select <span style="color: #0000ff">new</span> ProduitL<br />                    {<br />                        Id_produit = lp.Id_produit,<br />                        Libelle_produit = lp.produit.Libelle_ produit,<br />                        Conditionnement = lp. produit.Conditionnement,<br />                        Quantite = lp.Quantite,<br />                        Prix = lp.Prix  <br />                        <br />                    };<br />            <span style="color: #0000ff">return</span> Json(results);<br />        }</pre>
<p></div>
<p>ET voilà, à l’exécution de notre application, nous n’aurons plus cette erreur qui peut s’avérer désorientant pour certains.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP.NET MVC 4 Developer Preview : amélioration du modèle de projet web avec le rendu adaptatif</title>
		<link>https://blog.developpez.com/lilroma/p10420/net/asp_net_mvc_4_developer_preview_ameliora</link>
		<comments>https://blog.developpez.com/lilroma/p10420/net/asp_net_mvc_4_developer_preview_ameliora#comments</comments>
		<pubDate>Thu, 20 Oct 2011 16:05:41 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP.NET MVC 4]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Visual Basic .NET]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[J’avais dans un premier billet de blog, juste après la sortie de la Developer Preview d’ASP.NET MVC 4 présenté sommaire l’ensemble des fonctionnalités disponibles. Dans deux autres billets, je suis revenu de façon assez détaillée sur les nouveautés pour le &#8230; <a href="https://blog.developpez.com/lilroma/p10420/net/asp_net_mvc_4_developer_preview_ameliora">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>J’avais dans un premier billet de blog, juste après la sortie de la Developer Preview d’ASP.NET MVC 4 <a href="http://blog.developpez.com/lilroma/p10294/">présenté sommaire l’ensemble des fonctionnalités disponibles</a>. Dans deux autres billets, je suis revenu de façon assez détaillée sur <a href="http://blog.developpez.com/lilroma/p10343/">les nouveautés pour le support du mobile et des tablettes</a>. J’ai également décrit comment créer une première application Web mobile et comment y implémenter des vues multiples qui seront affichées automatiquement en fonction du type de navigateur (Desktop ou Mobile) qui accède la page.</p>
<p>Dans le même ordre d’idée, nous allons continuer à explorer les nouveautés du Framework Web avec cette fois, une analyse détaillée des améliorations apportées au modèle Web par défaut.</p>
<p><span id="more-65"></span></p>
<p>Pour cela, nous allons comme d’habitude lancer notre environnement Visual Studio, qui bien évidemment contient ASP.NET MVC 4 Developer Preview et procéder à la création d’un nouveau projet.</p>
<p>Dans la zone de sélection des modèles de projet, nous allons choisir le modèle Internet Application et valider ensuite sur OK.</p>
<p>Procédons à l’exécution de notre application (ctrl + f5) :</p>
<p><img src="http://blog.developpez.com/media/Templates.PNG" width="604" height="646" alt="" /></p>
<p>On peut s’apercevoir que le design du modèle par défaut auquel nous avons été habitués depuis la première version d’ASP.NET MVC jusqu&rsquo;à la version trois a été totalement remanié et est désormais beaucoup plus esthétique.</p>
<p><strong>Rendu adaptatif (Adaptive Rendering) avec CSS Media Query et Viewport</strong></p>
<p>La nouveauté la plus intéressante que je vais noter est cependant ce qui se cache derrière ce nouveau Template.  Pour illustrer cela, je vais exécuter un modèle de base d’ASP.NET MVC 3 et celui de MVC4 avec un  terminal mobile. Ici, je vais utiliser un émulateur d’Opera Mobile :</p>
<p><img src="http://blog.developpez.com/media/templates2.PNG" width="523" height="444" alt="" /></p>
<p>À première vue, on se rend compte que le texte de notre site sur MVC 3 est carrément illisible, tandis que le contenu de celui en MVC 4 a été adapté en fonction de la taille du terminal.</p>
<p>Ceci est possible grâce à l’implémentation d’une nouvelle fonctionnalité de rendu adaptatif, qui couple  le tag meta viewport et le CSS Media Queries.</p>
<p><strong>Tag meta viewport</strong></p>
<p>Pour un site Web classique de largeur par exemple 980px, le navigateur mobile va se charger de redimensionner le contenu proportionnellement. Du coup, à l’affichage, l’on peut se retrouver avec des caractères beaucoup trop petits, carrément illisibles, comme c’est le cas avec notre site sous ASP.NET MVC 3. </p>
<p>La balise meta viewport permet au navigateur de comprendre que l’affichage de notre page doit être adapté en fonction de la taille du terminal sur lequel est exécutée l’application. En spécifiant cette balise dans une page, au lieu de procéder à une réduction du texte, le navigateur redessine plutôt la page de telle sorte qu’elle soit parfaitement conforme aux dimensions de l’appareil.</p>
<p>La balise meta viewport est renseignée dans le fichier _layout de votre projet :</p>
<pre style='color:#000000;background:#ffffff;'><span style='color:#a65700; '>&lt;</span><span style='color:#800000; font-weight:bold; '>meta</span><span style='color:#274796; '> </span><span style='color:#074726; '>name</span><span style='color:#808030; '>=</span><span style='color:#0000e6; '>"viewport"</span><span style='color:#274796; '> </span><span style='color:#074726; '>content</span><span style='color:#808030; '>=</span><span style='color:#0000e6; '>"width=device-width"</span><span style='color:#a65700; '>></span>
</pre>
<p><strong>CSS Media Queries</strong></p>
<p>Nous avons grâce au meta viewport, spécifié à notre navigateur qu’il peut adapter le contenu de notre page en fonction de la taille du terminal. Cependant, celui-ci n’est pas assez futé pour définir automatiquement les règles d’affichages et les dispositions graphiques de votre page.</p>
<p>C’est à ce stade qu’interviennent les Media Queries. Cette fonctionnalité introduite par le CSS3 va permettre de définir des règles d’affichage personnalisées en fonction du type de média, de la taille de la fenêtre, de la résolution de l’écran, etc.</p>
<p>À titre d’exemple, avec le script suivant, l’affichage de ma page dans un navigateur ayant une taille supérieure à 850px sera en bleu, tandis que sur un navigateur ayant une taille max de 850px, elle aura un background noir.</p>
<pre style='color:#000000;background:#ffffff;'><span style='color:#800000; font-weight:bold; '>body</span> <span style='color:#800080; '>{</span><span style='color:#bb7977; font-weight:bold; '>background-color</span><span style='color:#808030; '>:</span><span style='color:#797997; '>blue</span><span style='color:#800080; '>;</span>
      <span style='color:#bb7977; font-weight:bold; '>color</span><span style='color:#808030; '>:</span><span style='color:#797997; '>black</span><span style='color:#800080; '>;</span><span style='color:#800080; '>}</span>
<span style='color:#800080; '>@</span><span style='color:#004a43; '>media</span> <span style='color:#004a43; '>only screen and (max-width: 850px) </span><span style='color:#800080; '>{</span>
    <span style='color:#800000; font-weight:bold; '>body</span> <span style='color:#800080; '>{</span><span style='color:#bb7977; font-weight:bold; '>background-color</span><span style='color:#808030; '>:</span><span style='color:#797997; '>black</span><span style='color:#800080; '>;</span>
          <span style='color:#bb7977; font-weight:bold; '>color</span> <span style='color:#808030; '>:</span><span style='color:#797997; '>white</span> <span style='color:#800080; '>;</span><span style='color:#800080; '>}</span>
<span style='color:#800080; '>}</span>
</pre>
<p>En effet, lors du chargement de la page, le navigateur applique plutôt le code CSS contenu dans le bloc @media si la résolution de l’écran est inférieure ou égale à celle définie par l’attribut  max-width.</p>
<p>Vous trouverez les règles d’affichage personnalisées pour le modèle de projet par défaut  d’ASP.NET MVC4 dans le fichier Site.css, dans le bloc de code @media only screen and (max-width: 850px).</p>
<p><strong>Utilisation de jQuery UI</strong></p>
<p>Une autre amélioration qui a été apportée au modèle est l’utilisation du JavaScript pour fournir une interface utilisateur plus riche. Les pages connexion et inscription utilisent désormais  jQuery UI pour afficher à l’écran une page beaucoup ergonomique :</p>
<p><img src="http://blog.developpez.com/media/templates3.PNG" width="294" height="405" alt="" /></p>
<p><strong>Conclusion</strong> </p>
<p>Il est intéressant de constater que des règles CSS ont été définies dans le Template Web par défaut pour prendre en charge les tailles d’écrans différents. Mais, je tiens à signaler que ce modèle n’est pas adapté pour la navigation sur les écrans tactiles. Par exemple, vous pouvez remarquer qu’il n’utilise pas la bibliothèque jQuerie Mobile.</p>
<p>À mon humble avis, se serait bien que soit introduit un autre template dans ASP.NET MVC 4 qui couple le modèle mobile et le modèle Web pour fournir une application optimisée à la fois pour les terminaux mobiles et les navigateurs Desktop.</p>
<p>En tout cas peut-être d’ici à la publication de la version finale, ce sera le cas ;). </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ecriture d’une simple fonction d’envoi des mails dans une application ASP.NET MVC 3 avec le Helper Razor WebMail</title>
		<link>https://blog.developpez.com/lilroma/p10304/net/ecriture_d_une_simple_fonction_d_envoi_d</link>
		<comments>https://blog.developpez.com/lilroma/p10304/net/ecriture_d_une_simple_fonction_d_envoi_d#comments</comments>
		<pubDate>Wed, 21 Sep 2011 10:48:02 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP.NET MVC 3]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[RAZOR]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[J’avais déjà blogué précédemment sur le Helper Razor Chart et présenté quelques autres Helpers dans mon article sur Razor. Je vais aujourd’hui m’attarder sur un autre Helper Razor qui m’a été d’une grande utilité récemment pour implémenter une nouvelle fonctionnalité &#8230; <a href="https://blog.developpez.com/lilroma/p10304/net/ecriture_d_une_simple_fonction_d_envoi_d">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>J’avais déjà blogué précédemment sur <a href="http://blog.developpez.com/lilroma/p10231/net/asp-net/utilisation-du-helper-asp-net-razor-char-3/">le Helper Razor Chart</a> et présenté quelques autres Helpers dans <a href="http://rdonfack.developpez.com/tutoriels/dotnet/creation-pages-web-asp-net-utilisant-moteur-vue-razor/?page=page_6">mon article sur Razor</a>. </p>
<p>Je vais aujourd’hui m’attarder sur un autre Helper Razor qui m’a été d’une grande utilité récemment pour implémenter une nouvelle fonctionnalité dans une application Web.</p>
<p> En effet, je devais intégrer une fonction pour envoyer des mails dans l’application Web que <a href="http://blog.developpez.com/lilroma/p10280/net/asp-net/comment-transformer-mes-fichiers-aspx-ex/#more10280">j’avais migré récemment d’ASP.NET MVC 2 vers ASP.NET MVC 3</a>. </p>
<p>Au lieu de procéder de façon standard comme j’en avais l’habitude, j’ai jeté un rapide coup d’œil sur le Helper Razor WebMail qui m’a permis en l’espace de quelques minutes d’écrire mon module d’envoi des mails, au point ou je n’ai pas pu m’empêcher d’utiliser le temps de libre qui me restait pour écrire ce billet de blog sur ce composant. </p>
<p><span id="more-40"></span></p>
<p>Je vais donc vous montrer dans ce petit article comment configurer le WebMail Helper et l’utiliser dans une application ASP.MVC 3 pour l’expédition des mails. </p>
<p>Vous devez disposer de Visual Studio 2010 et ASP.NET MVC 3. Dans votre projet, vous allez dans un premier temps créer le modèle qui sera utilisé. </p>
<p>Pour la validation des données, j’ai utilisé les DataAnnotations. Le code du modèle est le suivant : </p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 300px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> WebMailModel<br />    {<br /><br />        [Required(ErrorMessage = <span style="color: #006080">&quot;L'adresse mail est obligatoire&quot;</span>)]<br />        [DataType(DataType.EmailAddress)] <br />        [Display(Name = <span style="color: #006080">&quot;Adresse mail&quot;</span>)]<br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> AMail { get; set; }<br />        [Required(ErrorMessage = <span style="color: #006080">&quot;L'objet est obligatoire&quot;</span>)]<br />        [Display(Name = <span style="color: #006080">&quot;Objet&quot;</span>)]<br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> MObjet { get; set; }<br />        [Display(Name = <span style="color: #006080">&quot;Corps du message&quot;</span>)]<br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> MCorps { get; set; }<br />    }</pre>
<p></div>
<p>Nous allons maintenant créer l’action du contrôleur dans le dossier correspondant. </p>
<p>Le contrôleur doit contenir les méthodes suivantes : </p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 300px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #008000">//</span><br />      <span style="color: #008000">// GET: /WebMailModel/</span><br />      <span style="color: #0000ff">public</span> ActionResult MailSend()<br />      {<br />          <span style="color: #0000ff">return</span> View();<br />      }<br /><br />      <span style="color: #008000">//</span><br />      <span style="color: #008000">// POST: /WebMailModel/</span><br />      [HttpPost]<br />      <span style="color: #0000ff">public</span> ActionResult MailSend(WebMailModel M)<br />      {<br />          <br />      }</pre>
<p></div>
<p>Dans la méthode post, nous allons écrire le code permettant d’envoyer des mails en utilisant le Helper WebMail. </p>
<p>Dans un premier temps, nous allons ajouter un bloc If qui nous permettra de vérifier la validation des données. Ensuite nous devons configurer la classe WebMail en fournissant le nom du serveur STMP. Vous pouvez également définir un compte utilisateur et un port si cela est requis par votre serveur de messagerie en fournissant des valeurs pour les attributs UserName, Password, SmtpPort. </p>
<p>La méthode Send du Helper Webmail sera ensuite utilisée pour envoyer le mail, en passant en paramètre l’adresse du destinataire, l’objet du message, le corps du message et enfin l’adresse de l’expéditeur. </p>
<p>En cas d’erreur (serveur SMTP incorrect par exemple), un message sera affiché dans le formulaire avec le tracé de la pile de l’erreur. Sinon, l’utilisateur sera rédirectionné vers une page de confirmation de l’envoi du message. Le code complet de cette méthode est le suivant : </p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 500px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">public</span> ActionResult MailSend()<br />        {<br />            <span style="color: #0000ff">return</span> View();<br />        }<br /><br />        [HttpPost]<br />        <span style="color: #0000ff">public</span> ActionResult MailSend(WebMailModel M)<br />        {<br />            <span style="color: #0000ff">if</span> (ModelState.IsValid)<br />            {<br />                <span style="color: #0000ff">try</span><br />                {<br />                    WebMail.SmtpServer = <span style="color: #006080">&quot;mail.monserveur.com&quot;</span>;<br />                    WebMail.Send(M.AMail, M.MObjet, M.MCorps, <span style="color: #006080">&quot;st@monserveur.com&quot;</span>);<br /><br />                }<br /><br />                <span style="color: #0000ff">catch</span> (Exception Ex)<br />                {<br /><br />                    ViewData.ModelState.AddModelError(<span style="color: #006080">&quot;Error&quot;</span>, Ex.Message);<br />                <br />                }<br /><br />                <span style="color: #0000ff">return</span> RedirectToAction(<span style="color: #006080">&quot;Index&quot;</span>, <span style="color: #006080">&quot;Accueil&quot;</span>);<br />            }<br />              <br />            <span style="color: #0000ff">return</span> View();<br />        }</pre>
<p></div>
<p>Nous allons enfin générer la vue fortement typée associée à l’action MailSend(). Je ne vais pas m’attarder dessus. Pour cela, je vous renvois à mon billet de blog sur <a href="http://blog.developpez.com/lilroma/p10192/net/asp-net/creation-d-un-formulaire-web-avec-asp-ne/#more10192">la création d’un formulaire Razor avec ASP.NET MVC 3</a> pour voir comment créer une vue fortement typée.</p>
<p>Le code de votre vue doit ressembler à ceci. </p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 800px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><br />@model MvcApplication2.Models.WebMailModel<br /><br />@{<br />    ViewBag.Title = <span style="color: #006080">&quot;MailSend&quot;</span>;<br />}<br /><br />&lt;h2&gt;Envoyez vos suggestions par Mail&lt;/h2&gt;<br /><br />&lt;script src=<span style="color: #006080">&quot;@Url.Content(&quot;</span>~/Scripts/jquery.validate.min.js<span style="color: #006080">&quot;)&quot;</span> type=<span style="color: #006080">&quot;text/javascript&quot;</span>&gt;&lt;/script&gt;<br />&lt;script src=<span style="color: #006080">&quot;@Url.Content(&quot;</span>~/Scripts/jquery.validate.unobtrusive.min.js<span style="color: #006080">&quot;)&quot;</span> type=<span style="color: #006080">&quot;text/javascript&quot;</span>&gt;&lt;/script&gt;<br /><br />@<span style="color: #0000ff">using</span> (Html.BeginForm()) {<br />    @Html.ValidationSummary(<span style="color: #0000ff">true</span>)<br />    &lt;fieldset&gt;<br />        &lt;legend&gt;WebMailModel&lt;/legend&gt;<br /><br />        &lt;div <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;editor-label&quot;</span>&gt;<br />            @Html.LabelFor(model =&gt; model.AMail)<br />        &lt;/div&gt;<br />        &lt;div <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;editor-field&quot;</span>&gt;<br />            @Html.EditorFor(model =&gt; model.AMail)<br />            @Html.ValidationMessageFor(model =&gt; model.AMail)<br />        &lt;/div&gt;<br /><br />        &lt;div <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;editor-label&quot;</span>&gt;<br />            @Html.LabelFor(model =&gt; model.MObjet)<br />        &lt;/div&gt;<br />        &lt;div <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;editor-field&quot;</span>&gt;<br />            @Html.EditorFor(model =&gt; model.MObjet)<br />            @Html.ValidationMessageFor(model =&gt; model.MObjet)<br />        &lt;/div&gt;<br /><br />        &lt;div <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;editor-label&quot;</span>&gt;<br />            @Html.LabelFor(model =&gt; model.MCorps)<br />        &lt;/div&gt;<br />        &lt;div <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;editor-field&quot;</span>&gt;<br />            @Html.TextAreaFor(model =&gt; model.MCorps)<br />            @Html.ValidationMessageFor(model =&gt; model.MCorps)<br />        &lt;/div&gt;<br /><br />        &lt;p&gt;<br />            &lt;input type=<span style="color: #006080">&quot;submit&quot;</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;Envoyer&quot;</span> /&gt;<br />        &lt;/p&gt;<br />    &lt;/fieldset&gt;<br />}<br /><br /></pre>
<p></div>
<p>Et à l’exécution vous obtiendrez le résultat suivant :</p>
<p> <img alt="" src="http://blog.developpez.com/media/mail.PNG" width="421" height="397" /> </p>
<p>Et voilà ;), nous venons en l’espace de quelques minutes de mettre sur pied notre fonction d’expédition de mails. </p>
<p>Vous vous rendre compte une fois de plus de la puissance de ces méthodes d’aides introduites par Razor qui fournissement un moyen simple et cohérent d&rsquo;effectuer des tâches de développement Web dynamique qui, autrement, exigeraient beaucoup de code personnalisé. </p>
<p><strong>Référence :</strong></p>
<p> &#8211; <a href="http://msdn.microsoft.com/en-us/library/system.web.helpers.webmail(v=vs.99).aspx">Description de la classe WebMail.</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comment transformer mes fichiers ASPX existants en fichiers cshtml (Razor) ?</title>
		<link>https://blog.developpez.com/lilroma/p10280/net/comment_transformer_mes_fichiers_aspx_ex</link>
		<comments>https://blog.developpez.com/lilroma/p10280/net/comment_transformer_mes_fichiers_aspx_ex#comments</comments>
		<pubDate>Mon, 12 Sep 2011 16:39:26 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP.NET MVC 3]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[RAZOR]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Récemment, j’ai décidé de migrer une de mes applications Web existantes de MVC2 vers MVC3 pour y apporter des améliorations et intégrer des nouvelles fonctionnalités. Logiquement, étend plus à l’aise avec le moteur de vue Razor qui &#8211; à mon &#8230; <a href="https://blog.developpez.com/lilroma/p10280/net/comment_transformer_mes_fichiers_aspx_ex">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Récemment, j’ai décidé de migrer une de mes applications Web existantes de MVC2 vers MVC3 pour y apporter des améliorations et intégrer des nouvelles fonctionnalités.</p>
<p>Logiquement, étend plus à l’aise avec le moteur de vue Razor qui &#8211; à mon avis &#8211; est plus facile, expressif, compact, fluide et rend la vue beaucoup plus simple, j’ai donc décidé pour mes développements futurs de l’utiliser. </p>
<p>Certes, il est possible au sein d’une même application ASP.NET d’utiliser des moteurs de vue différents pour chaque vue ASP.NET. Mais je n’en veux pas autant le gars d’à côté qui pourra maintenir cette application, au point de l’obliger à avoir une maitrise à la fois du moteur ASP.NET standard et le moteur Razor.</p>
<p>Donc l’utilisation de Razor et le moteur ASP.NET classique dans ma solution pour moi la rend un peu difficile à maintenir et je trouve la solution plutôt indigeste. Au final, j’ai donc décidé de convertir tous mes fichiers ASPX (moteur ASP.NET classique) en fichiers cshtml (moteur Razor).</p>
<p><span id="more-35"></span></p>
<p>Comment procéder ?  Réécrire entièrement mes formulaires avec Razor ?  Ça ! Pas question. </p>
<p>Heureusement, après quelques recherches je suis tombé sur l’extension WebFormsRazorConverterVsExtension pour Visual Studio 2010 (merci aux développeurs de Telerik pour cet outil ;)).</p>
<p>L’outil a été développé à la base par Telerik pour la migration de ses applications d’exemples en ASP.NET standard vers Razor, l’éditeur a décidé de mettre cet outil à la disposition des développeurs gratuitement.</p>
<p>L’extension peut être téléchargée et installée depuis Visual Studio.<br />
Pour cela, cliquez sur le menu Tools, ensuite sur Extension Manager pour afficher la fenêtre de gestion des extensions Visual Studio.</p>
<p><img src="http://blog.developpez.com/media/img1_01.PNG" width="330" height="398" alt="" /> </p>
<p>Effectuez une recherche pour retrouver l’extension WebFormsRazorConverterVsExtension, et cliquez ensuite sur le bouton Install pour lancer son téléchargement et son installation.</p>
<p><img src="http://blog.developpez.com/media/img2_01.jpg" width="430" height="336" alt="" /> </p>
<p>Lorsque vous aurez la fenêtre de confirmation de la fin de l’installation du composant, redémarrez votre environnement de développement pour que les modifications apportées à Visual Studio soient prises en compte.</p>
<p>Vous verrez désormais un nouvel item  « Convert to Razor CSHTML) ajouté dans le menu Tools, cliquez dessus pour afficher la fenêtre de conversion des fichiers aspx en cshtml.</p>
<p><img src="http://blog.developpez.com/media/img5.PNG" width="328" height="422" alt="" /></p>
<p>Dans cette fenêtre, cliquez sur le bouton Select Web Forms View(s) et sélectionnez les fichiers aspx que vous souhaitez convertir et cliquez sur le bouton Convert pour lancer la conversion de fichiers aspx en fichier Razor cshtml.</p>
<p>Par exemple, je vais convertir mon fichier aspx contenant le code suivant en cshtml :</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 650px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">&lt;%@ Page Language=<span style="color: #006080">&quot;C#&quot;</span> MasterPageFile=<span style="color: #006080">&quot;~/Views/Shared/Site.Master&quot;</span> Inherits=<span style="color: #006080">&quot;System.Web.Mvc.ViewPage&lt;MvcApplication1.Models.Clients&gt;&quot;</span> %&gt;<br /><br />&lt;asp:Content ID=<span style="color: #006080">&quot;clientTitle&quot;</span> ContentPlaceHolderID=<span style="color: #006080">&quot;TitleContent&quot;</span> runat=<span style="color: #006080">&quot;server&quot;</span>&gt;<br />    Client<br />&lt;/asp:Content&gt;<br /><br />&lt;asp:Content ID=<span style="color: #006080">&quot;ClientContent&quot;</span> ContentPlaceHolderID=<span style="color: #006080">&quot;MainContent&quot;</span> runat=<span style="color: #006080">&quot;server&quot;</span>&gt;<br />    &lt;h2&gt;Nouveau client&lt;/h2&gt;<br />    <br />    &lt;% <span style="color: #0000ff">using</span> (Html.BeginForm()) { %&gt;<br />        &lt;%: Html.ValidationSummary(<span style="color: #0000ff">true</span>) %&gt;<br />        &lt;fieldset&gt;<br />            &lt;legend&gt;Clients&lt;/legend&gt;<br />    <br />            &lt;div <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;editor-label&quot;</span>&gt;<br />                &lt;%: Html.LabelFor(model =&gt; model.Nom) %&gt;<br />            &lt;/div&gt;<br />            &lt;div <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;editor-field&quot;</span>&gt;<br />                &lt;%: Html.EditorFor(model =&gt; model.Nom) %&gt;<br />                &lt;%: Html.ValidationMessageFor(model =&gt; model.Nom) %&gt;<br />            &lt;/div&gt;<br />    <br />            &lt;div <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;editor-label&quot;</span>&gt;<br />                &lt;%: Html.LabelFor(model =&gt; model.Prenom) %&gt;<br />            &lt;/div&gt;<br />            &lt;div <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;editor-field&quot;</span>&gt;<br />                &lt;%: Html.EditorFor(model =&gt; model.Prenom) %&gt;<br />                &lt;%: Html.ValidationMessageFor(model =&gt; model.Prenom) %&gt;<br />            &lt;/div&gt;<br />    <br />            &lt;div <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;editor-label&quot;</span>&gt;<br />                &lt;%: Html.LabelFor(model =&gt; model.Email) %&gt;<br />            &lt;/div&gt;<br />            &lt;div <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;editor-field&quot;</span>&gt;<br />                &lt;%: Html.EditorFor(model =&gt; model.Email) %&gt;<br />                &lt;%: Html.ValidationMessageFor(model =&gt; model.Email) %&gt;<br />            &lt;/div&gt;<br />    <br />            &lt;p&gt;<br />                &lt;input type=<span style="color: #006080">&quot;submit&quot;</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;Valider&quot;</span> /&gt;<br />            &lt;/p&gt;<br />        &lt;/fieldset&gt;<br />    &lt;% } %&gt;<br />    <br />    &lt;/asp:Content&gt;<br /></pre>
<p></div>
<p>J’ouvre donc la fenêtre de conversion, je sélectionne mon fichier et l’emplacement de sauvegarde et je clic ensuite sur Convert.</p>
<p><img src="http://blog.developpez.com/media/img6.PNG" width="624" height="453" alt="" /></p>
<p>Et hop, il me génère le fichier .cshtml correspondant, contenant  l’équivalent avec Razor du code ASP.NET dans mon fichier ASPX.<br />
@model MvcApplication1.Models.Clients</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 650px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">@section TitleContent {<br /><br />    Client<br /><br />}<br /><br /><br />    <span style="color: #0000ff">&lt;</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;</span>Nouveau client<span style="color: #0000ff">&lt;/</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;</span><br />    <br />    @using (Html.BeginForm()) { <br />        @Html.ValidationSummary(true)<br />        <span style="color: #0000ff">&lt;</span><span style="color: #800000">fieldset</span><span style="color: #0000ff">&gt;</span><br />            <span style="color: #0000ff">&lt;</span><span style="color: #800000">legend</span><span style="color: #0000ff">&gt;</span>Clients<span style="color: #0000ff">&lt;/</span><span style="color: #800000">legend</span><span style="color: #0000ff">&gt;</span><br />    <br />            <span style="color: #0000ff">&lt;</span><span style="color: #800000">div</span> <span style="color: #ff0000">class</span><span style="color: #0000ff">=&quot;editor-label&quot;</span><span style="color: #0000ff">&gt;</span><br />                @Html.LabelFor(model =<span style="color: #0000ff">&gt;</span> model.Nom)<br />            <span style="color: #0000ff">&lt;/</span><span style="color: #800000">div</span><span style="color: #0000ff">&gt;</span><br />            <span style="color: #0000ff">&lt;</span><span style="color: #800000">div</span> <span style="color: #ff0000">class</span><span style="color: #0000ff">=&quot;editor-field&quot;</span><span style="color: #0000ff">&gt;</span><br />                @Html.EditorFor(model =<span style="color: #0000ff">&gt;</span> model.Nom)<br />                @Html.ValidationMessageFor(model =<span style="color: #0000ff">&gt;</span> model.Nom)<br />            <span style="color: #0000ff">&lt;/</span><span style="color: #800000">div</span><span style="color: #0000ff">&gt;</span><br />    <br />            <span style="color: #0000ff">&lt;</span><span style="color: #800000">div</span> <span style="color: #ff0000">class</span><span style="color: #0000ff">=&quot;editor-label&quot;</span><span style="color: #0000ff">&gt;</span><br />                @Html.LabelFor(model =<span style="color: #0000ff">&gt;</span> model.Prenom)<br />            <span style="color: #0000ff">&lt;/</span><span style="color: #800000">div</span><span style="color: #0000ff">&gt;</span><br />            <span style="color: #0000ff">&lt;</span><span style="color: #800000">div</span> <span style="color: #ff0000">class</span><span style="color: #0000ff">=&quot;editor-field&quot;</span><span style="color: #0000ff">&gt;</span><br />                @Html.EditorFor(model =<span style="color: #0000ff">&gt;</span> model.Prenom)<br />                @Html.ValidationMessageFor(model =<span style="color: #0000ff">&gt;</span> model.Prenom)<br />            <span style="color: #0000ff">&lt;/</span><span style="color: #800000">div</span><span style="color: #0000ff">&gt;</span><br />    <br />            <span style="color: #0000ff">&lt;</span><span style="color: #800000">div</span> <span style="color: #ff0000">class</span><span style="color: #0000ff">=&quot;editor-label&quot;</span><span style="color: #0000ff">&gt;</span><br />                @Html.LabelFor(model =<span style="color: #0000ff">&gt;</span> model.Email)<br />            <span style="color: #0000ff">&lt;/</span><span style="color: #800000">div</span><span style="color: #0000ff">&gt;</span><br />            <span style="color: #0000ff">&lt;</span><span style="color: #800000">div</span> <span style="color: #ff0000">class</span><span style="color: #0000ff">=&quot;editor-field&quot;</span><span style="color: #0000ff">&gt;</span><br />                @Html.EditorFor(model =<span style="color: #0000ff">&gt;</span> model.Email)<br />                @Html.ValidationMessageFor(model =<span style="color: #0000ff">&gt;</span> model.Email)<br />            <span style="color: #0000ff">&lt;/</span><span style="color: #800000">div</span><span style="color: #0000ff">&gt;</span><br />    <br />            <span style="color: #0000ff">&lt;</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><br />                <span style="color: #0000ff">&lt;</span><span style="color: #800000">input</span> <span style="color: #ff0000">type</span><span style="color: #0000ff">=&quot;submit&quot;</span> <span style="color: #ff0000">value</span><span style="color: #0000ff">=&quot;Valider&quot;</span> <span style="color: #0000ff">/&gt;</span><br />            <span style="color: #0000ff">&lt;/</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><br />        <span style="color: #0000ff">&lt;/</span><span style="color: #800000">fieldset</span><span style="color: #0000ff">&gt;</span><br />     } </pre>
<p></div>
<p>Bon, un petit problème qui est tout à fait logique avec le Layout, mais le résultat est assez intéressant et je dirais correct à 100 % sur de vues simples et 95% sur des vues compliquées. Néanmoins, il est toujours nécessaire de vérifier si la conversion est correcte pour chaque fichier.</p>
<p>Seul petit bémol pour les développeurs VB.NET, l’outil  ne prend pas en charge la syntaxe VB.NET de Razor, donc vous ne pouvez pas l’utiliser pour convertir des fichiers aspx en vbhtml.</p>
<p>L&rsquo;outil peut être téléchargé manuellement sur <a href="http://visualstudiogallery.msdn.microsoft.com/d2bfd1ca-9808-417c-b963-eb1ea4896790">cette page</a>.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Article]Création des pages Web ASP.NET en utilisant le moteur de vue Razor</title>
		<link>https://blog.developpez.com/lilroma/p10248/net/article_creation_des_pages_web_asp_net_e</link>
		<comments>https://blog.developpez.com/lilroma/p10248/net/article_creation_des_pages_web_asp_net_e#comments</comments>
		<pubDate>Fri, 02 Sep 2011 17:15:18 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP.NET MVC 3]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[RAZOR]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Razor est un nouveau moteur de vue et de rendu ASP.NET qui a vu son apparition dans le Framework ASP.NET MVC 3 et l’environnement de développement WebMatrix. Nous allons dans cet article découvrir ce nouveau moteur de rendu ASP.NET, sa &#8230; <a href="https://blog.developpez.com/lilroma/p10248/net/article_creation_des_pages_web_asp_net_e">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Razor est un nouveau moteur de vue et de rendu ASP.NET qui a vu son apparition dans le Framework ASP.NET MVC 3 et l’environnement de développement WebMatrix.</p>
<p>Nous allons dans cet article découvrir ce nouveau moteur de rendu ASP.NET, sa syntaxe et comment créer des pages ASP.NET en utilisant Razor.</p>
<p>Razor a été conçu pour faciliter la conception des pages ASP.NET. Il introduit une syntaxe de programmation assez facilement compréhensible, qui vous permet d&rsquo;insérer du code serveur dans une page Web qui peut également contenir du HTML, du CSS et des scripts JavaScript.</p>
<p>Le moteur Razor est fluide, compact, expressif et s&rsquo;appuie sur la syntaxe des langages .NET C# et Visual Basic .NET. Il offre la puissance d&rsquo;ASP.NET pour la création rapide des applications Web fonctionnelles et sophistiquées.</p>
<p>L’article est regroupé au sein des chapitres suivants  :</p>
<p>    &#8211; <strong><a href="http://rdonfack.developpez.com/tutoriels/dotnet/creation-pages-web-asp-net-utilisant-moteur-vue-razor/?page=page_2">Présentation de Razor</a></strong></p>
<p>    &#8211; <strong><a href="http://rdonfack.developpez.com/tutoriels/dotnet/creation-pages-web-asp-net-utilisant-moteur-vue-razor/?page=page_3 ">Prise en charge dans Visual Studio 2010</a></strong></p>
<p>    &#8211; <strong><a href="http://rdonfack.developpez.com/tutoriels/dotnet/creation-pages-web-asp-net-utilisant-moteur-vue-razor/?page=page_4">Syntaxe de base de Razor</a></strong></p>
<p>    &#8211; <strong><a href="http://rdonfack.developpez.com/tutoriels/dotnet/creation-pages-web-asp-net-utilisant-moteur-vue-razor/?page=page_5">Les Layouts</a></strong></p>
<p>    &#8211; <strong><a href="http://rdonfack.developpez.com/tutoriels/dotnet/creation-pages-web-asp-net-utilisant-moteur-vue-razor/?page=page_6">Les Helpers Razor</a></strong></p>
<p>    &#8211; <strong><a href="http://rdonfack.developpez.com/tutoriels/dotnet/creation-pages-web-asp-net-utilisant-moteur-vue-razor/?page=page_7">Les formulaires dans les vues Razor</a></strong></p>
<p>    &#8211; <strong><a href="http://rdonfack.developpez.com/tutoriels/dotnet/creation-pages-web-asp-net-utilisant-moteur-vue-razor/?page=page_8">Manipulation des données</a></strong></p>
<p>    &#8211; <strong><a href="http://rdonfack.developpez.com/tutoriels/dotnet/creation-pages-web-asp-net-utilisant-moteur-vue-razor/?page=page_9">Razor references</a></strong></p>
<p>L&rsquo;article complet <a href="http://rdonfack.developpez.com/tutoriels/dotnet/creation-pages-web-asp-net-utilisant-moteur-vue-razor/">est disponible sur cette page</a>.</p>
<p>Télécharger <a href="ftp://ftp-developpez.com/rdonfack/tutoriels/dotnet/creation-pages-web-asp-net-utilisant-moteur-vue-razor/razor.pdf">la version PDF</a> (<a href="http://rdonfack.ftp-developpez.com/tutoriels/dotnet/creation-pages-web-asp-net-utilisant-moteur-vue-razor/razor.pdf">Miroir</a>).</p>
<p>Télécharger <a href="ftp://ftp-developpez.com/rdonfack/tutoriels/dotnet/creation-pages-web-asp-net-utilisant-moteur-vue-razor/razor.zip">la version hors-ligne</a> (<a href="http://rdonfack.ftp-developpez.com/tutoriels/dotnet/creation-pages-web-asp-net-utilisant-moteur-vue-razor/razor.zip">Miroir</a>).</p>
<p>Bonne lecture <img src="https://blog.developpez.com/lilroma/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Utilisation du Helper ASP.NET Razor Chart pour la génération des graphiques dans une application ASP.NET MVC 3</title>
		<link>https://blog.developpez.com/lilroma/p10231/net/utilisation_du_helper_asp_net_razor_char_3</link>
		<comments>https://blog.developpez.com/lilroma/p10231/net/utilisation_du_helper_asp_net_razor_char_3#comments</comments>
		<pubDate>Sat, 27 Aug 2011 10:15:46 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP.NET MVC 3]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[RAZOR]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[ASP.NET MVC 3 est accompagné de plusieurs nouveaux Helper Razor permettant de concevoir facilement des pages ASP.NET dynamiques. En ce jour, nous allons nous pencher sur le Helper Chart qui est un puissant outil permet de générer avec le minimum &#8230; <a href="https://blog.developpez.com/lilroma/p10231/net/utilisation_du_helper_asp_net_razor_char_3">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>ASP.NET MVC 3 est accompagné de plusieurs nouveaux Helper Razor permettant de concevoir facilement des pages ASP.NET dynamiques.</p>
<p>En ce jour, nous allons nous pencher sur le Helper Chart qui est un puissant outil permet de générer avec le minimum d’effort et de code des graphiques dans une page Web.</p>
<p>  Le Helper Chart est disponible au sein de l’espace de nom System.Web.Helper. Il supporte de nombreuses options de formatage, plusieurs sources de données (BD, fichier XML, etc.), permettant de générer plus de 30 types (histogrammes, camembert, diagramme en bâton, diagramme en secteur, etc.) de graphiques différents.</p>
<p><span id="more-32"></span></p>
<p>Nous verrons donc dans ce billet de blog comment utiliser ce composant dans une application ASP.NET MVC 3 Razor pour afficher un graphique à partir des données d’un fichier XML, comment formater les données et définir les thèmes qui seront appliqués au graphique.</p>
<p>Pour commencer, nous allons d’abord créer une nouvelle application Web ASP.NET MVC 3.</p>
<p>Dans le dossier App Data, nous allons ajouter un fichier XML ayant pour nom « Produits.xml ».</p>
<p>Ensuite, nous allons copier les données suivantes dans ce fichier :</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 900px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">&lt;?</span><span style="color: #800000">xml</span> <span style="color: #ff0000">version</span><span style="color: #0000ff">=&quot;1.0&quot;</span> <span style="color: #ff0000">encoding</span><span style="color: #0000ff">=&quot;utf-8&quot;</span> ?<span style="color: #0000ff">&gt;</span><br /><span style="color: #0000ff">&lt;</span><span style="color: #800000">Produits</span><span style="color: #0000ff">&gt;</span><br />  <span style="color: #0000ff">&lt;</span><span style="color: #800000">Produit</span><span style="color: #0000ff">&gt;</span><br />    <span style="color: #0000ff">&lt;</span><span style="color: #800000">Libelle</span><span style="color: #0000ff">&gt;</span>Disque dur<span style="color: #0000ff">&lt;/</span><span style="color: #800000">Libelle</span><span style="color: #0000ff">&gt;</span><br />    <span style="color: #0000ff">&lt;</span><span style="color: #800000">Qte_vendu</span><span style="color: #0000ff">&gt;</span>45<span style="color: #0000ff">&lt;/</span><span style="color: #800000">Qte_vendu</span><span style="color: #0000ff">&gt;</span><br />  <span style="color: #0000ff">&lt;/</span><span style="color: #800000">Produit</span><span style="color: #0000ff">&gt;</span><br />  <span style="color: #0000ff">&lt;</span><span style="color: #800000">Produit</span><span style="color: #0000ff">&gt;</span><br />    <span style="color: #0000ff">&lt;</span><span style="color: #800000">Libelle</span><span style="color: #0000ff">&gt;</span>Clé USB<span style="color: #0000ff">&lt;/</span><span style="color: #800000">Libelle</span><span style="color: #0000ff">&gt;</span><br />    <span style="color: #0000ff">&lt;</span><span style="color: #800000">Qte_vendu</span><span style="color: #0000ff">&gt;</span>66<span style="color: #0000ff">&lt;/</span><span style="color: #800000">Qte_vendu</span><span style="color: #0000ff">&gt;</span><br />  <span style="color: #0000ff">&lt;/</span><span style="color: #800000">Produit</span><span style="color: #0000ff">&gt;</span><br />  <span style="color: #0000ff">&lt;</span><span style="color: #800000">Produit</span><span style="color: #0000ff">&gt;</span><br />    <span style="color: #0000ff">&lt;</span><span style="color: #800000">Libelle</span><span style="color: #0000ff">&gt;</span>Barette memoire<span style="color: #0000ff">&lt;/</span><span style="color: #800000">Libelle</span><span style="color: #0000ff">&gt;</span><br />    <span style="color: #0000ff">&lt;</span><span style="color: #800000">Qte_vendu</span><span style="color: #0000ff">&gt;</span>15<span style="color: #0000ff">&lt;/</span><span style="color: #800000">Qte_vendu</span><span style="color: #0000ff">&gt;</span><br />  <span style="color: #0000ff">&lt;/</span><span style="color: #800000">Produit</span><span style="color: #0000ff">&gt;</span><br />  <span style="color: #0000ff">&lt;</span><span style="color: #800000">Produit</span><span style="color: #0000ff">&gt;</span><br />    <span style="color: #0000ff">&lt;</span><span style="color: #800000">Libelle</span><span style="color: #0000ff">&gt;</span>Souris<span style="color: #0000ff">&lt;/</span><span style="color: #800000">Libelle</span><span style="color: #0000ff">&gt;</span><br />    <span style="color: #0000ff">&lt;</span><span style="color: #800000">Qte_vendu</span><span style="color: #0000ff">&gt;</span>22<span style="color: #0000ff">&lt;/</span><span style="color: #800000">Qte_vendu</span><span style="color: #0000ff">&gt;</span><br />  <span style="color: #0000ff">&lt;/</span><span style="color: #800000">Produit</span><span style="color: #0000ff">&gt;</span><br />  <span style="color: #0000ff">&lt;</span><span style="color: #800000">Produit</span><span style="color: #0000ff">&gt;</span><br />    <span style="color: #0000ff">&lt;</span><span style="color: #800000">Libelle</span><span style="color: #0000ff">&gt;</span>Clavier<span style="color: #0000ff">&lt;/</span><span style="color: #800000">Libelle</span><span style="color: #0000ff">&gt;</span><br />    <span style="color: #0000ff">&lt;</span><span style="color: #800000">Qte_vendu</span><span style="color: #0000ff">&gt;</span>12<span style="color: #0000ff">&lt;/</span><span style="color: #800000">Qte_vendu</span><span style="color: #0000ff">&gt;</span><br />  <span style="color: #0000ff">&lt;/</span><span style="color: #800000">Produit</span><span style="color: #0000ff">&gt;</span><br />  <span style="color: #0000ff">&lt;</span><span style="color: #800000">Produit</span><span style="color: #0000ff">&gt;</span><br />    <span style="color: #0000ff">&lt;</span><span style="color: #800000">Libelle</span><span style="color: #0000ff">&gt;</span>Moniteur<span style="color: #0000ff">&lt;/</span><span style="color: #800000">Libelle</span><span style="color: #0000ff">&gt;</span><br />    <span style="color: #0000ff">&lt;</span><span style="color: #800000">Qte_vendu</span><span style="color: #0000ff">&gt;</span>3<span style="color: #0000ff">&lt;/</span><span style="color: #800000">Qte_vendu</span><span style="color: #0000ff">&gt;</span><br />  <span style="color: #0000ff">&lt;/</span><span style="color: #800000">Produit</span><span style="color: #0000ff">&gt;</span><br /><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Produits</span><span style="color: #0000ff">&gt;</span> <br /></pre>
<p></div>
<p>Nous allons dans un premier temps créer le modèle qui permettra de retourner les données du fichier XML dans un DataView. Le code qui sera utilisé est le suivant :</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> ChartModel<br />    {<br />        <span style="color: #0000ff">public</span> DataView Getdata()<br />        {<br />            DataSet Ds = <span style="color: #0000ff">new</span> DataSet();<br />            Ds.ReadXml(HttpContext.Current.Server.MapPath(<span style="color: #006080">&quot;~/App_Data/Produits.xml&quot;</span>));<br />            var Dv = <span style="color: #0000ff">new</span> DataView(Ds.Tables[0]);<br />            <span style="color: #0000ff">return</span> Dv;<br />        }<br />    }<br /></pre>
<p></div>
<p>On va ensuite ajouter au contrôleur une méthode d’action ChartProduit. Le code de cette méthode est le suivant :</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 300px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">public</span> ActionResult ChartProduit()<br />        {<br />            var model = <span style="color: #0000ff">new</span> ChartModel();<br />            var dataView = model.Getdata();<br /><br />            var Mychart = <span style="color: #0000ff">new</span> Chart(width: 600, height: 400)<br />           .AddTitle(<span style="color: #006080">&quot;Produits et quantités vendus le 05/08/2011&quot;</span>)<br />           .AddSeries(<span style="color: #006080">&quot;Default&quot;</span>,<br />                 xValue: dataView, xField: <span style="color: #006080">&quot;Libelle&quot;</span>,<br />                 yValues: dataView, yFields: <span style="color: #006080">&quot;Qte_vendu&quot;</span>)<br />            .GetBytes(<span style="color: #006080">&quot;png&quot;</span>);<br />            <span style="color: #0000ff">return</span> File(Mychart, <span style="color: #006080">&quot;image/png&quot;</span>);<br />        }<br /></pre>
<p></div>
<p>Avant de continuer, jetons un petit coup d’œil sur le code de la méthode d’action.</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">var Mychart = <span style="color: #0000ff">new</span> Chart(width: 600, height: 400)</pre>
<p></div>
<p>Est utilisé pour instancier un nouvel objet Chart en spécifiant sa taille.</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">.AddSeries(<span style="color: #006080;">"Default"</span>,<br />                 xValue: dataView, xField: <span style="color: #006080;">"Libelle"</span>,<br />                 yValues: dataView, yFields: <span style="color: #006080;">"Qte_vendu"</span>)<br /></pre>
<p></div>
<p>Permet de définir le type de graphique,  les colonnes qui seront utilisées en abscisse et en ordonnée.</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">.GetBytes(<span style="color: #006080">&quot;png&quot;</span>); </pre>
<p></div>
<p>Va retourner une image de notre graphique au format png sous forme d’un tableau de bytes.</p>
<p>Dans la vue (la page index de l’application), nous allons simplement ajouter la ligne de code suivante pour afficher l’image qui sera retournée par le contrôleur.</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">img</span> <span style="color: #ff0000;">src</span><span style="color: #0000ff;">="@Url.Action("</span><span style="color: #ff0000;">ChartProduit</span><span style="color: #0000ff;">")"</span> <span style="color: #0000ff;">/&gt;</span></pre>
<p></div>
<p>À l’exécution, nous obtenons le résultat suivant :</p>
<p><img src="http://blog.developpez.com/media/image1.PNG" width="598" height="475" alt="" /></p>
<p>L’exemple ci-dessous montre un graphique avec le thème par défaut. Je vais maintenant définira moi-même le thème qui sera appliqué à celui-ci.</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"><span style="color: #0000ff;">public</span> ActionResult ChartProduit()<br />        {<br />            var model = <span style="color: #0000ff;">new</span> ChartModel();<br />            var dataView = model.Getdata();<br /><br />            var Mychart = <span style="color: #0000ff;">new</span> Chart(width: 600, height: 400)<br />           .AddTitle(<span style="color: #006080;">"Produits et quantités vendus le 05/08/2011"</span>)<br />           .AddSeries(chartType: ChartTheme.Green, <br />                 xValue: dataView, xField: <span style="color: #006080;">"Libelle"</span>,<br />                 yValues: dataView, yFields: <span style="color: #006080;">"Qte_vendu"</span>)<br />            .GetBytes(<span style="color: #006080;">"png"</span>);<br />            <span style="color: #0000ff;">return</span> File(Mychart, <span style="color: #006080;">"image/png"</span>);<br />        }<br /></pre>
<p></div>
<p>Ce qui va donner à l’exécution le résultat suivant : </p>
<p><img src="http://blog.developpez.com/media/image.PNG" width="524" height="475" alt="" /></p>
<p>Je peux également changer le type de graphique et afficher un diagramme en secteur.</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 400px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">public</span> ActionResult ChartProduit()<br />      {<br />          var model = <span style="color: #0000ff">new</span> ChartModel();<br />          var dataView = model.Getdata();<br />          var Mychart = <span style="color: #0000ff">new</span> Chart(width: 600, height: 400, theme: ChartTheme.Vanilla3D)<br />             .AddSeries(<span style="color: #006080">&quot;Default&quot;</span>,chartType: <span style="color: #006080">&quot;pie&quot;</span>,<br />               xValue: dataView, xField: <span style="color: #006080">&quot;Libelle&quot;</span>,<br />               yValues: dataView, yFields: <span style="color: #006080">&quot;Qte_vendu&quot;</span>)<br />             .GetBytes(<span style="color: #006080">&quot;png&quot;</span>);<br />          <span style="color: #0000ff">return</span> File(Mychart, <span style="color: #006080">&quot;image/png&quot;</span>);<br />      }<br /></pre>
<p></div>
<p>Ce qui me donne le résultat suivant à l’exécution :</p>
<p><img src="http://blog.developpez.com/media/image2.PNG" width="511" height="471" alt="" /></p>
<p> À noter que vous pouvez définir vos propres thèmes qui seront appliqués au graphique.</p>
<p> La création d’un graphique s’avère relativement simple avec ASP.NET MVC3 grâce au Helper Chart. Vous vous rendez compte à travers ce billet de blog qu’il est facile d’utiliser ce composant. Vous constatez également que le Helper Chart dispose de plusieurs types de graphiques et de plusieurs thèmes pour styler l’affichage à votre convenance.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
