<?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; RAZOR</title>
	<atom:link href="https://blog.developpez.com/lilroma/pcategory/net/asp-net/razor/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>[Tutoriel]Création d’une application CRUD avec WebMatrix, Razor et Entity Framework</title>
		<link>https://blog.developpez.com/lilroma/p11023/net/tutoriel_creation_d_une_application_crud</link>
		<comments>https://blog.developpez.com/lilroma/p11023/net/tutoriel_creation_d_une_application_crud#comments</comments>
		<pubDate>Mon, 14 May 2012 10:00:56 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[Nuget]]></category>
		<category><![CDATA[RAZOR]]></category>
		<category><![CDATA[WebMatrix]]></category>
		<category><![CDATA[WebPages]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Salut, Les cinq articles de blog qui présentaient pas à pas comment créer une application CRUD avec WebMatrix, Razor et Entity Framework ont été regroupés en un seul tutoriel qui vient d’être publié sur Developpez.com. J&#8217;ai eu à développer récemment &#8230; <a href="https://blog.developpez.com/lilroma/p11023/net/tutoriel_creation_d_une_application_crud">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Salut,</p>
<p> Les cinq articles de blog qui présentaient pas à pas comment créer une application CRUD avec WebMatrix, Razor et Entity Framework ont été regroupés en un seul tutoriel qui vient d’être publié sur Developpez.com.</p>
<blockquote><p>J&rsquo;ai eu à développer récemment une application CRUD avec WebMatrix. Utilisant principalement la classe DataBase de l&rsquo;espace de nom Microsoft.Data pour la manipulation des données, lorsque j&rsquo;ai aperçu Entity Framework dans les packages NuGet avec WebMatrix 2 bêta, je me suis dit &laquo;&nbsp;génial&nbsp;&raquo; ! Ça veut dire que je peux l&rsquo;utiliser dans ma solution.</p>
<p>J&rsquo;ai donc opté pour l&rsquo;utilisation de la bibliothèque au sein de mon application WebMatrix. Entity Framework est en passe de devenir un standard pour la manipulation des données et est recommandé par Microsoft.</p>
<p>Contrairement à Visual Studio et ASP.NET ou l&rsquo;on dispose de plusieurs outils rendant facile la conception d&rsquo;une application CRUD avec Entity Framework, sur WebMatrix, c&rsquo;est un peu compliqué et l&rsquo;on ne dispose pas des fonctionnalités comme l&rsquo;échafaudage, et encore moins des ressources sur Internet.</p>
<p>C&rsquo;est pourquoi j&rsquo;ai décidé de fournir au travers de cet article une démarche pas à pas avec autant de détails que possible pour la conception d&rsquo;une application CRUD avec WebMatrix, Razor et Entity Framework.</p>
<p>Le lecteur, tout au long de ce tutoriel, pourra se familiariser avec WebMatrix, Razor, Entity Framework, le gestionnaire de packages open source .NET NuGet pour WebMatrix et le gestionnaire de base de données SQL Server Compact Edition.</p>
<p>Cet article est essentiellement destiné aux débutants. Aucun prérequis n&rsquo;est donc nécessaire pour sa bonne compréhension. Il est néanmoins préférable d&rsquo;avoir des connaissances de base en programmation orientée objet avec C# et d&rsquo;être familiarisé avec WebMatrix et Razor. Si ce n&rsquo;est pas le cas, je vous conseille de lire dans un premier temps mon tutoriel de présentation de WebMatrix, ainsi que mon tutoriel sur Razor.</p></blockquote>
<p> &#8211; <a href="http://rdonfack.developpez.com/tutoriels/dotnet/webmatrix-application-crud-entity-framework/">Consulter le tutoriel complet</a></p>
<p> &#8211; <a href="http://rdonfack.developpez.com/tutoriels/dotnet/webmatrix-application-crud-entity-framework/webmatrixcrudapp.pdf">Télécharger la version PDF</a></p>
<p> &#8211; <a href="http://rdonfack.developpez.com/tutoriels/dotnet/webmatrix-application-crud-entity-framework/webmatrixcrudapp.zip">Télécharger la version hors-ligne</a></p>
<p> &#8211; <a href="http://rdonfack.developpez.com/tutoriels/dotnet/webmatrix-application-crud-entity-framework/webmatrixcrudapp-ebooks.zip">Télécharger la version eBook</a></p>
<p> &#8211; Télécharger le code source de l&rsquo;application d&rsquo;exemple :</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>
<p>&#8211; <a href="http://www.developpez.net/forums/showthread.php?t=1214877">Pour les commentaires c&rsquo;est par ici </a></p>
<p><strong>Bonne lecture</strong> <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>20</slash:comments>
		</item>
		<item>
		<title>Création d’une application CRUD avec WebMatrix, Razor et Entity Framework Part 3 : création du DBContext et du Repository</title>
		<link>https://blog.developpez.com/lilroma/p10896/net/creation_d_une_application_crud_avec_web_2</link>
		<comments>https://blog.developpez.com/lilroma/p10896/net/creation_d_une_application_crud_avec_web_2#comments</comments>
		<pubDate>Sat, 31 Mar 2012 10:33:30 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></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/p10896/net/creation_d_une_application_crud_avec_web_2">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>Dans les parties précédentes, nous nous sommes familiarisés avec les outils que nous allons utiliser, et nous avons par la suite procédé à la création de l’application et à la définition du modèle objet qui sera utilisé.</p>
<p>Cette partie portera sur la création du DbContext, la définition de la chaine de connexion dans le fichier Web.Config, la création de la base de données à partir du modèle objet et afin la définition du Repository qui sera utilisé.</p>
<p><span id="more-55"></span></p>
<p><strong>Création du DBContex</strong></p>
<p>Nous allons maintenant créer la classe qui va s’occuper de gérer la communication entre les classes entités et la base de données.  Cette classe va hériter de la classe DbContext.</p>
<p>La classe DbContext expose les fonctionnalités les plus couramment utilisées pour interroger et puis utiliser les données d’entité en tant qu’objet.</p>
<p>Vous allez ajouter au dossier App_Code un nouveau fichier de classe  ayant pour nom « WebMatrixCrudApp.Context.cs ».</p>
<p>Dans ce fichier, vous allez ajouter une nouvelle classe « WebMatrixCrudAppContext » qui hérite de DbContext.</p>
<p>Cette classe doit contenir trois attributs DbSet fortement typés correspondants à vos différentes entités.  Les attributs DbSet vont permettre de gérer la correspondance avec les tables de la base de données.</p>
<p>Dans ce fichier, vous aurez le code suivant :</p>
<div 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">using</span> System;<br /><span style="color: #0000ff">using</span> System.Data.Entity;<br /><br /><span style="color: #008000">/// &lt;summary&gt;</span><br /><span style="color: #008000">/// Summary description for ClassName</span><br /><span style="color: #008000">/// &lt;/summary&gt;</span><br /><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> WebMatrixCrudAppContext : DbContext <br />{<br />    <span style="color: #0000ff">public</span> DbSet&lt;Personne&gt; Personnes { get; set; }<br />    <span style="color: #0000ff">public</span> DbSet&lt;Organisme&gt; Organismes {get; set; }<br />    <span style="color: #0000ff">public</span> DbSet&lt;Affiliation&gt; Affiliations {get; set; }<br />    <br />}<br /></pre>
<p></div>
<p>La prochaine étape sera l’ajout de la chaine de connexion pour le mode Code First d’Entity Framework dans le fichier Web.config.</p>
<p>Pour cela, doublez cliquez sur le fichier Web.config dans l’explorateur de solution et ajoutez les lignes de code suivantes à celui-ci :</p>
<div id="codeSnippetWrapper">
<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;">connectionStrings&gt;<br />        &lt;add name=<span style="color: #006080;">"WebMatrixCrudAppContext"</span> connectionString=<span style="color: #006080;">"Data Source=|DataDirectory|WebMatrixCrudApp.sdf"</span> <br />             providerName=<span style="color: #006080;">"System.Data.SqlServerCe.4.0"</span> /&gt;<br />    &lt;/connectionStrings&gt;</pre>
<p></div>
<p>Le nom de la chaîne de connexion doit être celui de votre classe DbContext (WebMatrixCrudAppContext) </p>
<p>Le fichier XML de configuration de votre application doit ressembler à ceci :</p>
<div 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">&lt;?xml version=<span style="color: #006080">&quot;1.0&quot;</span> encoding=<span style="color: #006080">&quot;utf-8&quot;</span>?&gt;<br />&lt;configuration&gt;<br />  &lt;system.web&gt;<br />    &lt;compilation&gt;<br />      &lt;assemblies&gt;<br />        &lt;add assembly=<span style="color: #006080">&quot;System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot;</span> /&gt;<br />      &lt;add assembly=<span style="color: #006080">&quot;System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35&quot;</span> /&gt;&lt;/assemblies&gt;<br />    &lt;/compilation&gt;<br />  &lt;/system.web&gt;<br />    &lt;connectionStrings&gt;<br />        &lt;add name=<span style="color: #006080">&quot;WebMatrixCrudAppContext&quot;</span> connectionString=<span style="color: #006080">&quot;Data Source=|DataDirectory|WebMatrixCrudApp.sdf&quot;</span> <br />             providerName=<span style="color: #006080">&quot;System.Data.SqlServerCe.4.0&quot;</span> /&gt;<br />    &lt;/connectionStrings&gt;<br />&lt;/configuration&gt;<br /></pre>
<p></div>
<p>Procédez à l’exécution de votre application en cliquant sur le bouton « Run » et sélectionnez le navigateur de votre choix dans la boite d’outils.</p>
<p>La base de données SQL Server Compact « WebMatrixCrudApp.sdf » sera automatiquement créée dans le dossier App_data de votre application.</p>
<p>En sélectionnant l’espace de données Databases, vous pouvez constater qu’une nouvelle base de données a été ajoutée à votre application. </p>
<p><img src="http://blog.developpez.com/media/createdatabase.PNG" width="827" height="549" alt="" /></p>
<p>En observant cette base de données, vous vous  rendez compte que les tables qui ont été créées correspondent aux propriétés DbSet de la  classe WebMatrixCrudAppContext.<br />
On remarque également que la taille des colonnes Nom et Prenom par exemple de la table Personnes  est la même que celle que vous avez défini dans la classe Personne avec l’attribut [MaxLengthAttribute(50)]</p>
<p>En sélectionnant la table Affiliations et en cliquant sur la commande View de la zone Relationships, vous constatez également que les relations de clés étrangères qui ont été définies pour la classe Affiliation ont été créées.</p>
<p><img src="http://blog.developpez.com/media/RelationShips.PNG" width="826" height="548" alt="" /></p>
<p>En cliquant par exemple sur la relation Affiliation_Organisme, vous obtenez le résultat suivant :</p>
<p><img src="http://blog.developpez.com/media/CreateNewRelation.PNG" width="486" height="439" alt="" /></p>
<p>Une table supplémentaire EdmMataData a été ajoutée dans votre base de données. Cette table permet à Entity Framework Code First de savoir si le modèle utilisé pour créer une base de données est le même que celui qui est utilisé pour accéder à cette base de données (avec la version 4.3 d’EF cette table n’est plus créée).</p>
<p>Dans le cas au vous apportez des modifications à votre modèle objet,  lors de l’exécution de l’application une exception sera levée.</p>
<p>Pour corriger cela,  vous allez ajouter les lignes de code suivantes dans le fichier _AppStart qui se trouve à la racine de votre application :</p>
<div id="codeSnippetWrapper">
<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> DB = System.Data.Entity;<br />@{<br />  <br />    DB.Database.SetInitializer(<span style="color: #0000ff;">new</span> DB.DropCreateDatabaseIfModelChanges&lt;WebMatrixCrudAppContext&gt;());<br />}</pre>
<p></div>
<p>En cas de modification du modèle objet lors de l’exécution de l’application, ces lignes de code vont permettre de régénérer la base de données qui correspondra au nouveau modèle.</p>
<p>Attention, la base de données sera recréée à nouveau, donc toutes les données présentes dans celle-ci seront perdues.</p>
<p><strong>Création d’un Repository</strong></p>
<p>Les bonnes pratiques de développement avec Entity Framework recommandent l’utilisation d’un Repository pour les opérations CRUD. Le Repository permet de créer une couche d’abstraction entre la couche d’accès aux données et la logique métier de l’application, et éviter ainsi une dépendance entre la base de données et la logique métier.</p>
<p>Le code du Repository permettant d’effectuer des opérations CRUD sur l’entité Personne est le suivant :</p>
<div 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">using</span> System;<br /><span style="color: #0000ff">using</span> System.Collections.Generic;<br /><span style="color: #0000ff">using</span> System.Data;<br /><span style="color: #0000ff">using</span> System.Data.Entity;<br /><span style="color: #0000ff">using</span> System.Web;<br /><br /><span style="color: #008000">/// &lt;summary&gt;</span><br /><span style="color: #008000">/// Summary description for ClassName</span><br /><span style="color: #008000">/// &lt;/summary&gt;</span><br /><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> PersonneRepository<br />{<br />    <span style="color: #0000ff">private</span> WebMatrixCrudAppContext _context = <span style="color: #0000ff">new</span> WebMatrixCrudAppContext();<br /><br />    <span style="color: #0000ff">public</span> Personne Find(<span style="color: #0000ff">int</span> id)<br />    {<br />        <span style="color: #0000ff">return</span> _context.Personnes.Find(id);<br />    }<br /><br />    <span style="color: #0000ff">public</span> List&lt;Personne&gt; GetAll()<br />    {<br />       <span style="color: #0000ff">return</span> _context.Personnes.ToList();<br /><br />    } <br /><br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> Add(Personne personne)<br /><br />    {<br />        _context.Personnes.Add(personne);<br />       _context.SaveChanges();<br />    }<br /><br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> Delette(Personne  personne)<br />    {<br />       _context.Personnes.Remove(personne);<br />       _context.SaveChanges();<br />    }<br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> Update(Personne personne)<br />    {<br />      _context.Entry(personne).State = EntityState.Modified;<br />      _context.SaveChanges();<br />    <br />    }<br /><br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> Remove(Personne personne)<br />    {<br />      _context.Personnes.Remove(personne);<br />      _context.SaveChanges();<br />    }<br />}</pre>
<p></div>
<p>Ce code doit être ajouté dans un fichier PersonneRepository.cs dans le dossier App_Code. Créez de même les Repository pour les entités Organisme et Affiliation respectivement dans les fichiers OrganismeRepository.cs et AffiliationRepository.cs.<br />
La fonction Find() pour AffiliationRepository doit prendre deux valeurs en paramètre. Le code doit ressembler à ceci :</p>
<div id="codeSnippetWrapper">
<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> Affiliation Find(<span style="color: #0000ff;">int</span> personneId, <span style="color: #0000ff;">int</span> organismeId)<br />    {<br />        <span style="color: #0000ff;">return</span> _context.Affiliations.Find(personneId, organismeId);<br />    }</pre>
<p></div>
<p>La partie suivante portera sur l’implémentation des fonctionnalités CRUD pour nos différentes tables.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</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>Création d’une application CRUD avec WebMatrix, Razor et Entity Framework Part 4 : Implémentation des fonctionnalités CRUD</title>
		<link>https://blog.developpez.com/lilroma/p10980/net/creation_d_une_application_crud_avec_web_3</link>
		<comments>https://blog.developpez.com/lilroma/p10980/net/creation_d_une_application_crud_avec_web_3#comments</comments>
		<pubDate>Wed, 25 Apr 2012 10:51:38 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[Nuget]]></category>
		<category><![CDATA[RAZOR]]></category>
		<category><![CDATA[WebMatrix]]></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/p10980/net/creation_d_une_application_crud_avec_web_3">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>Dans les parties précédentes, nous nous sommes familiarisés avec outils utilisés, nous avons procédé à la création de l’application, à la définition du modèle objet qui sera utilisé ainsi qu&rsquo;à la création du DBContex et du Repository.</p>
<p>Dans cette partie, nous allons nous plonger dans le vif du sujet en implémentant les interfaces Web pour la lecture, la modification, la suppression et l&rsquo;enregistrement des données dans votre base de données.</p>
<p><span id="more-56"></span></p>
<p>Vous allez dans un premier temps créé un nouveau dossier Personne qui contiendra tous les fichiers pour la gestion des personnes.</p>
<p><strong>1 &#8211; Implémentation de la grille des données</strong></p>
<p>Dans le dossier Personne, ajoutez un nouveau fichier Index.cshtml.</p>
<p>Vous allez ensuite ajouter en début de ce fichier les lignes de code permettant de retourner la liste des personnes qui sont enregistrées dans la base de données. Cette liste sera par la suite affichée grâce au Helper Razor WebGrid, qui va être instancié en passant en paramètre la collection des données qui doivent être affichées et le nombre d&rsquo;éléments sur une page.</p>
<div 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 />var pr = <span style="color: #0000ff">new</span> PersonneRepository();<br />var grid = <span style="color: #0000ff">new</span> WebGrid(pr.GetAll(),rowsPerPage : 10);</pre>
<p></div>
<p>Avant d&rsquo;afficher la grille, vous allez procéder au formatage de celle-ci en définissant les colonnes qui seront affichées et en ajoutant notamment de nouvelles colonnes pour l&rsquo;édition, la consultation et la suppression d&rsquo;une ligne de la grille.</p>
<p>Le code pour effectuer cela 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">@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;Nom&quot;</span>,<span style="color: #006080">&quot;Nom&quot;</span>),<br />             grid.Column(<span style="color: #006080">&quot;Prenom&quot;</span>, <span style="color: #006080">&quot;Prénom&quot;</span>),<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/@item.PersonneId&quot;</span>)&gt;Editer&lt;/a&gt; <br />                       | &lt;a href=<span style="color: #006080">&quot;Details/@item.PersonneId&quot;</span>)&gt;Détails&lt;/a&gt; <br />                         | &lt;a href=<span style="color: #006080">&quot;Delete/@item.PersonneId&quot;</span>)&gt;Supprimer&lt;/a&gt;&lt;/text&gt;)                                                                                     <br />                )<br />        <br />        )</pre>
<p></div>
<p>Le code complet de la page Index.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: 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; 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 />    <span style="color: #008000">// Set the layout page and page title</span><br />    Layout = <span style="color: #006080">&quot;~/_SiteLayout.cshtml&quot;</span>;<br />    Page.Title = <span style="color: #006080">&quot;Register an Account&quot;</span>;<br /><br />    var pr = <span style="color: #0000ff">new</span> PersonneRepository();<br />    var grid = <span style="color: #0000ff">new</span> WebGrid(pr.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;Personnes.&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 />        <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;Nom&quot;</span>,<span style="color: #006080">&quot;Nom&quot;</span>),<br />                      grid.Column(<span style="color: #006080">&quot;Prenom&quot;</span>, <span style="color: #006080">&quot;Prénom&quot;</span>),<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/@item.PersonneId&quot;</span>)&gt;Editer&lt;/a&gt; <br />                              | &lt;a href=<span style="color: #006080">&quot;Details/@item.PersonneId&quot;</span>)&gt;Détails&lt;/a&gt; <br />                              | &lt;a href=<span style="color: #006080">&quot;Delete/@item.PersonneId&quot;</span>)&gt;Supprimer&lt;/a&gt;&lt;/text&gt;)                                                                                     <br />                )<br />        <br />        )</pre>
<p></div>
<p>La ligne de code :</p>
<div id="codeSnippetWrapper">
<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 />&lt;p&gt;&lt;a href=<span style="color: #006080;">"Create"</span>&gt;Ajouter un nouvel enregistrement&lt;/a&gt;&lt;/p&gt;</pre>
<p></div>
<p>va permettre d&rsquo;ajouter les nouvelles informations sur une personne dans la BD. À 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/ListePersonnes.PNG" alt="" title="" /></p>
<p>le code CSS que j&rsquo;ai utilisé pour le WebGrid et qui a été défini dans le fichier Site.css pour être appliqué à toutes les grilles de l&rsquo;application 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;">.grid { margin: 4px; border-collapse: collapse; width: 600px; }<br /> .head { background-color: #E8E8E8; font-weight: bold; color: #FFF; }<br /> .grid th, .grid td { border: 1px solid #C0C0C0; padding: 5px; }<br /> .altrow { background-color: #E8E8E8; color: #000; }</pre>
<p></div>
<p><strong>2 &#8211; Affichage détaillé </strong></p>
<p>mpte tenu du fait que dans certains cas, il vous sera impossible de présenter toutes les informations sur une entité sur une ligne de la grille, un lien qui pointe sur une page &nbsp;&raquo; Details &nbsp;&raquo; a été introduit donc pour afficher des informations détaillées sur une personne.</p>
<p>Nous verrons ici comment implémenter l&rsquo;interface Web de cette page. Pour cela, vous allez ajouter un nouveau fichier Edit.cshtml dans le dossier Personne.</p>
<p>Au début de ce fichier, vous allez déclarer une variable pour récupérer l&rsquo;id qui est passé comme paramètre HTTP. La méthode Find() sera utilisée pour retourner l&rsquo;élément dans la base de données dont l&rsquo;identifiant est égal à celui qui est passé en paramètre.</p>
<p>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;"><span style="color: #0000ff;">int</span> id = Request[<span style="color: #006080;">"id"</span>].AsInt();<br />    var pr = <span style="color: #0000ff;">new</span> PersonneRepository();<br />    var personne = <span style="color: #0000ff;">new</span> Personne();<br />    personne = pr.Find(id);</pre>
<p></div>
<p>Il ne vous reste plus qu&rsquo;à afficher les informations contenues dans la variable personne dans votre code html.</p>
<p>Le code complet de la page Details.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: 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 />@{<br />    <span style="color: #008000">// Set the layout page and page title</span><br />    Layout = <span style="color: #006080">&quot;~/_SiteLayout.cshtml&quot;</span>;<br />    Page.Title = <span style="color: #006080">&quot;Détails&quot;</span>;<br />   <br />    <span style="color: #0000ff">int</span> id = Request[<span style="color: #006080">&quot;id&quot;</span>].AsInt();<br />    var pr = <span style="color: #0000ff">new</span> PersonneRepository();<br />    var personne = <span style="color: #0000ff">new</span> Personne();<br />    personne = pr.Find(id);<br />                  <br />}    <br />&lt;hgroup <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;title&quot;</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">&quot;nom&quot;</span>&gt;<br />                &lt;label&gt;Nom:&lt;/label&gt;<br />                &lt;label&gt;@personne.Nom&lt;/label&gt;<br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;prenom&quot;</span>&gt;<br />                &lt;label&gt;Prénom:&lt;/label&gt;<br />                &lt;label&gt;@personne.Prenom&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">&quot;Edit?id=@id&quot;</span>&gt;Editer&lt;/a&gt; |<br /> &lt;a href=<span style="color: #006080">&quot;Index&quot;</span>&gt;Retour à la liste&lt;/a&gt;<br />&lt;/p&gt;</pre>
<p></div>
<p>Ce qui permet d&rsquo;obtenir le résultat suivant à l&rsquo;exécution, après un clic sur le lien Détails d&rsquo;une ligne de la grille contenant la liste des personnes :</p>
<p><img src="http://rdonfack.developpez.com/tutoriels/dotnet/webmatrix-application-crud-entity-framework/images/detailspersonne.PNG" alt="" title="" /></p>
<p><strong>3 &#8211; Enregistrement des données</strong></p>
<p>Dans la page affichant la liste des personnes, vous avez ajouté un lien permettant d&rsquo;accéder à la page d&rsquo;ajout d&rsquo;un nouvel enregistrement. Penchons-nous maintenant sur l&rsquo;implémentation de cette page. Vous allez ajouter une nouvelle page dans le dossier Personne. Il suffit pour cela de faire un clic droit sur le dossier Personne, sélectionner &nbsp;&raquo; New Files &nbsp;&raquo; et créer un nouveau fichier &nbsp;&raquo; create.cshtml &nbsp;&raquo; dans la fenêtre qui va s&rsquo;afficher.</p>
<p>Le code source du formulaire d&rsquo;enregistrement d&rsquo;une personne 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: 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">&lt;form method=<span style="color: #006080">&quot;post&quot;</span> action=<span style="color: #006080">&quot;&quot;</span>&gt;<br />    @* Notification en cas d'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;Registration Form&lt;/legend&gt;<br />        &lt;ol&gt;<br />            &lt;li <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;nom&quot;</span>&gt;<br />                &lt;label <span style="color: #0000ff">for</span>=<span style="color: #006080">&quot;nom&quot;</span> @<span style="color: #0000ff">if</span>(!ModelState.IsValidField(<span style="color: #006080">&quot;nom&quot;</span>)){&lt;text&gt;<span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;error-label&quot;</span>&lt;/text&gt;}&gt;Nom:&lt;/label&gt;<br />                &lt;input type=<span style="color: #006080">&quot;text&quot;</span> id=<span style="color: #006080">&quot;nom&quot;</span> name=<span style="color: #006080">&quot;nom&quot;</span> title=<span style="color: #006080">&quot;Nom&quot;</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;@nom&quot;</span> @Validation.GetHtml(<span style="color: #006080">&quot;nom&quot;</span>) /&gt;<br />                @Html.ValidationMessage(<span style="color: #006080">&quot;nom&quot;</span>)<br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;prenom&quot;</span>&gt;<br />                &lt;label <span style="color: #0000ff">for</span>=<span style="color: #006080">&quot;prenom&quot;</span> @<span style="color: #0000ff">if</span>(!ModelState.IsValidField(<span style="color: #006080">&quot;prenom&quot;</span>)){&lt;text&gt;<span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;error-label&quot;</span>&lt;/text&gt;}&gt;Prénom:&lt;/label&gt;<br />                &lt;input type=<span style="color: #006080">&quot;text&quot;</span> id=<span style="color: #006080">&quot;prenom&quot;</span> name=<span style="color: #006080">&quot;prenom&quot;</span> title=<span style="color: #006080">&quot;Prénom&quot;</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;@prenom&quot;</span> @Validation.GetHtml(<span style="color: #006080">&quot;prenom&quot;</span>) /&gt;<br />                @Html.ValidationMessage(<span style="color: #006080">&quot;prenom&quot;</span>)<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;</pre>
<p></div>
<p>Afin d&rsquo;envoyer des données correctes vers votre classe entité pour laquelle vous avez défini certains champs comme obligatoires, vous devez procéder à la validation des données utilisateur.</p>
<p>Les méthodes <strong>@Html.ValidationSummary()</strong> et <strong>@Html.ValidationMessage()</strong> sont utilisées pour afficher les messages d&rsquo;erreurs de validation à l&rsquo;utilisateur.</p>
<p>Vous allez utiliser JQuery et les nouvelles classes de validation System.Web.WebPages.ValidationHelper et System.Web.WebPages.Validator qui ont été introduites par WebPages 2 pour effectuer en seulement quelques lignes de code, des tâches de validation de données puissantes.</p>
<p>Le code pour effectuer cela 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: #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 du nom</span><br />   Validation.RequireField(<span style="color: #006080">&quot;nom&quot;</span>, <span style="color: #006080">&quot;Le nom est obligatoire.&quot;</span>);<br />   <span style="color: #008000">// Validation du prénom</span><br />   Validation.RequireField(<span style="color: #006080">&quot;prenom&quot;</span>, <span style="color: #006080">&quot;Le prénom est obligatoire.&quot;</span>);</pre>
<p></div>
<p>Il ne vous reste plus qu&rsquo;à écrire le code permettant d&rsquo;ajouter les données postées par un utilisateur dans la base de données :</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 personne = <span style="color: #0000ff;">new</span> Personne{<br />                 Nom = nom, Prenom = prenom};<br />                 <span style="color: #008000;">//Ajout des données sur la personne</span><br />                 pr.Add(personne);</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: 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; 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 />@{<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;Register an Account&quot;</span>;<br /><br />    <span style="color: #008000">// initialisation des varaiables</span><br />    var nom = <span style="color: #006080">&quot;&quot;</span>;<br />    var prenom = <span style="color: #006080">&quot;&quot;</span>;<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 du nom</span><br />    Validation.RequireField(<span style="color: #006080">&quot;nom&quot;</span>, <span style="color: #006080">&quot;Le nom est obligatoire.&quot;</span>);<br />    <span style="color: #008000">// Validation du prénom</span><br />    Validation.RequireField(<span style="color: #006080">&quot;prenom&quot;</span>, <span style="color: #006080">&quot;Le prénom est obligatoire.&quot;</span>);<br />    <span style="color: #008000">//Triatement des données si s'est une requête POST</span><br />    <span style="color: #0000ff">if</span> (IsPost) {<br />        nom = Request.Form[<span style="color: #006080">&quot;nom&quot;</span>];<br />        prenom= Request.Form[<span style="color: #006080">&quot;prenom&quot;</span>];<br />        <br />          <span style="color: #0000ff">if</span> (Validation.IsValid()) { <br />                var pr = <span style="color: #0000ff">new</span> PersonneRepository();<br />                 var personne = <span style="color: #0000ff">new</span> Personne{<br />                 Nom = nom, Prenom = prenom};<br />                 <span style="color: #008000">//Ajout des données sur la personne</span><br />                 pr.Add(personne);<br />                 Response.Redirect(<span style="color: #006080">&quot;Index&quot;</span>);<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;h1&gt;Ajout d<span style="color: #006080">'un nouvel enregistrement.&lt;/h1&gt;<br />   &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;Registration Form&lt;/legend&gt;<br />        &lt;ol&gt;<br />            &lt;li <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;nom&quot;</span>&gt;<br />                &lt;label <span style="color: #0000ff">for</span>=<span style="color: #006080">&quot;nom&quot;</span> @<span style="color: #0000ff">if</span>(!ModelState.IsValidField(<span style="color: #006080">&quot;nom&quot;</span>)){&lt;text&gt;<span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;error-label&quot;</span>&lt;/text&gt;}&gt;Nom:&lt;/label&gt;<br />                &lt;input type=<span style="color: #006080">&quot;text&quot;</span> id=<span style="color: #006080">&quot;nom&quot;</span> name=<span style="color: #006080">&quot;nom&quot;</span> title=<span style="color: #006080">&quot;Nom&quot;</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;@nom&quot;</span> @Validation.GetHtml(<span style="color: #006080">&quot;nom&quot;</span>) /&gt;<br />                @Html.ValidationMessage(<span style="color: #006080">&quot;nom&quot;</span>)<br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;prenom&quot;</span>&gt;<br />                &lt;label <span style="color: #0000ff">for</span>=<span style="color: #006080">&quot;prenom&quot;</span> @<span style="color: #0000ff">if</span>(!ModelState.IsValidField(<span style="color: #006080">&quot;prenom&quot;</span>)){&lt;text&gt;<span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;error-label&quot;</span>&lt;/text&gt;}&gt;Prénom:&lt;/label&gt;<br />                &lt;input type=<span style="color: #006080">&quot;text&quot;</span> id=<span style="color: #006080">&quot;prenom&quot;</span> name=<span style="color: #006080">&quot;prenom&quot;</span> title=<span style="color: #006080">&quot;Prénom&quot;</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;@prenom&quot;</span> @Validation.GetHtml(<span style="color: #006080">&quot;prenom&quot;</span>) /&gt;<br />                @Html.ValidationMessage(<span style="color: #006080">&quot;prenom&quot;</span>)<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>À 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/enregpersonne.png" alt="" title="" /></p>
<p>En cas d&rsquo;erreur de validation, vous aurez le résultat suivant :</p>
<p><img src="http://rdonfack.developpez.com/tutoriels/dotnet/webmatrix-application-crud-entity-framework/images/enregpersonneerreurvalidation.png" alt="" title="" /></p>
<p><strong>4 &#8211;  Modification</strong></p>
<p>Après l&rsquo;enregistrement des données sur une personne, voyons maintenant comment nous allons implémenter une nouvelle page permettant de procéder à la mise à jour des informations sur une personne.</p>
<p>Comme vous avez ajouté un lien &nbsp;&raquo; Editer &nbsp;&raquo; dans le tableau des personnes qui pointe sur la page &nbsp;&raquo; Edit &laquo;&nbsp;, vous allez créer un nouveau fichier cshtml ayant ce nom.</p>
<p>La page doit afficher par défaut les informations qui doivent être modifiées dans des zones éditables. Vous allez donc dans un premier temps récupérer ces informations. 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;"><span style="color: #0000ff;">int</span> id = Request[<span style="color: #006080;">"id"</span>].AsInt();<br /><br />    var db = <span style="color: #0000ff;">new</span> WebMatrixCrudAppContext();<br />    var personne = <span style="color: #0000ff;">new</span> Personne();<br />    personne = db.Personnes.Find(id);<br />    <span style="color: #008000;">// initialisation des variables</span><br />    var nom = personne.Nom;<br />    var prenom = personne.Prenom;</pre>
<p></div>
<p>Le code du formulaire de modification 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: 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">&lt;form method=<span style="color: #006080">&quot;post&quot;</span> action=<span style="color: #006080">&quot;&quot;</span>&gt;<br />    @* If at least one validation error exists, notify the user *@<br />    @Html.ValidationSummary(<span style="color: #006080">&quot;Veuillez corriger les erreurs suivantes:&quot;</span>)<br /><br />    &lt;fieldset&gt;<br />        &lt;legend&gt;Formulaire de modification&lt;/legend&gt;<br />        &lt;ol&gt;<br />            &lt;li <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;nom&quot;</span>&gt;<br />                &lt;label <span style="color: #0000ff">for</span>=<span style="color: #006080">&quot;nom&quot;</span> @<span style="color: #0000ff">if</span>(!ModelState.IsValidField(<span style="color: #006080">&quot;nom&quot;</span>)){&lt;text&gt;<span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;error-label&quot;</span>&lt;/text&gt;}&gt;Nom:&lt;/label&gt;<br />                &lt;input type=<span style="color: #006080">&quot;text&quot;</span> id=<span style="color: #006080">&quot;nom&quot;</span> name=<span style="color: #006080">&quot;nom&quot;</span> title=<span style="color: #006080">&quot;Nom&quot;</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;@nom&quot;</span> @Validation.GetHtml(<span style="color: #006080">&quot;nom&quot;</span>) /&gt;<br />                @Html.ValidationMessage(<span style="color: #006080">&quot;nom&quot;</span>)<br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;prenom&quot;</span>&gt;<br />                &lt;label <span style="color: #0000ff">for</span>=<span style="color: #006080">&quot;prenom&quot;</span> @<span style="color: #0000ff">if</span>(!ModelState.IsValidField(<span style="color: #006080">&quot;prenom&quot;</span>)){&lt;text&gt;<span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;error-label&quot;</span>&lt;/text&gt;}&gt;Prénom:&lt;/label&gt;<br />                &lt;input type=<span style="color: #006080">&quot;text&quot;</span> id=<span style="color: #006080">&quot;prenom&quot;</span> name=<span style="color: #006080">&quot;prenom&quot;</span> title=<span style="color: #006080">&quot;Prénom&quot;</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;@prenom&quot;</span> @Validation.GetHtml(<span style="color: #006080">&quot;prenom&quot;</span>) /&gt;<br />                @Html.ValidationMessage(<span style="color: #006080">&quot;prenom&quot;</span>)<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;Modifier&quot;</span> title=<span style="color: #006080">&quot;Modifier&quot;</span> /&gt;<br />        <br />    &lt;/fieldset&gt;<br />&lt;/form&gt;</pre>
<p></div>
<p>Le code permettant de prendre en compte les modifications dans la base de données 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;">personne.Nom = nom;<br />personne.Prenom = prenom;<br /><span style="color: #008000;">//Modification des données sur la personne</span><br />pr.Update(personne);</pre>
<p></div>
<p>Le code complet de la page Edit.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: 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; 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">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">&quot;~/_SiteLayout.cshtml&quot;</span>;<br />    Page.Title = <span style="color: #006080">&quot;Modification d'une personne&quot;</span>;<br /><br />    <br />    <span style="color: #0000ff">int</span> id = Request[<span style="color: #006080">&quot;id&quot;</span>].AsInt();<br /><br />    var pr = <span style="color: #0000ff">new</span> PersonneRepository();<br />    var personne = <span style="color: #0000ff">new</span> Personne();<br />    personne = pr.Find(id);<br />    <span style="color: #008000">// initialisation des variables</span><br />    var nom = personne.Nom;<br />    var prenom = personne.Prenom;<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 du nom</span><br />    Validation.RequireField(<span style="color: #006080">&quot;nom&quot;</span>, <span style="color: #006080">&quot;Le nom est obligatoire.&quot;</span>);<br />   <span style="color: #008000">// Validation du prénom</span><br />    Validation.RequireField(<span style="color: #006080">&quot;prenom&quot;</span>, <span style="color: #006080">&quot;Le prénom est obligatoire.&quot;</span>);<br />    <span style="color: #008000">//Traitement des données si s'est une requête POST</span><br />    <span style="color: #0000ff">if</span> (IsPost) {<br />        nom = Request.Form[<span style="color: #006080">&quot;nom&quot;</span>];<br />        prenom= Request.Form[<span style="color: #006080">&quot;prenom&quot;</span>];<br />        <br />          <span style="color: #0000ff">if</span> (Validation.IsValid()) { <br />                <br />                 personne.Nom = nom;<br />                 personne.Prenom = prenom;<br />                 <span style="color: #008000">//Modification des données sur la personne</span><br />                 pr.Update(personne);<br />            <br />                 Response.Redirect(<span style="color: #006080">&quot;Index&quot;</span>);<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;h1&gt;Mise à jour des données.&lt;/h1&gt;<br />&lt;/hgroup&gt;<br /><br />&lt;form method=<span style="color: #006080">&quot;post&quot;</span> action=<span style="color: #006080">&quot;&quot;</span>&gt;<br />    @* If at least one validation error exists, notify the user *@<br />    @Html.ValidationSummary(<span style="color: #006080">&quot;Veuillez corriger les erreurs suivantes:&quot;</span>)<br /><br />    &lt;fieldset&gt;<br />        &lt;legend&gt;Formulaire de modification&lt;/legend&gt;<br />        &lt;ol&gt;<br />            &lt;li <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;nom&quot;</span>&gt;<br />                &lt;label <span style="color: #0000ff">for</span>=<span style="color: #006080">&quot;nom&quot;</span> @<span style="color: #0000ff">if</span>(!ModelState.IsValidField(<span style="color: #006080">&quot;nom&quot;</span>)){&lt;text&gt;<span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;error-label&quot;</span>&lt;/text&gt;}&gt;Nom:&lt;/label&gt;<br />                &lt;input type=<span style="color: #006080">&quot;text&quot;</span> id=<span style="color: #006080">&quot;nom&quot;</span> name=<span style="color: #006080">&quot;nom&quot;</span> title=<span style="color: #006080">&quot;Nom&quot;</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;@nom&quot;</span> @Validation.GetHtml(<span style="color: #006080">&quot;nom&quot;</span>) /&gt;<br />                @Html.ValidationMessage(<span style="color: #006080">&quot;nom&quot;</span>)<br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;prenom&quot;</span>&gt;<br />                &lt;label <span style="color: #0000ff">for</span>=<span style="color: #006080">&quot;prenom&quot;</span> @<span style="color: #0000ff">if</span>(!ModelState.IsValidField(<span style="color: #006080">&quot;prenom&quot;</span>)){&lt;text&gt;<span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;error-label&quot;</span>&lt;/text&gt;}&gt;Prénom:&lt;/label&gt;<br />                &lt;input type=<span style="color: #006080">&quot;text&quot;</span> id=<span style="color: #006080">&quot;prenom&quot;</span> name=<span style="color: #006080">&quot;prenom&quot;</span> title=<span style="color: #006080">&quot;Prénom&quot;</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;@prenom&quot;</span> @Validation.GetHtml(<span style="color: #006080">&quot;prenom&quot;</span>) /&gt;<br />                @Html.ValidationMessage(<span style="color: #006080">&quot;prenom&quot;</span>)<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;Modifier&quot;</span> title=<span style="color: #006080">&quot;Modifier&quot;</span> /&gt;<br />        <br />    &lt;/fieldset&gt;<br />&lt;/form&gt;<br /><br />&lt;p&gt;<br /> &lt;a href=<span style="color: #006080">&quot;Index&quot;</span>&gt;Retour à la liste&lt;/a&gt;<br />&lt;/p&gt;</pre>
<p></div>
<p>À l&rsquo;exécution de la page, vous obtenez le résultat suivant :</p>
<p><img src="http://rdonfack.developpez.com/tutoriels/dotnet/webmatrix-application-crud-entity-framework/images/modifpersonne.png" alt="" title="" /></p>
<p><strong>5 &#8211; Suppression</strong></p>
<p>Pour finir avec la table Personnes, vous allez maintenant écrire le code permettant de supprimer un enregistrement dans la base de données. Créez pour cela une nouvelle page Delete.cshtml.</p>
<p>Afin d&rsquo;éviter les suppressions accidentelles, vous allez dans un premier temps afficher dans cette page le récapitulatif des informations sur une personne avec un message de confirmation de suppression.</p>
<p>Le code pour la page Delete reprend celui de la page Edit, à la différence que vous allez ajouter dans un formulaire un bouton permettant de procéder à la suppression d&rsquo;un enregistrement :</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;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>Vous allez également ajouter dans ce fichier le code permettant de supprimer les données dans la base de données en cas de clic sur le bouton supprimer :</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;">if</span>(IsPost)<br />    {<br />            pr.Remove(personne);<br />            Response.Redirect(<span style="color: #006080;">"Index"</span>);<br />    }<br />            </pre>
<p></div>
<p>Le code complet de la page Delete.cshtml 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;">"Détails"</span>;<br /><br />    <span style="color: #008000;">//Lecture des données sur une personne</span><br />    <span style="color: #0000ff;">int</span> id = Request[<span style="color: #006080;">"id"</span>].AsInt();<br />    var pr = <span style="color: #0000ff;">new</span> PersonneRepository();<br />    var personne = <span style="color: #0000ff;">new</span> Personne();<br />    personne = pr.Find(id);<br />    <span style="color: #008000;">//Traitement des données si s'est une requête POST</span><br />    <span style="color: #0000ff;">if</span>(IsPost)<br />    {<br />            <span style="color: #008000;">//Supression de l'enregistrement</span><br />            pr.Remove(personne);<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;">"nom"</span>&gt;<br />                &lt;label&gt;Nom:&lt;/label&gt;<br />                &lt;label&gt;@personne.Nom&lt;/label&gt;<br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"prenom"</span>&gt;<br />                &lt;label&gt;Prénom:&lt;/label&gt;<br />                &lt;label&gt;@personne.Prenom&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>Ce qui donne le résultat suivant à l&rsquo;exécution :</p>
<p><img src="http://rdonfack.developpez.com/tutoriels/dotnet/webmatrix-application-crud-entity-framework/images/deletepersonne.png" alt="" title="" /></p>
<p>Compte tenu du fait que l&rsquo;implémentation des fonctionnalités pour la table Organismes reprend plusieurs des principes et méthodes qui ont été utilisés pour la table Personnes, nous n&rsquo;allons plus revenir sur la création des pages d&rsquo;affichage, d&rsquo;enregistrement, de mise à jour ou de suppression d&rsquo;un organisme.</p>
<p>Pour écrire le code de ces pages, veuillez vous référer à celui pour la table Personnes ou à défaut, regarder le code source pour ces pages dans les fichiers du projet qui sont disponibles en téléchargement à la fin de l&rsquo;article.</p>
<p>La prochaine et dernière partie portera donc sur l’implémentation des fonctionnalités CRUD pour la table Affiliations, qui sera un peu différente puisque c&rsquo;est table association.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Création d’une application CRUD avec WebMatrix, Razor et Entity Framework Part 2 : création de l&#8217;application et définition du modèle objet</title>
		<link>https://blog.developpez.com/lilroma/p10876/net/creation_d_une_application_crud_avec_web_1</link>
		<comments>https://blog.developpez.com/lilroma/p10876/net/creation_d_une_application_crud_avec_web_1#comments</comments>
		<pubDate>Sun, 25 Mar 2012 14:07:24 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></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. Dans la première partie introductive, nous avons présenté le but de cet article et les différents &#8230; <a href="https://blog.developpez.com/lilroma/p10876/net/creation_d_une_application_crud_avec_web_1">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>Dans <a href="http://blog.developpez.com/lilroma/p10870/">la première partie introductive</a>, nous avons présenté le but de cet article et les différents outils qui seront utilisés pour l’implémentation de notre application CRUD.</p>
<p>Cette seconde partie portera essentiellement sur la création de l&rsquo;application avec WebMatrix, l’installation d&rsquo;Entity Framework à partir de NuGet et la définition du modèle objet.</p>
<p><span id="more-53"></span></p>
<p><strong>Création de l’application</strong></p>
<p>Maintenant que nous nous sommes familiarisés avec les différents outils que nous allons utiliser, nous pouvons maintenant procéder à la création de notre application.<br />
Pour cela, vous allez lancer WebMatrix. Dans la fenêtre de démariage rapide, vous allez sélectionner Modèles (Templates) parmi les différentes options qui sont proposées.</p>
<p><img src="http://blog.developpez.com/media/quickstart.PNG" width="821" height="546" alt="" /> </p>
<p>Dans la fenêtre qui va s’afficher, sélectionnez le modèle de projet Site de démarrage (Starter Site), renseignez le nom du site (<strong>WebMatrixCRUDApp</strong>) et cliquez enfin pour le bouton OK.</p>
<p><img src="http://blog.developpez.com/media/Templates_01.PNG" width="824" height="547" alt="" /> </p>
<p>Le modèle Site de démarrage contient par défaut une interface à onglet et des fonctionnalités d’authentification.</p>
<p>Une fois le projet créé, vous pouvez voir les éléments suivants dans la fenêtre d’exploration, en sélectionnant l’espace de travail Files dans la zone de sélection d’espace de travail.</p>
<p><img src="http://blog.developpez.com/media/solutionexplorer_01.PNG" width="192" height="315" alt="" /></p>
<p><strong>Installation d’Entity Framework</strong></p>
<p>Dans la boite d’outils, vous allez cliquer sur le bouton « Gallery » ayant le logo de NuGet. Dans la fenêtre des packages qui s’affichent par défaut, sélectionnez le package Entity Framework comme l’illustre l’image ci-dessous :</p>
<p><img src="http://blog.developpez.com/media/DownloadEntity.PNG" width="409" height="285" alt="" /></p>
<p>La fenêtre du gestionnaire de packages NuGet s’affiche avec les détails sur le package que vous souhaitez installer.<br />
Cliquez sur le bouton « Install » et acceptez les termes d’utilisation pour que NuGet procède au téléchargement et à l’installation d’Entity Framework dans votre application :</p>
<p><img src="http://blog.developpez.com/media/InstallEntityF.PNG" width="714" height="483" alt="" /> </p>
<p>Le fichier EntityFramework.dll sera alors ajouté dans le dossier bin de votre application et une référence à l’espace de nom System.Data.Entity sera automatiquement ajoutée au fichier Web.config.</p>
<p><strong>Définition du modèle objet</strong></p>
<p>Notre exemple simple portera sur une petite application pour la gestion du carnet d’adresses d’une entreprise. L’entreprise contient plusieurs organismes  et un employé peut travailler dans un ou plusieurs organismes.</p>
<p>Le schéma de la base de données que nous allons utiliser est donc le suivant :</p>
<p><img src="http://blog.developpez.com/media/DatabaseSchema.PNG" width="594" height="316" alt="" /> </p>
<p>De ce schéma, nous allons créer les différentes entités correspondantes. Chaque entité doit être définie comme une classe C# afin d’être compréhensible par Entity Framework.</p>
<p>Vous allez créer un nouveau dossier « App_code » en faisant un clic droit sur votre projet dans l’explorateur de solution et en cliquant sur « New Folder ».</p>
<p>Sélectionnez ce dossier et ajoutez-y un nouveau fichier C# en cliquant sur le bouton « New » de la boite d’outils et ensuite sur la commande « New File ». </p>
<p>Dans la fenêtre qui va s’afficher, sélectionnez le type de fichier Class(C#), renseignez le nom du fichier (Personne.cs)  et validez sur OK.</p>
<p>Ajoutez par la suite les lignes de code suivantes dans ce fichier pour définir  la classe Personne.</p>
<div 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">public</span> <span style="color: #0000ff">partial</span> <span style="color: #0000ff">class</span> Personne<br />{<br />    <br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">int</span> PersonneId { get; set;}<br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Nom {get; set;}<br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Prenom {get; set;}<br /><br />}<br /></pre>
<p></div>
<p>Procédez de même pour le fichier Organisme.cs, dont la classe aura la définition suivante :</p>
<div id="codeSnippetWrapper">
<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> <span style="color: #0000ff;">partial</span> <span style="color: #0000ff;">class</span> Organisme<br />{<br />   <br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span> OrganismeId { get; set;}<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Nom {get; set;}<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Adresse {get; set;}<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Telephone {get; set;}<br />}<br /></pre>
<p></div>
<p>Créez également la classe Affiliation qui aura la définition suivante :</p>
<div id="codeSnippetWrapper">
<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> <span style="color: #0000ff;">partial</span> <span style="color: #0000ff;">class</span> Affiliation<br />{   <br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span> PersonneId { get; set;}<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span> OrganismeId { get; set;}<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Fonction {get; set;}<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Email {get; set;}<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Telephone {get; set;}<br />}<br /></pre>
<p></div>
<p>À ce stade, vous avez simplement défini des entités correspondantes au schéma de votre base de données. Cependant,  Entity Framework est incapable de définir les relations entre les tables Presonne et Affilialtion, ainsi qu’entre les tables Organisme et Affiliation.</p>
<p>Pour matérialiser cela, vous allez donc ajouter une propriété Personne et une propriété Organisme dans la classe Affiliation. La nouvelle définition de cette classe est la suivante :</p>
<div 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">public</span> <span style="color: #0000ff">partial</span> <span style="color: #0000ff">class</span> Affiliation<br />{<br />   <br />   <span style="color: #0000ff">public</span> <span style="color: #0000ff">int</span> PersonneId { get; set;}<br />   <span style="color: #0000ff">public</span> <span style="color: #0000ff">int</span> OrganismeId { get; set;}<br />   <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Fonction {get; set;}<br />   <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Email {get; set;}<br />   <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Telephone {get; set;}<br /><br />   <span style="color: #0000ff">public</span> <span style="color: #0000ff">virtual</span> Personne Personne {get; set;}<br />   <span style="color: #0000ff">public</span> <span style="color: #0000ff">virtual</span> Organisme Organisme {get; set;}<br />}<br /></pre>
<p></div>
<p>De même, pour matérialiser le fait qu’une Personne peut avoir plusieurs affiliations dans divers organismes et le fait qu’un organisme dispose de plusieurs personnes affiliées, vous allez ajouter également une propriété supplémentaire dans chacune de ces deux tables. </p>
<p>La nouvelle définition de la classe Personne sera donc la suivante :</p>
<div id="codeSnippetWrapper">
<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> <span style="color: #0000ff;">partial</span> <span style="color: #0000ff;">class</span> Personne<br />{<br />    <br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span> PersonneId { get; set;}<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Nom {get; set;}<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Prenom {get; set;}<br /><br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">virtual</span> ICollection&lt;Affiliation&gt; Affiliation {get; set;}<br />}<br /></pre>
<p></div>
<p>Et celle de la classe Organisme sera la suivante : </p>
<div 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">public</span> <span style="color: #0000ff">partial</span> <span style="color: #0000ff">class</span> Organisme<br />{<br />   <br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">int</span> OrganismeId { get; set;}<br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Nom {get; set;}<br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Adresse {get; set;}<br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Telephone {get; set;}<br /><br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">virtual</span> ICollection&lt;Affiliation&gt; Affiliation {get; set;}<br /><br />}<br /></pre>
<p></div>
<p>Par défaut, lors de la génération de la base de données correspondante à votre modèle objet,  les champs string seront définis par Entity Framework Code First comme des colonnes nvarchar(4000). Pour limiter cette taille, vous allez utiliser l’attribut <strong>[MaxLengthAttribute()]</strong> de la classe DataAnnotation.</p>
<p>L’attribut <strong>[RequiredAttribute]</strong> de cette classe sera également utilisé pour définir les propriétés dont les valeurs sont obligatoires. [ScaffoldColumnAttribute] sera utilisé pour spécifier que la clé primaire doit être autoincrément. Enfin, vous allez définir l’attribut <strong>[KeyAttribute</strong>] pour spécifier les clés étrangères et les tables auxquelles ces clés sont liées.</p>
<p>Le code complet du fichier Personne.cs sera donc le suivant :</p>
<div id="codeSnippetWrapper">
<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;<br /><span style="color: #0000ff;">using</span> System.Collections.Generic;<br /><span style="color: #0000ff;">using</span> System.ComponentModel.DataAnnotations;<br /><span style="color: #0000ff;">using</span> System.Web;<br /><br /><span style="color: #008000;">/// &lt;summary&gt;</span><br /><span style="color: #008000;">/// Summary description for ClassName</span><br /><span style="color: #008000;">/// &lt;/summary&gt;</span><br /><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">partial</span> <span style="color: #0000ff;">class</span> Personne<br />{<br />    [ScaffoldColumnAttribute(<span style="color: #0000ff;">false</span>)]<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span> PersonneId { get; set;}<br />    [MaxLengthAttribute(50)]<br />    [RequiredAttribute]<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Nom {get; set;}<br />    [MaxLengthAttribute(50)]<br />    [RequiredAttribute]<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Prenom {get; set;}<br /><br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">virtual</span> ICollection&lt;Affiliation&gt; Affiliation {get; set;}<br /><br />}<br /></pre>
<p></div>
<p>Celui du fichier Organisme.cs est le suivant :</p>
<div id="codeSnippetWrapper">
<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;<br /><span style="color: #0000ff;">using</span> System.Collections.Generic;<br /><span style="color: #0000ff;">using</span> System.ComponentModel.DataAnnotations;<br /><span style="color: #0000ff;">using</span> System.Web;<br /><br /><span style="color: #008000;">/// &lt;summary&gt;</span><br /><span style="color: #008000;">/// Summary description for ClassName</span><br /><span style="color: #008000;">/// &lt;/summary&gt;</span><br /><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">partial</span> <span style="color: #0000ff;">class</span> Organisme<br />{<br />   [ScaffoldColumnAttribute(<span style="color: #0000ff;">false</span>)]<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span> OrganismeId { get; set;}<br />    [MaxLengthAttribute(50)]<br />    [RequiredAttribute]<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Nom {get; set;}<br />    [MaxLengthAttribute(50)]<br />    [RequiredAttribute]<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Adresse {get; set;}<br />    [MaxLengthAttribute(50)]<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Telephone {get; set;}<br /><br />     <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">virtual</span> ICollection&lt;Affiliation&gt; Affiliation {get; set;}<br />}<br /></pre>
<p></div>
<p>Et enfin, la nouvelle définition du fichier Affiliation.cs est la suivante :</p>
<div id="codeSnippetWrapper">
<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;<br /><span style="color: #0000ff;">using</span> System.Collections.Generic;<br /><span style="color: #0000ff;">using</span> System.ComponentModel.DataAnnotations;<br /><span style="color: #0000ff;">using</span> System.Web;<br /><br /><span style="color: #008000;">/// &lt;summary&gt;</span><br /><span style="color: #008000;">/// Summary description for ClassName</span><br /><span style="color: #008000;">/// &lt;/summary&gt;</span><br /><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">partial</span> <span style="color: #0000ff;">class</span> Affiliation<br />{   <br />    [KeyAttribute, ForeignKey(<span style="color: #006080;">"Personne"</span>), Column(Order = 0)]<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span> PersonneId { get; set;}<br />    [KeyAttribute, ForeignKey(<span style="color: #006080;">"Organisme"</span>), Column(Order = 1)]<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span> OrganismeId { get; set;}<br />    [MaxLengthAttribute(50)]<br />    [RequiredAttribute]<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Fonction {get; set;}<br />    [MaxLengthAttribute(50)]<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Email {get; set;}<br />    [MaxLengthAttribute(50)]<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Telephone {get; set;}<br /><br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">virtual</span> Personne Personne {get; set;}<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">virtual</span> Organisme Organisme {get; set;}<br />}</pre>
<p></div>
<p>La troisième partie portera sur la création du DbContext, de la base de données à partir du modèle objet avec EF Code First et enfin la définition des différentes classes Repository qui seront utilisées.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Création d’une application CRUD avec WebMatrix, Razor et Entity Framework Part 1 : Introduction et présentation des outils</title>
		<link>https://blog.developpez.com/lilroma/p10870/net/creation_d_une_application_crud_avec_web</link>
		<comments>https://blog.developpez.com/lilroma/p10870/net/creation_d_une_application_crud_avec_web#comments</comments>
		<pubDate>Fri, 23 Mar 2012 15:40:55 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[Nuget]]></category>
		<category><![CDATA[RAZOR]]></category>
		<category><![CDATA[WebMatrix]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[J’ai eu à développer récemment une application CRUD avec WebMatrix. Utilisant principalement la classe DataBase de l’espace de nom Microsoft.Data pour la manipulation des données, lorsque j’ai aperçu Entity Framework dans les packages NuGet avec WebMatrix 2 bêta, je me &#8230; <a href="https://blog.developpez.com/lilroma/p10870/net/creation_d_une_application_crud_avec_web">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>J’ai eu à développer récemment une application CRUD avec WebMatrix. Utilisant principalement la classe DataBase de l’espace de nom Microsoft.Data pour la manipulation des données, lorsque j’ai aperçu Entity Framework dans les packages NuGet avec WebMatrix 2 bêta, je me suis dit génial ! Ça veut dire que je peux l’utiliser dans ma solution.</p>
<p>J’ai donc opté pour l’utilisation de la bibliothèque au sein de mon application WebMatrix. Entity Framework est en passe de devenir un standard pour la manipulation des données et est recommandé par Microsoft.  </p>
<p>Contrairement avec Visual Studio et ASP.NET ou l’on dispose de plusieurs outils rendant facile la conception d’une application CRUD avec Entity Framework, sur WebMatrix, c’est un peu compliqué et l’on ne dispose pas des fonctionnalités comme l’échafaudage, et encore moins des ressources sur Internet.</p>
<p>C’est pourquoi, j’ai donc décidé de fournir au travers de cet article une démarche pas à pas avec autant que possible des détails pour la conception d’une application CRUD avec WebMatrix, Razor et Entity Framework.</p>
<p><span id="more-54"></span></p>
<p>Le lecteur tout au long de ce tutoriel, pourra se familiariser avec WebMatrix, Razor, Entity Framework, le gestionnaire de packages open source .NET NuGet pour WebMatrix et le gestionnaire de base de données SQL Server Compact Edition.</p>
<p>Cet article est essentiellement destiné aux débutants. Aucun prérequis n’est donc nécessaire pour sa bonne compréhension. Mais, il est néanmoins conseillé que vous vous soyez familiarisé avec WebMatrix et Razor.</p>
<p>Si ce n’est pas le cas,  je vous conseille de lire dans un premier temps mon tutoriel de présentation de WebMatrix ainsi que  mon tutoriel sur Razor.</p>
<p><strong>Description des outils de travail</strong></p>
<p><strong>WebMatrix </strong></p>
<p>Pour rappel, WebMatrix est un environnement de développement Web léger (15 Mo), efficace et surtout gratuit, développé par Microsoft. Il permet aux développeurs Web de créer et gérer des applications Web sur la plate-forme Windows, tout en restant compatibles avec les produits Microsoft Visual Studio, SQL Server ou encore PHP sur Windows.</p>
<p>Lire le tutoriel sur la <a href="http://rdonfack.developpez.com/tutoriels/web/webmatrix-decouverte-et-prise-main-outil-developpement-web-gratuit-tout/">présentation de WebMatrix</a>.</p>
<p> Pour cet article, nous utiliserons la bêta de WebMatrix 2, qui est la version la plus récente de l’environnement de développement Web. L&rsquo;EDI est téléchargeable <a href="http://aka.ms/webmatrix2blog">sur cette page</a>.</p>
<p>Son installation est assez simple et se fait via Windows Installer. L’outil installe automatiquement SQL Server Compact Edition et WebPages 2 Developer Preview, sur lequel repose les pages Web ASP.NET écrites avec WebMatrix.</p>
<p><strong>Razor</strong></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>Lire mon tutoriel sur <a href="http://rdonfack.developpez.com/tutoriels/dotnet/creation-pages-web-asp-net-utilisant-moteur-vue-razor/">la présentation de Razor</a>.</p>
<p><strong>SQL Server Compact Edition</strong></p>
<p>SQL Server Compact Edition. Est un gestionnaire de base de données relationnelle compact, gratuit, mis au point par Microsoft pour le développement des applications pouvant s’exécuter sur des ordinateurs de bureau et les dispositifs mobiles.</p>
<p>SQL Server Compact partage un modèle de programmation commun avec différentes éditions de SQL Server qui permet aux développeurs de créer des applications natives et managées. SQL Server Compact fournit des fonctionnalités de base de données relationnelle : une source de données fiable, un processeur d’optimisation des requêtes et des possibilités de connectivité fiables et évolutives.<br />
La prise en charge du développement pour SQL Server Compact est fournie par Visual Studio et également WebMatrix. L’environnement intègre un éditeur graphique permettant de créer, modifier, exécuter des requêtes et administrer une base de données SQL Server Compact.</p>
<p><strong>Entity Framework</strong></p>
<p>De plus en plus, les développeurs préfèrent utiliser des données comme des objets, au lieu d’utiliser les requêtes SQL pour interroger directement la base de données.  Entity Framework est un ORM permettant aux développeurs de créer des applications d&rsquo;accès aux données en programmant par rapport à un modèle d&rsquo;application conceptuel au lieu de programmer directement par rapport à un schéma de stockage relationnel. L&rsquo;objectif est de diminuer la quantité de code et les besoins en maintenance pour les applications orientées objet.</p>
<p>Plusieurs approches peuvent être utilisées avec Entity Framework pour accéder aux données. Dans notre cas, c’est l’approche Code First qui sera utilisée.</p>
<p>Cette approche permet de définir tout d’abord les objets dans le code, ensuite utiliser EF pour créer la base de données correspondante. </p>
<p><strong>NuGet</strong></p>
<p>NuGet est un gestionnaire de packages  .NET open source. Il est disponible comme une extension pour les environnements de développement .NET Visual Studio, SharpDevelop et est intégré par défaut dans la version 2 de WebMatrix. Il fournit au développeur une meilleure expérience pour la gestion des packages et dépendances, et élimine presque tous les défis d&rsquo;intégration d&rsquo;une bibliothèque tierce open source ou gratuite dans un projet .NET.</p>
<p>Lire mon tutoriel sur <a href="http://rdonfack.developpez.com/tutoriels/dotnet/presentation-gestionnaire-packages-net-nuget/">la présentation de NuGet</a>.</p>
<p>Dans la seconde partie, nous allons créer l’application, installer Entity Framework à partir de NuGet et créer le modèle objet pour nos entités.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP.NET MVC 4 beta : introduction de l’API Web et améliorations de Razor</title>
		<link>https://blog.developpez.com/lilroma/p10734/net/asp_net_mvc_4_beta_introduction_de_l_api</link>
		<comments>https://blog.developpez.com/lilroma/p10734/net/asp_net_mvc_4_beta_introduction_de_l_api#comments</comments>
		<pubDate>Mon, 20 Feb 2012 10:46:21 +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[RAZOR]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[ASP.NET MVC 4 vient de franchir une nouvelle étape dans son cycle de développement. Microsoft vient de publier la version Beta du framework Web open source fondé sur ASP.NET. En dehors des nouveautés disponibles dans la version Developper Previw publiée &#8230; <a href="https://blog.developpez.com/lilroma/p10734/net/asp_net_mvc_4_beta_introduction_de_l_api">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>ASP.NET MVC 4 vient de franchir une nouvelle étape dans son cycle de développement. Microsoft vient de publier la version Beta du framework Web open source fondé sur ASP.NET.</p>
<p>En dehors des nouveautés disponibles dans la version Developper Previw publiée en septembre dernier dont <a href="http://blog.developpez.com/lilroma/p10326/net/asp-net/asp-net-mvc-4/asp-net-mvc-4-developer-preview-nouveaut/">le support des plateformes mobiles</a>, <a href="http://blog.developpez.com/lilroma/p10420/net/asp-net/asp-net-mvc-4/asp-net-mvc-4-developer-preview-ameliora/">le rendu adaptatif</a>, <a href="http://blog.developpez.com/lilroma/p10343/net/asp-net/asp-net-mvc-4/asp-net-mvc-4-developer-preview-jquery-m/">View Switcher</a>, des nouveaux modèles de projet Web, etc. la bêta apporte plusieurs corrections de bug et quelques nouveautés donc la plus importante est l’introduction de l’API Web.</p>
<p><span id="more-67"></span></p>
<p><strong>L’API Web</strong></p>
<p>Web API a fait son apparition dans WCF. Elle a pour objectif principal de permettre aux développeurs d’exposer leurs applications, données et services sur le web directement à travers HTTP.</p>
<p>Au vu des besoins d’interaction de plus en plus croissants entre une application Web et un ensemble très large de clients (réseaux sociaux, navigateurs, terminaux mobiles, etc.), il était indispensable de fournir aux développeurs un moyen de communiquer dans leurs applications avec ces différents types de clients.  Pour ne pas avoir à développer deux outils différents permettant d’effectuer les mêmes actions, l’équipe d’ASP.NET MVC  c’est chargée d’intégrer WCF Web API avec le Framework de développement qui devient Web API.</p>
<p><img src="http://blog.developpez.com/media/webapi.png" width="676" height="606" alt="" /></p>
<p><strong>Regroupement par défaut</strong></p>
<p>Depuis la Developer Previw d’ASP.NET MVC 4, la librairie Microsoft.Web.Optimisation avait été introduite à la plateforme, ainsi qu’a ASP.NET 4.5, pour permettre d’optimiser les performances d’une application et améliorer le temps de chargement des pages en utilisant le regroupement et la minification à la volée du JavaScript et CSS.</p>
<p>Avec la bêta de MVC 4, le regroupement est utilisé par défaut dans les modèles projets Web. A l’ouverture d’un Template, vous trouverez dans le fichier Layout les lignes de code suivantes dans la balise Head :</p>
<div id="codeSnippetWrapper">
<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;head&gt;<br />        &lt;meta charset=<span style="color: #006080;">"utf-8"</span> /&gt;<br />        &lt;title&gt;@ViewBag.Title - My ASP.NET MVC Application&lt;/title&gt;<br />        &lt;link href=<span style="color: #006080;">"~/favicon.ico"</span> rel=<span style="color: #006080;">"shortcut icon"</span> type=<span style="color: #006080;">"image/x-icon"</span> /&gt;<br />        &lt;link href=<span style="color: #006080;">"@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("</span>~/Content/css<span style="color: #006080;">")"</span> rel=<span style="color: #006080;">"stylesheet"</span> type=<span style="color: #006080;">"text/css"</span> /&gt;<br />        &lt;link href=<span style="color: #006080;">"@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("</span>~/Content/themes/<span style="color: #0000ff;">base</span>/css<span style="color: #006080;">")"</span> rel=<span style="color: #006080;">"stylesheet"</span> type=<span style="color: #006080;">"text/css"</span> /&gt;<br />        &lt;script src=<span style="color: #006080;">"@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("</span>~/Scripts/js<span style="color: #006080;">")"</span>&gt;&lt;/script&gt;<br />        &lt;meta name=<span style="color: #006080;">"viewport"</span> content=<span style="color: #006080;">"width=device-width"</span> /&gt;<br />    &lt;/head&gt;<br /></pre>
<p></div>
<p>Pour plus de détail sur l’utilisation du regroupement et la minification du JavaScript dans une application Web, <a href="http://blog.developpez.com/lilroma/p10462/net/asp-net/microsoft-web-optimisation-ou-comment-op/">voir mon article sur le sujet</a>.</p>
<p><strong>Améliorations de Razor</strong></p>
<p>Le moteur de vue Razor qui à fait son apparition avec MVC 3, croit en maturité dans cette version, avec des améliorations qui simplifient sa syntaxe dans certains scénarios courants.</p>
<p>&#8211; Résolution d’URL : prise en charge de « ~ » dans la syntaxe.</p>
<p>Désormais au lieu d&rsquo;écrire :</p>
<div id="codeSnippetWrapper">
<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;scriptsrc=<span style="color: #006080;">"@Url.Content("</span>~/Scripts/Site.js<span style="color: #006080;">")"</span>&gt;&lt;/script&gt;</pre>
<p></div>
<p>Le développeur pourra écrire :</p>
<div id="codeSnippetWrapper">
<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;scriptsrc=<span style="color: #006080;">"~/Scripts/Site.js"</span>&gt;&lt;/script&gt;</pre>
<p></div>
<p>&#8211; Rendu conditionnel d’attribut</p>
<p>Précédemment, si vous vouliez utiliser un attribut qui peut-être nul,  vous deviez vérifier au préalable si celui-ci  n’est pas vide avant de l’utiliser.</p>
<div id="codeSnippetWrapper">
<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;div@{<span style="color: #0000ff;">if</span> (myClass != <span style="color: #0000ff;">null</span>) { &lt;text&gt;<span style="color: #0000ff;">class</span>=<span style="color: #006080;">"@myClass"</span>&lt;/text&gt; } }&gt;Content&lt;/div&gt;</pre>
<p></div>
<p>Désormais, Razor est capable de gérer cela automatiquement, de telles sortes que vous pouvez directement l’utiliser. Si l’attribut est vide il ne sera simplement pas appelé.</p>
<div 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">&lt;div <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;@myClass&quot;</span>&gt;Content&lt;/div&gt;</pre>
<p></div>
<p>Si l’attribut est donc nul, le rendu de code sera le suivant :</p>
<div id="codeSnippetWrapper">
<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;div&gt;Content&lt;/div&gt;</pre>
<p></div>
<p><strong>Utilisation de NuGet pour installer les bibliothèques externes des modèles de projet</strong></p>
<p>Avec la bêta de MVC 4, lorsque que vous créez un nouveau projet, les packages sont installés dans l’application en utilisant NuGet package restore. Le package NuGet restore permet lors de la compilation ou de la création d’une application, de vérifier si les packages présents correspondent aux dernières versions publiées. Si ce n’est pas le cas, il se charge automatiquement d’effectuer la mise à jour.</p>
<p>ASP.NET MVC 4 peut-être utilisé avec Visual Studio 2010 Service pack 1 ou Visual Web Developer 2010 Service Pack 1. La préversion de Visual Studio 11 n’est pas prise en charge.</p>
<p>Le framework peut s’installer via NuGet ou en utilisant le Web plateforme installer. <a href="http://www.asp.net/mvc/mvc4">Les binaires sont également disponibles en téléchargement</a>.</p>
<p>Je reviendrais sur une présentation plus détaillé de Web API dans un prochain billet de blog.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Internationalisation d’une application ASP.NET MVC 3 Razor Part 1 : ressources et vues</title>
		<link>https://blog.developpez.com/lilroma/p10697/net/internationalisation_d_une_application_a_1</link>
		<comments>https://blog.developpez.com/lilroma/p10697/net/internationalisation_d_une_application_a_1#comments</comments>
		<pubDate>Sat, 04 Feb 2012 10:29: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[RAZOR]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Plusieurs articles sont déjà disponibles sur developpez.com ou sur le Web qui traitent de l’internationalisation d’une application Web ASP.NET. Cependant, pour ASP.NET MVC, il en existe très peu, et il n’y a pas de méthode reconnue comme standard pour écrire &#8230; <a href="https://blog.developpez.com/lilroma/p10697/net/internationalisation_d_une_application_a_1">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Plusieurs articles sont déjà disponibles sur developpez.com ou sur le Web qui traitent de l’internationalisation d’une application Web ASP.NET. Cependant, pour ASP.NET MVC, il en existe très peu, et il n’y a pas de méthode reconnue comme standard pour écrire un site multilingue avec le framework Web de Microsoft.</p>
<p>En me basant donc du meilleur que j’ai pu tirer de quelques articles par-ci par-là et mon expérience, j’ai mis au point une solution qui répondait à mes besoins pour une application ASP.NET MVC Razor. Cette méthode n’est pas standard, et peut-être pas la meilleure, mais elle répond pleinement aux exigences de mon projet et aux objectifs que je voulais atteindre.</p>
<p><img src="http://blog.developpez.com/media/internationalisation.jpg" width="450" height="299" alt="" /></p>
<p><span id="more-41"></span></p>
<p><strong>Ce qu&rsquo;il faut savoir sur l’internationalisation dans l&rsquo;écosystème .NET </strong></p>
<p>Avant de se lancer dans la création d’un site multilingue en ASP.NET, il y a un certain nombre de concepts que vous devriez au préalable savoir.  Lorsqu’on parle d’internationalisation d’une application sur la plateforme .NET, cela implique la mise en œuvre de deux mécanismes principaux à savoir : la mondialisation et la localisation.</p>
<p><strong>La mondialisation</strong> est le processus de conception et de développement d&rsquo;un produit logiciel adapté à plusieurs cultures. Une application mondialisée prend en charge des interfaces utilisateurs localisées et des données régionales pour tous les utilisateurs. Par exemple, le format de la date en zone francophone est jj/mm/aaaa. Dans les pays anglophones, nous avons plutôt le format mm/jj/aaaa. La mondialisation va consister à afficher le bon format dans une page en fonction de la langue du navigateur d’un utilisateur ou des options choisies par celui-ci.</p>
<p><strong>La localisation</strong> est le processus d&rsquo;adaptation de votre application à une culture et aux paramètres régionaux donnés. Vous devez pendant cette étape, personnaliser votre application pour les cultures  auxquelles vous la destinez. Cette étape doit consister essentiellement en une traduction de l&rsquo;interface utilisateur vers les langues cibles.</p>
<p><strong>Différentes possibilités d’internationalisation d’une application ASP.NET</strong></p>
<p>  Il existe sur la plateforme .NET plusieurs procédés pour rendre son site multilingue. L’internationalisation d’une application peut donc être faite en utilisant soi :</p>
<p>&#8211; Les fichiers de ressources ;</p>
<p>&#8211; Des vues différentes pour chaque culture (traduction dans le code) ;</p>
<p>&#8211; Des fichiers texte ;</p>
<p>&#8211; Utiliser à la place des fichiers de ressources une base de données ;</p>
<p>&#8211; Ou combiner la première et la seconde méthode.</p>
<p>Chacune de ces techniques à ses avantages et ses inconvénients, et l’orientation vers l’une d’entre elles dépend aussi entre autres des spécifications de votre projet et des contraintes techniques auxquelles vous êtes confrontés. Personnellement je préfère les fichiers de ressources que j’utilise couramment lorsque je suis confronté à cette problématique.</p>
<p>Les fichiers ressources sont des fichiers textes optimisés. Au chargement, ils sont entièrement triés afin de limiter les accès que ce soit au niveau de la mémoire ou des différents disques.<br />
C’est pourquoi, dans le cadre de ce tutoriel, nous nous limiterons uniquement à l’utilisation des fichiers de ressources.</p>
<p><strong>Prérequis</strong></p>
<p>&#8211; Visual Web Developer 2010 ;</p>
<p>&#8211; ASP.NET MVC 3 ;</p>
<p>&#8211; Connaissance de base en C# et sur le moteur de vue Razor.</p>
<p><strong>Création de l’application</strong></p>
<p>Nous allons commencer dès la base même, par la création d’une nouvelle application qui sera utilisée tout au long de l’article.<br />
Pour ce faire, vous allez démarrer votre EDI Visual Studio. Cliquez sur le menu Fichier, ensuite sur la commande Nouveau projet. Dans la fenêtre qui va s’afficher, sélectionnez le Template de projet ASP.NET MVC 3 Web Application, renseignez le nom de l’application et l’emplacement ou celle-ci va être stockée et cliquez sur OK.</p>
<p><img src="http://rdonfack.developpez.com/tutoriels/dotnet/creation-pages-web-asp-net-utilisant-moteur-vue-razor/images/startrazorprojet.PNG" alt="" title="" /></p>
<p>Sélectionnez ensuite dans la fenêtre qui va s’afficher le modèle de projet Internet Application, en vous assurant que le moteur de vue qui sera utilisé est Razor.</p>
<p><img src="http://rdonfack.developpez.com/tutoriels/dotnet/creation-pages-web-asp-net-utilisant-moteur-vue-razor/images/ViewEngine.PNG" alt="" title="" /></p>
<p>Cliquez ensuite sur OK pour que Visual Studio procède à la création de votre application.</p>
<p>Si vous exécutez l’application à ce stade, vous vous rendrez compte que le texte affiché par défaut dans vos pages est en anglais.</p>
<p><img src="http://rdonfack.developpez.com/tutoriels/dotnet/creation-pages-web-asp-net-utilisant-moteur-vue-razor/images/test1.PNG" alt="" title="" /></p>
<p>Puisque vous souhaitez que l’internaute qu’il soit  anglophone ou francophone puissent se sentir à l’aise dans la navigation sur votre site, vous allez ajouter à celui-ci en plus du support de l’anglais, la prise en charge du français.</p>
<p>Pour atteindre ce résultat, les premières étapes suivantes sont nécessaires :</p>
<p>&#8211; Création des fichiers de ressources ;</p>
<p>&#8211; Modification des vues ;</p>
<p>&#8211; Définition de la culture.</p>
<p><strong>Création des fichiers de ressources</strong></p>
<p>Pour gérer efficacement l’internationalisation dans notre application, nous avons opté pour l’utilisation des fichiers de ressources pour stocker les valeurs qui doivent être localisées. </p>
<p><strong>Ce qu’il faut savoir sur les fichiers de ressources</strong></p>
<p>Une ressource est une donnée non exécutable qui est déployée logiquement avec une application. Les ressources peuvent contenir des données sous plusieurs formes, telles que des chaînes, des images ou des objets rendus persistants. Le stockage de vos données dans un fichier de ressources vous permet de changer les données sans avoir à recompiler l&rsquo;intégralité de votre application.</p>
<p>Le format de fichier de ressources .resx se compose d&rsquo;entrées XML, qui spécifient des objets et des chaînes dans des balises XML. Le .NET Framework fournit une prise en charge complète pour la création et la localisation des ressources. Ceux-ci doivent être créés d’une façon particulière  pour fonctionner correctement. </p>
<p>Les fichiers de ressources de la langue par défaut de votre application doivent être nommés comme suit : nom_du_fichiers.resx.</p>
<p>Les fichiers pour les autres langues doivent suivre le format suivant : nom_du_fichier.culture.resx. </p>
<p><strong>Ce qu’il faut savoir sur la culture</strong></p>
<p>La culture ici doit définir le code la langue. Un code de langue est une convention symbolique permettant d’identifier une langue ou une variété dialectale ou régionale, ou un ensemble de langues par un identifiant défini dans un code, sans avoir à nommer la langue désignée elle-même.</p>
<p>La culture peut être neutre. Dans ce cas, elle sera codée sur deux caractères. </p>
<p><strong>Exemple :</strong> en pour l’Anglais et fr pour le français.</p>
<p>Ou être stricte. Dans ce cas, elle sera codée sur quatre caractères ayant le format suivant « xx-XX », deux caractères minuscules pour la langue, et les deux suivantes en majuscules pour la variante régionale.</p>
<p><strong>Exemple :</strong> fr-FR pour le français de France, en-US pour l’anglais des États-Unis et en-GB pour l’anglais de la Grande-Bretagne.</p>
<p><strong>NB :</strong> Le fichier de ressource par défaut est utilisé si aucune culture n’est définie dans l’application ou si aucune ressource n’existe pour la culture qui a été définie.</p>
<p><strong>Architecture.</strong></p>
<p>Pour rester dans la logique de regroupement qu’impose ASP.NET MVC, il est préférable que l’arborescence de vos fichiers de ressources soit  semblable à la capture ci-dessous :</p>
<p><img src="http://blog.developpez.com/media/folderview.PNG" width="641" height="349" alt="" /></p>
<p>Vous allez donc créer un dossier Ressources, en faisant un clic droit dans l’explorateur de projet et  en cliquant sur Ajouter, puis en sélectionnant l’option Nouveau dossier.</p>
<p>Dans ce dossier vous allez procéder de même pour créer les dossiers Models, Views, etc.</p>
<p>Par la suite, vous devez créer les différents fichiers de ressources.<br />
Je vous recommande de commencer par celui de la page Layout.chtml.  Pour cela, vous allez créer les fichiers Layout.resx pour la langue par défaut et Layout.fr.resx pour le français. </p>
<p>Pour créer ces fichiers,  faites un clic droit sur le sous-dossier Shared, sélectionnez l’option Ajouter, puis cliquez sur Ajouter un nouvel élément.<br />
Dans la boite de dialogue qui va s’afficher, sélectionnez le type de fichier Ressources File, et renseignez le nom _Layout.resx dans la zone réserver à cet effet, puis cliquez sur Ajouter.</p>
<p><img src="http://blog.developpez.com/media/CreationFichierRessources.PNG" width="801" height="456" alt="" /></p>
<p>Faites de même pour créer le fichier Layout.fr.resx et les autres fichiers de ressources.</p>
<p>Maintenant, vous devez déplacer les textes qui sont dans votre fichier _Layout.cshtml dans le fichier de ressources, en renseignant le nom (comme celui d’une variable), la valeur (qui est le texte contenu dans le page) et une description s’il y a lieu.</p>
<p>Prenez la peine de vérifier que la zone « <strong>Acces Modifier</strong> » est définie à Public. Sinon, les valeurs que vous avez définies ne seront pas accessibles dans les vues.</p>
<p><img src="http://blog.developpez.com/media/DefaultLayoutRessources.PNG" width="624" height="316" alt="" />  </p>
<p>Renseignez également la traduction de ces textes pour le fichier _Layout.fr.resx.</p>
<p>Attention, le nom doit être le même que celui que vous avez défini dans le fichier de ressources par défaut pour cette page.</p>
<p><img src="http://blog.developpez.com/media/FrLayoutRessources.PNG" width="628" height="321" alt="" /> </p>
<p>NB : Contrairement à ASP.NET WebForms où il est conseillé de créer les fichiers de ressources dans les dossiers  App_GlobalResources et App_LocalResources, avec ASP.NET MVC, l’utilisation de ces dossiers sera une source de problèmes pour vous. Je vous  conseille donc d’utiliser un dossier différent (comme ce que nous avons fait plus haut), ou créer les ressources dans une librairie séparée.</p>
<p>Pour plus de détail sur le sujet, je vous invite à lire cet excellent billet de blog de K. Scott Allen : <a href="http://odetocode.com/Blogs/scott/archive/2009/07/16/resource-files-and-asp-net-mvc-projects.aspx">Resource Files and ASP.NET MVC Projects</a>.  </p>
<p><strong>Modification de la vue</strong></p>
<p>Maintenant que vous avez transféré le texte de la vue vers les fichiers de ressources, vous devez maintenant faire pointer les zones d’affichage de ces textes vers les ressources correspondantes.</p>
<p>Pour cela, ouvrez le fichier Layout.chstml et remplacez le texte suivant :</p>
<div id="codeSnippetWrapper">
<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;">div</span> <span style="color: #ff0000;">id</span><span style="color: #0000ff;">="title"</span><span style="color: #0000ff;">&gt;</span><br />   <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h1</span><span style="color: #0000ff;">&gt;</span>My MVC Application<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">h1</span><span style="color: #0000ff;">&gt;</span><br /><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">div</span><span style="color: #0000ff;">&gt;</span><br /></pre>
<p></div>
<p>Par </p>
<div id="codeSnippetWrapper">
<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;">div</span> <span style="color: #ff0000;">id</span><span style="color: #0000ff;">="title"</span><span style="color: #0000ff;">&gt;</span><br />   <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h1</span><span style="color: #0000ff;">&gt;</span> @MvcApplication1.Resources.Views.Shared._Layout.Title<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">h1</span><span style="color: #0000ff;">&gt;</span><br /><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">div</span><span style="color: #0000ff;">&gt;</span></pre>
<p></div>
<p>En observant ces lignes de code, vous pouvez constater que la valeur est accessible comme une propriété de classe.  En effet, toutes les ressources sont compilées vers une DLL (MvcApplication1.Resources.Views.Shared). Le nom du fichier (_Layout) est utilisé comme nom de la classe et le nom donné au texte est considéré comme celui de la propriété de la classe.</p>
<p><strong>Premier aperçu</strong></p>
<p>À ce stade, si tout est correct, vous pouvez déjà obtenir un premier aperçu de votre application localisée en définissant juste la culture qui est utilisée par celle-ci. </p>
<p>Pour cela, vous pouvez simplement définir la culture dans le fichier Globla.aspx en utilisant la méthode Application_BeginRequest qui est exécutée lors du lancement de l’application. Le code permettant de faire cela est le suivant :</p>
<div id="codeSnippetWrapper">
<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;">protected</span> <span style="color: #0000ff;">void</span> Application_BeginRequest(<span style="color: #0000ff;">object</span> sender, EventArgs e)<br />{<br />          <br />    Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(<span style="color: #006080;">"fr"</span>);<br />} </pre>
<p></div>
<p>En modifiant le paramètre qui est passé à la fonction, CreateSpecificCulture() entre l’anglais(en) et le français(fr), on obtient le résultat suivant :</p>
<p><img src="http://blog.developpez.com/media/Secondtest.PNG" width="632" height="638" alt="" /> </p>
<p>Nous avons défini une seule valeur localisée pour la vue Layout. Vous pouvez faire de même pour les autres vues.</p>
<p>Voilà, nous venons de finir avec les premières étapes d’internationalisation de notre application, qui nous ont permis de créer les fichiers de ressources et localiser nos vues. Dans la partie suivante, nous verrons comment procéder pour les fichiers du modèle avec les messages d&rsquo;erreur de validation et comment mettre en ouvre un mécanisme de basculer entre les cultures sur l’interface utilisateur.</p>
<p>Lire la partie suivante : <a href="http://blog.developpez.com/lilroma/p10697/">Internationalisation d’une application ASP.NET MVC 3 Razor part 2 : messages d’erreur de validation et DisplayAttribute</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Internationalisation d’une application ASP.NET MVC 3 Razor part 2 : messages d’erreur de validation et DisplayAttribute</title>
		<link>https://blog.developpez.com/lilroma/p10702/net/internationalisation_d_une_application_a_2</link>
		<comments>https://blog.developpez.com/lilroma/p10702/net/internationalisation_d_une_application_a_2#comments</comments>
		<pubDate>Fri, 10 Feb 2012 08:46:15 +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[RAZOR]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Dans mon précédent billet de blog, nous nous sommes familiarisés avec les différents concepts qui sont liés à l’internationalisation d’une application sur l’écosystème .NET. Nous avons également procédé à la création des fichiers de ressources et obtenu un premier aperçu &#8230; <a href="https://blog.developpez.com/lilroma/p10702/net/internationalisation_d_une_application_a_2">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Dans mon <a href="http://blog.developpez.com/lilroma/p10697/">précédent billet de blog</a>, nous nous sommes familiarisés avec les différents concepts qui sont liés à l’internationalisation d’une application sur l’écosystème .NET. Nous avons également procédé à la création des fichiers de ressources et obtenu un premier aperçu de notre application.</p>
<p>Cependant, avec ASP.NET MVC, il est possible de définir les messages des erreurs de validation dans le modèle, au sein des attributs fournis par l’espace de noms DataAnnotations utilisé pour la validation des données utilisateur.  Il est également possible de définir les textes par défaut qui seront affichés dans les vues pour les intitulés des champs des formulaires.</p>
<p>Si vous avez donc défini ces infirmations dans votre modèle, vous allez vous rendre compte que ce que nous avons fait jusqu’ici ne permet pas de localiser ces champs texte.</p>
<p>Nous verrons donc dans ce billet comment internationaliser les messages des erreurs de validation et les intitulés des champs des formulaires définis dans le modèle.</p>
<p><span id="more-39"></span></p>
<p>Pour cet exemple, nous allons créer dans l’application que nous avons utilisée précédemment (dans la partie 1) un formulaire permettant l’enregistrement des produits. La classe qui sera utilisée est la suivante :</p>
<div id="codeSnippetWrapper">
<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> <span style="color: #0000ff;">class</span> ProductModel<br />    {<br />        <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Name { get; set; }<br />        <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Description { get; set; }<br />        <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">decimal</span> Price { get; set; }<br />    }</pre>
<p></div>
<p>Pour créer le modèle correspondant, ajoutez au dossier Model  un fichier de classe ProductModel.cs qui contiendra le code ci-dessus.</p>
<p>À ce stade, aucune logique de validation des données n’est implémentée. À l’aide de DataAnnotations nous allons mettre en œuvre la validation des données pour cette classe.</p>
<p>Le nouveau code de la classe ProductModel produit est le suivant :</p>
<div id="codeSnippetWrapper">
<div 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> ProductModel<br />    {<br />        [Required(ErrorMessage = <span style="color: #006080">&quot;Le libellé du produit est obligatoire&quot;</span>)]<br />        [Display(Name = <span style="color: #006080">&quot;Nom&quot;</span>)]<br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Name { get; set; }<br />        [Required(ErrorMessage = <span style="color: #006080">&quot;La description du produit est obligatoire&quot;</span>)]<br />        [Display(Name = <span style="color: #006080">&quot;Description&quot;</span>)]<br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Description { get; set; }<br />        [Required(ErrorMessage = <span style="color: #006080">&quot;La prix est obligatoire&quot;</span>)]<br />        [Display(Name = <span style="color: #006080">&quot;Prix&quot;</span>)]<br />        [Range(0.01, 400.00, ErrorMessage = <span style="color: #006080">&quot;Le prix doit être compris entre 0.01 et 400.00&quot;</span>)]<br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">decimal</span> Price { get; set; }<br />    }</pre>
<p></div>
<p></div>
<p>Nous allons commencer par internationaliser les messages des erreurs de  validation.</p>
<p>Pour cela, dans le sous-dossier Model du dossier Resources, vous allez créer deux nouveaux fichiers de ressources ProductModel, dans lesquels vous allez définir les messages d’erreurs de validation pour cette classe comme l’illustre la capture ci-dessous :</p>
<p><img src="http://blog.developpez.com/media/DefaultModelResources.PNG" width="573" height="306" alt="" /></p>
<p><img src="http://blog.developpez.com/media/ModelResourcesfr.PNG" width="581" height="309" alt="" /> </p>
<p>Pour localiser ces valeurs, nous allons utiliser les propriétés <strong>ErrorMessageResourceType</strong> et <strong>ErrorMessageResourceName</strong>.</p>
<p>La propriété ErrorMessageResourceType permet de spécifier le type de message d’erreur qui est associé à un contrôle de validation.<br />
La propriété ErrorMessageResourceName, quant à elle, sera utilisée pour définir le nom de la ressource pour recherche le message d’erreur.</p>
<p>Le nouveau code de la classe ProductModel permettant donc de faire cela est le suivant :</p>
<div id="codeSnippetWrapper">
<div 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> ProductModel<br />    {<br />        [Required(ErrorMessageResourceType = <span style="color: #0000ff">typeof</span>(MvcApplication1.Resources.Models.ProductModel),<br />             ErrorMessageResourceName = <span style="color: #006080">&quot;NameRequired&quot;</span>)]<br />        [Display(Name = <span style="color: #006080">&quot;Nom&quot;</span>)]<br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Name { get; set; }<br />         [Required(ErrorMessageResourceType = <span style="color: #0000ff">typeof</span>(MvcApplication1.Resources.Models.ProductModel),<br />             ErrorMessageResourceName = <span style="color: #006080">&quot;DescriptionRequired&quot;</span>)]<br />        [Display(Name = <span style="color: #006080">&quot;Description&quot;</span>)]<br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Description { get; set; }<br />         [Required(ErrorMessageResourceType = <span style="color: #0000ff">typeof</span>(MvcApplication1.Resources.Models.ProductModel),<br />             ErrorMessageResourceName = <span style="color: #006080">&quot;PriceRequired&quot;</span>)]<br />        [Display(Name = <span style="color: #006080">&quot;Prix&quot;</span>)]<br />        [Range(0.01, 400.00, ErrorMessageResourceType = <span style="color: #0000ff">typeof</span>(MvcApplication1.Resources.Models.ProductModel),<br />             ErrorMessageResourceName = <span style="color: #006080">&quot;PriceRange&quot;</span>)]<br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">decimal</span> Price { get; set; }<br />    }<br /></pre>
<p></div>
<p></div>
<p>À ce stade, si nous exécutons notre application, nous obtenons le résultat suivant :</p>
<p>Pour l’anglais </p>
<p><img src="http://blog.developpez.com/media/Errormessagelocalisation.PNG" width="593" height="398" alt="" /> </p>
<p>Pour le français </p>
<p><img src="http://blog.developpez.com/media/Errormessagelocalisationfr.PNG" width="621" height="435" alt="" /></p>
<p>Nous avons finalisé avec les messages des erreurs de validation. Passons maintenant à la localisation des attributs Display.</p>
<p>Avec la version précédente d’ASP.NET MVC,  la définition des noms des propriétés qui seront affichées dans l’interface utilisateur se faisait en décorant la propriété avec la classe DisplayNameAttribute. Cependant, elle ne possède qu’un seul constructeur et ne supporte pas de ce fait la localisation. </p>
<p>Pour internationaliser donc ces valeurs, il fallait du code personnalisé après beaucoup d’effort de programmation. Ce problème est résolu avec ASP.NET MVC 3. La localisation des noms des propriétés peut se faire assez aisément dans le modèle en utilisant la classe DisplayAttribute.</p>
<p>Cette classe possède plusieurs propriétés, y compris les propriétés ResourceType, permettant de définir le type de ressource pour les propriétés localisées et Name pour définir le nom de la ressource.</p>
<p>Le nouveau code de la classe ProductModel sera donc le suivant :</p>
<div 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> ProductModel<br />    {<br />        [Required(ErrorMessageResourceType = <span style="color: #0000ff">typeof</span>(MvcApplication1.Resources.Models.ProductModel),<br />             ErrorMessageResourceName = <span style="color: #006080">&quot;NameRequired&quot;</span>)]<br />        [Display(Name = <span style="color: #006080">&quot;DisplayName&quot;</span>, ResourceType = <span style="color: #0000ff">typeof</span>(MvcApplication1.Resources.Models.ProductModel))]<br />         <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Name { get; set; }<br />         [Required(ErrorMessageResourceType = <span style="color: #0000ff">typeof</span>(MvcApplication1.Resources.Models.ProductModel),<br />             ErrorMessageResourceName = <span style="color: #006080">&quot;DescriptionRequired&quot;</span>)]<br />         [Display(Name = <span style="color: #006080">&quot;DisplayDescription&quot;</span>, ResourceType = <span style="color: #0000ff">typeof</span>(MvcApplication1.Resources.Models.ProductModel))]<br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Description { get; set; }<br />         [Required(ErrorMessageResourceType = <span style="color: #0000ff">typeof</span>(MvcApplication1.Resources.Models.ProductModel),<br />             ErrorMessageResourceName = <span style="color: #006080">&quot;PriceRequired&quot;</span>)]<br />         [Display(Name = <span style="color: #006080">&quot;DisplayPrice&quot;</span>, ResourceType = <span style="color: #0000ff">typeof</span>(MvcApplication1.Resources.Models.ProductModel))]<br />        [Range(0.01, 400.00, ErrorMessageResourceType = <span style="color: #0000ff">typeof</span>(MvcApplication1.Resources.Models.ProductModel),<br />             ErrorMessageResourceName = <span style="color: #006080">&quot;PriceRange&quot;</span>)]<br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">decimal</span> Price { get; set; }<br />    }</pre>
<p></div>
<p>Les fichiers de ressources utilisés seront modifiés comme suit :</p>
<p><img src="http://blog.developpez.com/media/Displaylocalisation.PNG" width="573" height="287" alt="" /></p>
<p><img src="http://blog.developpez.com/media/Displaylocalisationfr.PNG" width="569" height="283" alt="" /> </p>
<p>À ce stade, si nous exécutons notre application, nous obtenons le résultat suivant :</p>
<p>Pour l’anglais </p>
<p><img src="http://blog.developpez.com/media/DisplayAttribute.PNG" width="591" height="402" alt="" /></p>
<p>Pour le français </p>
<p><img src="http://blog.developpez.com/media/DisplayAttributefr.PNG" width="603" height="402" alt="" /> </p>
<p>Et voilà, nous venons de finir avec la localisation des textes du modèle.  Vous pouvez vous rendre compte combien il est facile grâce aux nouveautés introduites par ASP.NET MVC 3 d’internationaliser les messages d’erreur de validation et les intitulés des  champs des formulaires dans la vue.</p>
<p>La prochaine étape sera la mise au point sur l’interface utilisateur d’un mécanisme permettant à l’internaute de modifier la culture pour faire passer l’application d’une langue à une autre.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WebMatrix : retour d&#8217;expérience sur l’EDI Web gratuit</title>
		<link>https://blog.developpez.com/lilroma/p10495/net/webmatrix_retour_d_experience_sur_l_edi_</link>
		<comments>https://blog.developpez.com/lilroma/p10495/net/webmatrix_retour_d_experience_sur_l_edi_#comments</comments>
		<pubDate>Sat, 12 Nov 2011 11:59:42 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Divers]]></category>
		<category><![CDATA[RAZOR]]></category>
		<category><![CDATA[WebMatrix]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Lors de la conférence Build Windows de septembre denier, Microsoft a présenté des préversions de ses principales technologies de développement. La communication autour de ces produits a étouffé la sortie de la bêta de la version deux d’un de mes &#8230; <a href="https://blog.developpez.com/lilroma/p10495/net/webmatrix_retour_d_experience_sur_l_edi_">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Lors de la conférence Build Windows de septembre denier, Microsoft a présenté des préversions de ses principales technologies de développement. La communication autour de ces produits a étouffé la sortie de la bêta de la version deux d’un de mes environnements de développement favoris : WebMatrix.</p>
<table>
<tr align='center'>
<td align='center'><img src="http://blog.developpez.com/media/WebMatrix.jpg" width="215" height="234" alt="" /></td>
</tr>
</table>
<p>J’avais néanmoins eu l’occasion d’annoncer vite fait la sortie de l’outil sur DVP. Je vais revenir dans une nouvelle série de billets de blog sur l’EDI Web ainsi que sur les nouveautés de la bêta de WebMatrix 2 et de la Developer Preview de Web Pages 2.</p>
<p>Avant de me lancer dans la rédaction de ces articles, je tiens à partager avec les lecteurs de mon blog mon retour d’expérience sur la première version de WebMatrix.</p>
<p><span id="more-48"></span></p>
<p><strong>Présentation de WebMatrix</strong></p>
<p>Pour rappel, WebMatrix est un environnement de développement Web léger (15 Mo), efficace et surtout gratuit, développé par Microsoft. Il permet aux développeurs Web de créer et gérer des applications Web sur la plate-forme Windows, tout en restant compatibles avec les produits Microsoft Visual Studio, SQL Server ou encore PHP sur Windows.</p>
<p><strong>Pourquoi avoir choisi WebMatrix ?</strong></p>
<p>Au sein de notre équipe, nous sommes confrontés assez couramment à des petits projets Web à faibles budgets, tant en ASP.NET qu’en PHP.  L’idéal pour nous était donc d’avoir des éditeurs légers, simples et surtout gratuits, nous permettant de développer rapidement ces applications.</p>
<p>Nous avons trouvé la solution à nos besoins en WebMatrix.  L’EDI a mis à notre dispositif toutes les ressources dont nous avions besoin pour créer rapidement, avec un gain en temps important des applications Web dynamiques en ASP.NET ou PHP, avec accès à des bases de données SQL Server ou MySQL.</p>
<p><strong>L’EDI qui affranchit le développeur des tâches de configuration</strong></p>
<p>Depuis que je développe sous Windows, j’ai toujours été réticent à l’idée d’avoir à utiliser une solution comme XAMPP, qui m’installe et configure automatiquement mon serveur de base de données MySQL, PHP et le serveur Web Apache. Mon problème réside surtout au niveau d’Apache, qui s’installe à côté de mon serveur IIS et qui peut bien évidemment engendrer un problème de violation de port dans certains cas.</p>
<p>De ce fait, J’opte donc couramment pour mes travaux en PHP (et oui, je fais aussi du PHP, vous pouvez trouver mes articles sur l’interopérabilité entre .NET et PHP <a href="http://rdonfack.developpez.com/tutoriels/dotnet/phalanger-introduction-php-sur-plate-forme-net/">ici</a> et <a href="http://rdonfack.developpez.com/tutoriels/php/utilisation-classes-net-dans-php/">là</a>) d’installer moi-même PHP et MySQL (si je dois l’utiliser), ensuite procéder à la configuration d’IIS pour exécuter PHP.</p>
<p>Cette approche fastidieuse, peut-être déconcertante pour un développeur inexpérimenté. WebMatrix élimine ces contraintes. L’EDI peut-être utilisé  pour télécharger, installer et configurer PHP et MySQL, pour être utilisé avec IIS7 Express.</p>
<p><strong>Créer rapidement des applications Web avec le moins de concept en développement Web</strong></p>
<p>WebMatrix minimise le nombre de concepts qu&rsquo;un débutant en développement a besoin de connaitre pour mettre sur pied des sites Web simples. Un développeur peut rapidement créer une application sans toutefois avoir besoin de maitriser l&rsquo;architecture complexe des technologies Web .NET.</p>
<p>Lorsque l’application est lancée, une fenêtre de démarrage présente quatre options à l’utilisateur, lui permettant de créer un site à partir de zéro, à partir d’un modèle, d’ouvrir un site existant ou un site Web à partir de la galerie d’applications.</p>
<p>L’interface utilisateur, d’une ergonomie assez aboutie façon WPF, utilise le ruban qui a fait son apparition avec Office 2007 à la place d’une barre de menu. Le développeur retrouve donc facilement les outils mis à sa disposition, qui ne sont pas noyés dans des menus.</p>
<p><img src="http://blog.developpez.com/media/Interface.PNG" width="496" height="329" alt="" /> </p>
<p>L’éditeur de code prend bien en charge ASP.NET, HTML5, CCS3, JavaScript et PHP, et permet d’éditer facilement avec le support de l’InteliSence, des pages cshtml, des fichiers de scripts, des layouts, etc.</p>
<p><strong>Le moteur de vue Razor</strong></p>
<p>WebMatrix repose sur le moteur de vue Razor pour la création des applications ASP.NET dynamiques. 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>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>Un aspect qui m’a vraiment impressionné avec Razor dans WebMatrix est la création des Helpers, qui introduit une autre façon d’écrire des méthodes/fonctionnalités réutilisables.</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">@helper Somme(<span style="color: #0000ff">int</span> a, <span style="color: #0000ff">int</span> b)<br />{<br />    @{<br />        var sum = a + b;<br />    }<br />    <br />    &lt;b&gt;@sum&lt;/b&gt;<br />}</pre>
<p></div>
<p>La création des Helpers avec WebMatrix se résume en la définition dans le dossier App_code, d’un fichier .cshtml avec les méthodes que vous pouvez appeler facilement dans n’importe quelle vue de votre application.</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;">@MuHelper.Somme(4,5)</pre>
<p></div>
<p>Le support des Layouts et Sections introduits par Razor, va offrir au développeur des moyens de définir un design cohérent pour son application.</p>
<p>Pour rappel, les Layouts  (équivalent des Masterpages)  sont utilisés pour regrouper, dans une page spécifique, les éléments communs de mise en page pour l’application (menu, entête, pied de page, scripts JavaScript utilisés par toutes les pages).</p>
<p><strong>Razor + WebMatrix ou le retour du code spaghetti d’ASP classique ?</strong></p>
<p>« Razor 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>A la lecture de cette phrase, certaines personnes vont certainement se demander si l’on ne revient pas au code spaghetti difficilement maintenable avec une sécurité approximative comme avec ASP classique.</p>
<p>Personnellement, lorsque j’ai entendu parler pour la première fois de Razor et WebMatrix, je me suis dit waouh, nous voila revenu à ASP classique. Mais, lorsque je me suis familiarisé avec ces plateformes, j’ai constaté que Razor n’est en aucun point comparable avec VBScript.</p>
<p>Il s’appuie sur la puissance de la plateforme .NET qui remplace COM et ActiveX, et fournir des puissants outils pour assurer la sécurité d’un site Web. L’accès aux données se fait via ADO.NET, qui est également en déphasage complet avec la technologie ADO utilisée en ASP classique. </p>
<p><strong>Accéder rapidement et avec souplesse aux données</strong></p>
<p>L’accès et la manipulation des données avec WebMatrix  sont assez simples. L’EDI dispose d’une interface qui met à la disposition du développeur les fonctionnalités d’administration de base (création de la BD, ajout d’une table, insertion des données, etc.) pour BD MySQL ou SQL Server. Donc, plus besoin d’un outil comme PHPmyAdmin ou MySQL WorkBench sur ma machine de Dev  pour administrer MySQL ;).</p>
<p>La manipulation fluide des données dans une vue se fera avec la nouvelle classe Database. Je peux me connecter à ma BD et exécuter une requête en utilisant juste les quelques 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 db = Database.Open(<span style="color: #006080;">"MonSiteTest"</span>);<br />    var clients = db.Query(<span style="color: #006080;">"Select * from clients"</span>);<br />}</pre>
<p></div>
<p>La requête retourne un objet IEnumerable dynamic, qui tire parti des  objets dynamiques introduits par C# 4. Ce qui suppose que je peux faire un truc du genre :</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;">foreach</span>(var client <span style="color: #0000ff;">in</span> clients){<br />            &lt;tr&gt;<br />                &lt;td&gt;@client.Nom&lt;/td&gt;<br />                &lt;td&gt;@client.Prenom&lt;/td&gt;<br />                &lt;td&gt;@client.Email&lt;/td&gt;<br />            &lt;/tr&gt;<br />    }<br /></pre>
<p></div>
<p>Et pourtant, je n’ai déclaré cette classe nulle part. Ce n’est pas fabuleux ;).</p>
<p>Pour les habituer des ORM, qui ont abandonné cette veille habitude de taper du SQL dans le code, avec la classe Database, vous êtes obligés d’écrire vous-mêmes vos requêtes.</p>
<p>OK, on me dira bonjour les attaques par injections SQL ! Et moi, je dirais n’y comptez pas. En effet, je peux par exemple procéder comme suit pour insérer des données dans ma BD avec la classe Database :</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 db = Database.Open(<span style="color: #006080;">"MonSiteTest"</span>);<br />         var sqlreq = <span style="color: #006080;">"INSERT INTO clients (Nom, Prenom, Email) "</span> +<br />                <span style="color: #006080;">"VALUES (@0, @1, @2)"</span>;<br />            db.Execute(sqlreq, Nom, Prenom, Email);<br />}</pre>
<p></div>
<p>Et, j’ai là ma requête paramétrée avec WebMatrix, qui me met à l’abri des attaques par injection SQL.</p>
<p>On va regretter cependant la non-prise en charge de PostgreSQL, qui est de plus en plus présent dans le monde du développement Web.</p>
<p><strong>Galerie d’applications</strong></p>
<p>Voila un aspect de l’EDI qui a beaucoup intéressé l’utilisateur à temps partiel du CMS Joomla que je suis.  A mon avis, c’est avec cette fonctionnalité que Microsoft va attirer le plus de développeurs PHP, qui vont trouver en WebMatrix une véritable alternative pour l’accès, la manipulation et la publication des CMS et projets Web open source.</p>
<p>WebMatrix dispose d&rsquo;une galerie Web pouvant se connecter au &laquo;&nbsp;Web Application Gallery&nbsp;&raquo; de Microsoft pour vous donner accès à une vaste collection de CMS et applications open sources populaires comme WordPress, Dupral, Joomla, mopCommerce, blogEngine.NET ou encore DotNetNuke, pouvant être installés, édités et publiés directement à partir de l’éditeur.</p>
<p><img src="http://blog.developpez.com/media/Appgalerie.PNG" width="524" height="347" alt="" /> </p>
<p>Plus besoin donc de chercher le site officiel d’un projet, le télécharger soi-même, procéder à son installation et configuration, etc. WebMatrix fait tout pour vous.</p>
<p><strong>Les Helpers Razor et le gestionnaire de packages</strong></p>
<p>La réutilisation : un concept de base de la programmation orientée objet, qui permet un gain de temps important. Le maitre mot des Helpers Razor accessibles depuis le gestionnaire de packages WebMatrix est la réutilisation.</p>
<p>Les Helpers sont des composants contenant des fonctionnalités réutilisables, qui vont simplifier le rendu du code HTML dans la vue. Très faciles d&rsquo;utilisation, ils s&rsquo;avèrent assez utiles dans le développement. Les Helpers fournissent au développeur, 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>Avec ces composants l’intégration d’un flux twitter, d’une zone de recherche Bing, d’un widget facebook, d’un module Paypal,  le stockage des données sur Windows Azure Storage, la mise en cache, l’analyse du trafic de son site Web, etc. n’ont jamais été aussi simple.</p>
<p>Je tiens à souligner que le gestionnaire de packages WebMatrix n’a rien à voir avec le gestionnaire de packages .NET Nuget, qui d’ailleurs a été introduit dans la version 2 de WebMatrix. Mais, il faut noter cependant que celui-ci utilise les flux NuGet pour mettre à la disposition du développeur les Helpers Razor. </p>
<p><strong>Optimisation du SEO et amélioration des performances</strong></p>
<p>Une bonne partie du trafic d’un site Web passe par les moteurs de recherche. J’ai apprécié l’introduction d’un outil de SEO (Search Engine Optimization) dans WebMatrix, qui fournit un rapport riche, permettant d’optimiser le code pour  améliorer le référencement naturel de son site.</p>
<p><img src="http://blog.developpez.com/media/seoetoptimisation.PNG" width="523" height="237" alt="" /> </p>
<p>La réécriture d’URL est également au menu. J’ai oublié de le mentionner, mais lors du processus d’installation de WebMatrix, UrlRewriter 2.0 est également installé. Ce qui suppose que vous pouvez également optimiser votre site en utilisation la réécriture d’URL.</p>
<p><strong>Déploiement</strong></p>
<p>Une fois que vous avez finalisé avec la conception de votre site, plus besoin de le générer et utiliser un client FTP ou autres pour déployer celui-ci. WebMatrix intègre des fonctionnalités permettant de déployer son site en utilisant FTP, ou WebDeploy.</p>
<p><img src="http://blog.developpez.com/media/Publisite.PNG" width="488" height="188" alt="" /></p>
<p>En cliquant simplement sur le bouton Publish, l’éditeur affiche une fenêtre permettant de publier son site Web en renseignant les paramètres fournis par l’hébergeur. Bien plus, si vous ne disposez pas d’un hébergeur, vous pouvez à partir de l’outil, effectuer une recherche pour trouver l’hébergeur le plus adapté à vos besoins.</p>
<p><strong>Le revers de la médaille</strong></p>
<p>Dans plusieurs articles que j’ai trouvés sur WebMatrix, l’absent est mis sur le fait que l’EDI est idéal pour les débutants.  Je ne réfute pas ces affirmations, mais j’émets des réserves pour le débutant qui demain sera confronté à des costauds projets d’entreprises, qui nécessitent une bonne maitrise de l’architecture, des Patterns et autres bonnes pratiques en développement Web.</p>
<p>Personnellement, je trouve qu’il serait beaucoup plus difficile pour un débutant d’avoir une bonne maitrise du développement professionnel, s’il utilise comme porte d’entrée un outil qui fait abstraction de tous les concepts, architectures et autres bonnes pratiques.</p>
<p>WebMatrix aura plutôt tendance à abrutir celui-ci, le faisant croire que même la création d’une costaude solution professionnelle sera aussi simple. Donc, pour le débutant qui vise le monde professionnel, autant mieux se tourner vers des outils qui permettent de s’appliquer lors du développement.</p>
<p><strong>Conclusion</strong></p>
<p>Comme vous pouvez le constater, WebMatrix est assez intéressant. Restez connecté pour la suite des billets sur le sujet.</p>
<p>Sur le même sujet :</p>
<p> &#8211; <a href="http://rdonfack.developpez.com/tutoriels/web/webmatrix-decouverte-et-prise-main-outil-developpement-web-gratuit-tout/">Découverte et prise en main de WebMatrix</a> ;</p>
<p> &#8211; <a href="http://rdonfack.developpez.com/tutoriels/dotnet/webmatrix-utilisation-helpers-et-galerie-applications/">WebMatrix : utilisation des Helpers Razor et de la galerie d&rsquo;applications</a> ;</p>
<p> &#8211; <a href="http://blog.developpez.com/lilroma/p10084/net/title-198/">Comment activer et utiliser xdebug avec WebMatrix</a> ; </p>
<p> &#8211; <a href="http://aka.ms/webmatrix2blog">Télécharger WebMatrix 2 bêta</a> . </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
