<?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; Visual Studio</title>
	<atom:link href="https://blog.developpez.com/lilroma/pcategory/net/visual-studio/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>ASP.NET Core : Tests unitaires d’une application MVC avec MsTest V2</title>
		<link>https://blog.developpez.com/lilroma/p13101/net/asp-net-core-tests-unitaires-dune-application-mvc-avec-mstest-v2</link>
		<comments>https://blog.developpez.com/lilroma/p13101/net/asp-net-core-tests-unitaires-dune-application-mvc-avec-mstest-v2#comments</comments>
		<pubDate>Sat, 27 Aug 2016 14:24:30 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP.NET Core]]></category>
		<category><![CDATA[MsTest V2]]></category>
		<category><![CDATA[Tests Unitaires]]></category>
		<category><![CDATA[Visuall Studio 2015]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/lilroma/?p=112</guid>
		<description><![CDATA[ASP.NET Core apporte une refonte complète de la solution de développement Web de Microsoft. Le recours à un nouvel environnement d&#8217;exécution (DNX) et son architecture entrainent une incompatibilité avec de nombreux outils. En effet, si vous développez un projet ASP.NET &#8230; <a href="https://blog.developpez.com/lilroma/p13101/net/asp-net-core-tests-unitaires-dune-application-mvc-avec-mstest-v2">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>ASP.NET Core apporte une refonte complète de la solution de développement Web de Microsoft. Le recours à un nouvel environnement d&rsquo;exécution (DNX) et son architecture entrainent une incompatibilité avec de nombreux outils.</p>
<p><a href="http://blog.developpez.com/lilroma/files/2016/08/aspnetcore.png"><img src="http://blog.developpez.com/lilroma/files/2016/08/aspnetcore-300x218.png" alt="aspnetcore" class="alignnone size-medium wp-image-113" /></a></p>
<p>En effet, si vous développez un projet ASP.NET Core qui utilise uniquement le CoreCLR, vous ne devez qu’utiliser les dépendances qui offrent une prise en charge du CoreCLR.</p>
<p>Depuis l’annonce de .NET Core, de nombreux éditeurs de librairies se sont activés pour offrir une prise en charge de cette version, c’est notamment le cas des outils de tests, dont<strong> MSTest</strong>. </p>
<p>Microsoft a publié il y a quelques semaines une préversion de la V2 de MsTest, qui introduit une architecture unifiée et apporte une prise en charge de .NET Core. Dans le cadre de ce billet de blog, nous verrons comment mettre en place des tests unitaires dans un projet ASP.NEt MVC Core avec <strong>MSTest V2</strong>.</p>
<p>Nous allons dans un premier temps créer une application ASP.NET Core en utilisant le modèle Web Application.</p>
<p><span id="more-112"></span></p>
<p><a href="http://blog.developpez.com/lilroma/files/2016/08/image.png"><img src="http://blog.developpez.com/lilroma/files/2016/08/image.png" alt="image" class="alignnone size-medium wp-image-114" /></a></p>
<p>Ceci fait, vous allez ajouter un nouveau projet de type bibliothèque de classe à votre projet.   Pour l’instant, il n’existe pas de modèle de projet pour la nouvelle version du framework de test de Microsoft. Cette prise en charge sera effective dans la version stable de l’outil, avec la sortie de Visual Studio 15.</p>
<p><a href="http://blog.developpez.com/lilroma/files/2016/08/image1.png"><img src="http://blog.developpez.com/lilroma/files/2016/08/image1.png" alt="image1" class="alignnone size-medium wp-image-115" /></a></p>
<p>Ajoutez les dépendances suivantes à votre projet en utilisant la console Nuget :</p>
<ul>
<li>MSTest.TestFramework</li>
<li>MSTest.TestAdapter</li>
<li>dotnet-test-mstest</li>
</ul>
<p>Le package <strong>MSTest.TestFramework</strong> permet d’installer le framework MSTest V2. Pour l’installer, cliquez sur Tools dans la barre de menu de Visual Studio, puis Nuget Package Manager, ensuite sur Package Manager Console. Rassurez-vous que dans la zone Default Project, vous avez sélectionné votre projet de test :</p>
<p><a href="http://blog.developpez.com/lilroma/files/2016/08/image2.png"><img src="http://blog.developpez.com/lilroma/files/2016/08/image2.png" alt="image2" class="alignnone size-medium wp-image-116" /></a></p>
<p>Dans la console NuGet, tapez la commande suivante :</p>
<blockquote><p>Install-Package MSTest.TestFramework -Pre</p></blockquote>
<p><strong>MSTest.TestAdapter</strong> est utilisé pour trouver et exécuter le framework de test sur lequel votre projet de test est basé. Pour l’installer, vous devez exécuter la commande suivante dans la console NuGet :</p>
<blockquote><p>Install-Package MSTest.TestAdapter -Pre:</p></blockquote>
<p>Enfin, vous allez exécuter la commande suivante pour installer le dernier package NuGet :</p>
<blockquote><p>Install-Package dotnet-test-mstest -Pre</p></blockquote>
<p>Vous allez probablement obtenir un message d’erreur d’incompatibilité lors de la restauration des packages par NuGet. Ouvrez le fichier Project.json et remplacez :</p>
<pre style='color:#000000;background:#ffffff'><span style='color:#800000'>"</span><span style='color:#0000e6'>frameworks</span><span style='color:#800000'>"</span><span style='color:#808030'>:</span> <span style='color:#800080'>{</span>
   <span style='color:#800000'>"</span><span style='color:#0000e6'>netstandard1.6</span><span style='color:#800000'>"</span><span style='color:#808030'>:</span> <span style='color:#800080'>{</span>
     <span style='color:#800000'>"</span><span style='color:#0000e6'>imports</span><span style='color:#800000'>"</span><span style='color:#808030'>:</span> <span style='color:#800000'>"</span><span style='color:#0000e6'>dnxcore50</span><span style='color:#800000'>"</span>
   <span style='color:#800080'>}</span>
<span style='color:#800080'>}</span>
</pre>
<p>Par </p>
<pre style='color:#000000;background:#ffffff'><span style='color:#800000'>"</span><span style='color:#0000e6'>frameworks</span><span style='color:#800000'>"</span><span style='color:#808030'>:</span> <span style='color:#800080'>{</span>
   <span style='color:#800000'>"</span><span style='color:#0000e6'>netcoreapp1.0</span><span style='color:#800000'>"</span><span style='color:#808030'>:</span> <span style='color:#800080'>{</span>
     <span style='color:#800000'>"</span><span style='color:#0000e6'>imports</span><span style='color:#800000'>"</span><span style='color:#808030'>:</span> <span style='color:#808030'>[</span>
       <span style='color:#800000'>"</span><span style='color:#0000e6'>dnxcore50</span><span style='color:#800000'>"</span><span style='color:#808030'>,</span>
       <span style='color:#800000'>"</span><span style='color:#0000e6'>portable-net45+win8</span><span style='color:#800000'>"</span>
     <span style='color:#808030'>]</span><span style='color:#808030'>,</span>
 
     <span style='color:#800000'>"</span><span style='color:#0000e6'>dependencies</span><span style='color:#800000'>"</span><span style='color:#808030'>:</span> <span style='color:#800080'>{</span>
       <span style='color:#800000'>"</span><span style='color:#0000e6'>Microsoft.NETCore.App</span><span style='color:#800000'>"</span><span style='color:#808030'>:</span> <span style='color:#800080'>{</span>
         <span style='color:#800000'>"</span><span style='color:#0000e6'>version</span><span style='color:#800000'>"</span><span style='color:#808030'>:</span> <span style='color:#800000'>"</span><span style='color:#0000e6'>1.0.0</span><span style='color:#800000'>"</span><span style='color:#808030'>,</span>
         <span style='color:#800000'>"</span><span style='color:#0000e6'>type</span><span style='color:#800000'>"</span><span style='color:#808030'>:</span> <span style='color:#800000'>"</span><span style='color:#0000e6'>platform</span><span style='color:#800000'>"</span>
       <span style='color:#800080'>}</span>
     <span style='color:#800080'>}</span>
   <span style='color:#800080'>}</span>
 <span style='color:#800080'>}</span>
</pre>
<p>Vous remarquerez sans doute que nous avons marqué notre bibliothèque de classes comme une application (netcoreapp1.0). Cela est dû au fait que notre projet de test utilise le .NET CLI. Sa méthode Main sera fournie par le runner de mstest. </p>
<p>Vous devez par la suite ajouter au fichier Project.json la ligne suivante, pour spécifier que votre projet de test unitaire repose sur mstest :</p>
<blockquote><p>&laquo;&nbsp;testRunner&nbsp;&raquo;: &laquo;&nbsp;mstest&nbsp;&raquo;,</p></blockquote>
<p>Ajoutez une référence au projet ASP.NET Core. Votre fichier Project.json devrait ressembler à ceci :</p>
<pre style='color:#000000;background:#ffffff'><span style='color:#800080'>{</span>
 <span style='color:#800000'>"</span><span style='color:#0000e6'>version</span><span style='color:#800000'>"</span><span style='color:#808030'>:</span> <span style='color:#800000'>"</span><span style='color:#0000e6'>1.0.0-*</span><span style='color:#800000'>"</span><span style='color:#808030'>,</span>

 <span style='color:#800000'>"</span><span style='color:#0000e6'>testRunner</span><span style='color:#800000'>"</span><span style='color:#808030'>:</span> <span style='color:#800000'>"</span><span style='color:#0000e6'>mstest</span><span style='color:#800000'>"</span><span style='color:#808030'>,</span>

 <span style='color:#800000'>"</span><span style='color:#0000e6'>dependencies</span><span style='color:#800000'>"</span><span style='color:#808030'>:</span> <span style='color:#800080'>{</span>
   <span style='color:#800000'>"</span><span style='color:#0000e6'>dotnet-test-mstest</span><span style='color:#800000'>"</span><span style='color:#808030'>:</span> <span style='color:#800000'>"</span><span style='color:#0000e6'>1.1.1-preview</span><span style='color:#800000'>"</span><span style='color:#808030'>,</span>
   <span style='color:#800000'>"</span><span style='color:#0000e6'>MSTest.TestAdapter</span><span style='color:#800000'>"</span><span style='color:#808030'>:</span> <span style='color:#800000'>"</span><span style='color:#0000e6'>1.0.3-preview</span><span style='color:#800000'>"</span><span style='color:#808030'>,</span>
   <span style='color:#800000'>"</span><span style='color:#0000e6'>MSTest.TestFramework</span><span style='color:#800000'>"</span><span style='color:#808030'>:</span> <span style='color:#800000'>"</span><span style='color:#0000e6'>1.0.1-preview</span><span style='color:#800000'>"</span><span style='color:#808030'>,</span>
   <span style='color:#800000'>"</span><span style='color:#0000e6'>NETStandard.Library</span><span style='color:#800000'>"</span><span style='color:#808030'>:</span> <span style='color:#800000'>"</span><span style='color:#0000e6'>1.6.0</span><span style='color:#800000'>"</span><span style='color:#808030'>,</span>
   <span style='color:#800000'>"</span><span style='color:#0000e6'>SampleApp</span><span style='color:#800000'>"</span><span style='color:#808030'>:</span> <span style='color:#800000'>"</span><span style='color:#0000e6'>1.0.0-*</span><span style='color:#800000'>"</span>
 <span style='color:#800080'>}</span><span style='color:#808030'>,</span>

 <span style='color:#800000'>"</span><span style='color:#0000e6'>frameworks</span><span style='color:#800000'>"</span><span style='color:#808030'>:</span> <span style='color:#800080'>{</span>
   <span style='color:#800000'>"</span><span style='color:#0000e6'>netcoreapp1.0</span><span style='color:#800000'>"</span><span style='color:#808030'>:</span> <span style='color:#800080'>{</span>
     <span style='color:#800000'>"</span><span style='color:#0000e6'>imports</span><span style='color:#800000'>"</span><span style='color:#808030'>:</span> <span style='color:#808030'>[</span>
       <span style='color:#800000'>"</span><span style='color:#0000e6'>dnxcore50</span><span style='color:#800000'>"</span><span style='color:#808030'>,</span>
       <span style='color:#800000'>"</span><span style='color:#0000e6'>portable-net45+win8</span><span style='color:#800000'>"</span>
     <span style='color:#808030'>]</span><span style='color:#808030'>,</span>

     <span style='color:#800000'>"</span><span style='color:#0000e6'>dependencies</span><span style='color:#800000'>"</span><span style='color:#808030'>:</span> <span style='color:#800080'>{</span>
       <span style='color:#800000'>"</span><span style='color:#0000e6'>Microsoft.NETCore.App</span><span style='color:#800000'>"</span><span style='color:#808030'>:</span> <span style='color:#800080'>{</span>
         <span style='color:#800000'>"</span><span style='color:#0000e6'>version</span><span style='color:#800000'>"</span><span style='color:#808030'>:</span> <span style='color:#800000'>"</span><span style='color:#0000e6'>1.0.0</span><span style='color:#800000'>"</span><span style='color:#808030'>,</span>
         <span style='color:#800000'>"</span><span style='color:#0000e6'>type</span><span style='color:#800000'>"</span><span style='color:#808030'>:</span> <span style='color:#800000'>"</span><span style='color:#0000e6'>platform</span><span style='color:#800000'>"</span>
       <span style='color:#800080'>}</span>
     <span style='color:#800080'>}</span>
   <span style='color:#800080'>}</span>
 <span style='color:#800080'>}</span>

<span style='color:#800080'>}</span>
</pre>
<p>Ajoutez un nouveau fichier HomeControllerTest.cs à votre projet de test. Ajoutez un appel à l’espace de nom <strong>Microsoft.VisualStudio.TestTools.UnitTesting</strong> :</p>
<blockquote><p>using Microsoft.VisualStudio.TestTools.UnitTesting; </p></blockquote>
<p>Jetons maintenant un coup d’œil au fichier HomeController.cs</p>
<pre style='color:#000000;background:#ffffff'><span style='color:#800000;font-weight:bold'>using</span> System<span style='color:#800080'>;</span>
<span style='color:#800000;font-weight:bold'>using</span> System<span style='color:#808030'>.</span>Collections<span style='color:#808030'>.</span>Generic<span style='color:#800080'>;</span>
<span style='color:#800000;font-weight:bold'>using</span> System<span style='color:#808030'>.</span>Linq<span style='color:#800080'>;</span>
<span style='color:#800000;font-weight:bold'>using</span> System<span style='color:#808030'>.</span>Threading<span style='color:#808030'>.</span>Tasks<span style='color:#800080'>;</span>
<span style='color:#800000;font-weight:bold'>using</span> Microsoft<span style='color:#808030'>.</span>AspNetCore<span style='color:#808030'>.</span>Mvc<span style='color:#800080'>;</span>

<span style='color:#800000;font-weight:bold'>namespace</span> SampleApp<span style='color:#808030'>.</span>Controllers
<span style='color:#800080'>{</span>
   <span style='color:#800000;font-weight:bold'>public</span> <span style='color:#800000;font-weight:bold'>class</span> HomeController <span style='color:#808030'>:</span> Controller
   <span style='color:#800080'>{</span>
       <span style='color:#800000;font-weight:bold'>public</span> IActionResult Index<span style='color:#808030'>(</span><span style='color:#808030'>)</span>
       <span style='color:#800080'>{</span>
           <span style='color:#800000;font-weight:bold'>return</span> View<span style='color:#808030'>(</span><span style='color:#808030'>)</span><span style='color:#800080'>;</span>
       <span style='color:#800080'>}</span>

       <span style='color:#800000;font-weight:bold'>public</span> IActionResult About<span style='color:#808030'>(</span><span style='color:#808030'>)</span>
       <span style='color:#800080'>{</span>
           ViewData<span style='color:#808030'>[</span><span style='color:#800000'>"</span><span style='color:#0000e6'>Message</span><span style='color:#800000'>"</span><span style='color:#808030'>]</span> <span style='color:#808030'>=</span> <span style='color:#800000'>"</span><span style='color:#0000e6'>Your application description page.</span><span style='color:#800000'>"</span><span style='color:#800080'>;</span>

           <span style='color:#800000;font-weight:bold'>return</span> View<span style='color:#808030'>(</span><span style='color:#808030'>)</span><span style='color:#800080'>;</span>
       <span style='color:#800080'>}</span>

       <span style='color:#800000;font-weight:bold'>public</span> IActionResult Contact<span style='color:#808030'>(</span><span style='color:#808030'>)</span>
       <span style='color:#800080'>{</span>
           ViewData<span style='color:#808030'>[</span><span style='color:#800000'>"</span><span style='color:#0000e6'>Message</span><span style='color:#800000'>"</span><span style='color:#808030'>]</span> <span style='color:#808030'>=</span> <span style='color:#800000'>"</span><span style='color:#0000e6'>Your contact page.</span><span style='color:#800000'>"</span><span style='color:#800080'>;</span>

           <span style='color:#800000;font-weight:bold'>return</span> View<span style='color:#808030'>(</span><span style='color:#808030'>)</span><span style='color:#800080'>;</span>
       <span style='color:#800080'>}</span>

       <span style='color:#800000;font-weight:bold'>public</span> IActionResult Error<span style='color:#808030'>(</span><span style='color:#808030'>)</span>
       <span style='color:#800080'>{</span>
           <span style='color:#800000;font-weight:bold'>return</span> View<span style='color:#808030'>(</span><span style='color:#800000'>"</span><span style='color:#0000e6'>~/Views/Shared/Error.cshtml</span><span style='color:#800000'>"</span><span style='color:#808030'>)</span><span style='color:#800080'>;</span>
       <span style='color:#800080'>}</span>
   <span style='color:#800080'>}</span>
<span style='color:#800080'>}</span>
</pre>
<p>Nous allons écrire du code pour tester le ViewResult et une autre pour le ViewData.</p>
<p>Le code que nous allons écrire va permettre de vérifier que la méthode d’action Error() retourne le bon ViewResult. Le code de test est le suivant :</p>
<pre style='color:#000000;background:#ffffff'><span style='color:#808030'>[</span>TestMethod<span style='color:#808030'>]</span>
        <span style='color:#800000;font-weight:bold'>public</span> <span style='color:#800000;font-weight:bold'>void</span> Error_ReturnErrorView<span style='color:#808030'>(</span><span style='color:#808030'>)</span>
        <span style='color:#800080'>{</span>
            <span style='color:#696969'>// Arrange</span>
            <span style='color:#800000;font-weight:bold'>var</span> controller <span style='color:#808030'>=</span> <span style='color:#800000;font-weight:bold'>new</span> HomeController<span style='color:#808030'>(</span><span style='color:#808030'>)</span><span style='color:#800080'>;</span>
            <span style='color:#800000;font-weight:bold'>var</span> errorView <span style='color:#808030'>=</span> <span style='color:#800000'>"</span><span style='color:#0000e6'>~/Views/Shared/Error.cshtml</span><span style='color:#800000'>"</span><span style='color:#800080'>;</span>

            <span style='color:#696969'>// Act</span>
            <span style='color:#800000;font-weight:bold'>var</span> viewResult <span style='color:#808030'>=</span> controller<span style='color:#808030'>.</span>Error<span style='color:#808030'>(</span><span style='color:#808030'>)</span> <span style='color:#800000;font-weight:bold'>as</span> ViewResult<span style='color:#800080'>;</span>

            <span style='color:#696969'>// Assert</span>
            Assert<span style='color:#808030'>.</span>AreEqual<span style='color:#808030'>(</span>errorView<span style='color:#808030'>,</span> viewResult<span style='color:#808030'>.</span>ViewName<span style='color:#808030'>)</span><span style='color:#800080'>;</span>
        <span style='color:#800080'>}</span>
</pre>
<p>Pour le ViewData, nous allons tester que notre méthode d’action renvoie le bon ViewData. La méthode de test pour effectuer cela est la suivante :</p>
<pre style='color:#000000;background:#ffffff'><span style='color:#808030'>[</span>TestMethod<span style='color:#808030'>]</span>
       <span style='color:#800000;font-weight:bold'>public</span> <span style='color:#800000;font-weight:bold'>void</span> About_ReturnViewData<span style='color:#808030'>(</span><span style='color:#808030'>)</span>
       <span style='color:#800080'>{</span>
           <span style='color:#696969'>// Arrange</span>
           <span style='color:#800000;font-weight:bold'>var</span> controller <span style='color:#808030'>=</span> <span style='color:#800000;font-weight:bold'>new</span> HomeController<span style='color:#808030'>(</span><span style='color:#808030'>)</span><span style='color:#800080'>;</span>
           <span style='color:#800000;font-weight:bold'>var</span> viewData <span style='color:#808030'>=</span> <span style='color:#800000'>"</span><span style='color:#0000e6'>Your application description page.</span><span style='color:#800000'>"</span><span style='color:#800080'>;</span>

           <span style='color:#696969'>// Act</span>
           <span style='color:#800000;font-weight:bold'>var</span> viewResult <span style='color:#808030'>=</span> controller<span style='color:#808030'>.</span>About<span style='color:#808030'>(</span><span style='color:#808030'>)</span> <span style='color:#800000;font-weight:bold'>as</span> ViewResult<span style='color:#800080'>;</span>

           <span style='color:#696969'>// Assert</span>
           Assert<span style='color:#808030'>.</span>AreEqual<span style='color:#808030'>(</span>viewData<span style='color:#808030'>,</span> viewResult<span style='color:#808030'>.</span>ViewData<span style='color:#808030'>[</span><span style='color:#800000'>"</span><span style='color:#0000e6'>Message</span><span style='color:#800000'>"</span><span style='color:#808030'>]</span><span style='color:#808030'>)</span><span style='color:#800080'>;</span>
       <span style='color:#800080'>}</span>
</pre>
<p>Le code complet est le suivant :</p>
<pre style='color:#000000;background:#ffffff'><span style='color:#808030'>[</span>TestClass<span style='color:#808030'>]</span>
    <span style='color:#800000;font-weight:bold'>public</span> <span style='color:#800000;font-weight:bold'>class</span> HomeControllerTest
    <span style='color:#800080'>{</span>


        <span style='color:#808030'>[</span>TestMethod<span style='color:#808030'>]</span>
        <span style='color:#800000;font-weight:bold'>public</span> <span style='color:#800000;font-weight:bold'>void</span> Error_ReturnErrorView<span style='color:#808030'>(</span><span style='color:#808030'>)</span>
        <span style='color:#800080'>{</span>
            <span style='color:#696969'>// Arrange</span>
            <span style='color:#800000;font-weight:bold'>var</span> controller <span style='color:#808030'>=</span> <span style='color:#800000;font-weight:bold'>new</span> HomeController<span style='color:#808030'>(</span><span style='color:#808030'>)</span><span style='color:#800080'>;</span>
            <span style='color:#800000;font-weight:bold'>var</span> errorView <span style='color:#808030'>=</span> <span style='color:#800000'>"</span><span style='color:#0000e6'>~/Views/Shared/Error.cshtml</span><span style='color:#800000'>"</span><span style='color:#800080'>;</span>

            <span style='color:#696969'>// Act</span>
            <span style='color:#800000;font-weight:bold'>var</span> viewResult <span style='color:#808030'>=</span> controller<span style='color:#808030'>.</span>Error<span style='color:#808030'>(</span><span style='color:#808030'>)</span> <span style='color:#800000;font-weight:bold'>as</span> ViewResult<span style='color:#800080'>;</span>

            <span style='color:#696969'>// Assert</span>
            Assert<span style='color:#808030'>.</span>AreEqual<span style='color:#808030'>(</span>errorView<span style='color:#808030'>,</span> viewResult<span style='color:#808030'>.</span>ViewName<span style='color:#808030'>)</span><span style='color:#800080'>;</span>
        <span style='color:#800080'>}</span>


        <span style='color:#808030'>[</span>TestMethod<span style='color:#808030'>]</span>
        <span style='color:#800000;font-weight:bold'>public</span> <span style='color:#800000;font-weight:bold'>void</span> About_ReturnViewData<span style='color:#808030'>(</span><span style='color:#808030'>)</span>
        <span style='color:#800080'>{</span>
            <span style='color:#696969'>// Arrange</span>
            <span style='color:#800000;font-weight:bold'>var</span> controller <span style='color:#808030'>=</span> <span style='color:#800000;font-weight:bold'>new</span> HomeController<span style='color:#808030'>(</span><span style='color:#808030'>)</span><span style='color:#800080'>;</span>
            <span style='color:#800000;font-weight:bold'>var</span> viewData <span style='color:#808030'>=</span> <span style='color:#800000'>"</span><span style='color:#0000e6'>Your application description page.</span><span style='color:#800000'>"</span><span style='color:#800080'>;</span>

            <span style='color:#696969'>// Act</span>
            <span style='color:#800000;font-weight:bold'>var</span> viewResult <span style='color:#808030'>=</span> controller<span style='color:#808030'>.</span>About<span style='color:#808030'>(</span><span style='color:#808030'>)</span> <span style='color:#800000;font-weight:bold'>as</span> ViewResult<span style='color:#800080'>;</span>

            <span style='color:#696969'>// Assert</span>
            Assert<span style='color:#808030'>.</span>AreEqual<span style='color:#808030'>(</span>viewData<span style='color:#808030'>,</span> viewResult<span style='color:#808030'>.</span>ViewData<span style='color:#808030'>[</span><span style='color:#800000'>"</span><span style='color:#0000e6'>Message</span><span style='color:#800000'>"</span><span style='color:#808030'>]</span><span style='color:#808030'>)</span><span style='color:#800080'>;</span>
        <span style='color:#800080'>}</span>

    <span style='color:#800080'>}</span>
</pre>
<p>A l’exécution, vous allez obtenir le résultat suivant dans l’explorateur de test :</p>
<p><a href="http://blog.developpez.com/lilroma/files/2016/08/image3.png"><img src="http://blog.developpez.com/lilroma/files/2016/08/image3.png" alt="image3" width="264" height="130" class="alignnone size-full wp-image-119" /></a></p>
<p>C’est tout. Dans un prochain billet, nous verrons comment écrire des tests unitaires smockés avec mstest v2 et la preview de Moq, qui prend aussi en charge .NET Core.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>« ASP.NET et Web Tools 2012.2 » sort en RC, avec de nouvelles fonctionnalités pour WebForms, MVC, WebAPI et SignalR</title>
		<link>https://blog.developpez.com/lilroma/p11585/net/asp-net-et-web-tools-2012-2-sort-en-rc-avec-de-nouvelles-fonctionnalites-pour-webforms-mvc-webapi-et-signalr</link>
		<comments>https://blog.developpez.com/lilroma/p11585/net/asp-net-et-web-tools-2012-2-sort-en-rc-avec-de-nouvelles-fonctionnalites-pour-webforms-mvc-webapi-et-signalr#comments</comments>
		<pubDate>Tue, 18 Dec 2012 16:51:09 +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[ASP.NET Web API]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[WebPages]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/lilroma/?p=104</guid>
		<description><![CDATA[« ASP.NET et Web Tools 2012.2 » sort en RC, avec de nouvelles fonctionnalités pour WebForms, MVC et WebAPI Le Web évolue rapidement, et Microsoft est conscient de cela. L’éditeur a ainsi adopté un cycle de mise à jour pour &#8230; <a href="https://blog.developpez.com/lilroma/p11585/net/asp-net-et-web-tools-2012-2-sort-en-rc-avec-de-nouvelles-fonctionnalites-pour-webforms-mvc-webapi-et-signalr">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>« ASP.NET et Web Tools 2012.2 » sort en RC, avec de nouvelles fonctionnalités pour WebForms, MVC et WebAPI </p>
<p>Le Web évolue rapidement, et Microsoft est conscient de cela. L’éditeur a ainsi adopté un cycle de mise à jour pour ASP.NET plus rapide que celui de Visual Studio.</p>
<p>La société compte donc publier une mise à jour pour sa plateforme de développement Web ASP.NET en début d’année prochaine.</p>
<p>Les développeurs qui veulent commencer à « jouer » avec les nouvelles fonctionnalités de cette mise à jour peuvent déjà télécharger sa version Release Candidate (RC) qui vient d’être publiée par les équipes  ASP.NET et Visual Web Developer de Microsoft.</p>
<p><img src="http://rdonfack.developpez.com/images/aspnevnext.png" alt="" /></p>
<p><span id="more-104"></span></p>
<p>« ASP.NET et Web Tools 2012.2 » RC étend le runtine ASP.NET existant et ajout de nouveaux outils Web à Visual Studio 2012 pour WebForms, MVC, WebAPI, etc. Il s’agit des fonctionnalités suivantes :</p>
<ol>
<li>De nouveaux modèles de projets ASP.NET MVC. la création d’applications Facebook est désormais plus facile avec le modèle Facebook, qui permet en quelques étapes de créer une application qui interagir avec le réseau social. Le nouveau modèle « Single Page Application » permet aux développeurs de créer des applications Web interactives côté client à l’aide de jQuery, Knockout et ASP.NET Web API ;</li>
<li>Le support de la communication en temps réel avec ASP.NET SignalR. SignalR est une bibliothèque client/serveur qui permet aux clients basés sur un navigateur et aux composants serveur basés sur ASP.NET d&rsquo;avoir une conversation à étapes multiples et bidirectionnelle;</li>
<li>Le support de l’IntelliSense pour Knockout  et l’ajout de la prise en charge de JSON en tant que classe ;
</li>
<li>L’introduction de nouvelles fonctionnalités pour ASP.NET Web API, y compris le support d’OData, l’ajout des fonctions de traçabilité, de monitoring et  de génération d’une page d’aide pour une API Web;</li>
<li>Des améliorations de l’inspecteur de page, qui offre désormais de meilleures performances pour JavaScript et CSS, dont la capacité de voir les mises à jour en temps réel d’un fichier CSS ;</li>
<li>L’unification de l’expérience de publication pour une application Web et un projet de type site Web, ainsi que l’ajout des options de publication sélective ;</li>
<li>L’intégration de la nouvelle fonctionnalité ASP.NET Friendly URL. Cette fonction rend facile la génération des URL sans l’extension .aspx. Elle permet également au développeur d’ajouter plus facilement le support du mobile dans son application Web ;</li>
<li>La mise à jour des modèles de projets Web dans Visual Studio 2012.</li>
</ol>
<p>Cette mise à jour est livrée comme des packages NuGet supplémentaires. Ce qui signifie qu’il ne peut avoir aucun problème de compatibilité avec les projets existants.</p>
<p><strong><a href="http://www.asp.net/vnext">Télécharger &laquo;&nbsp;ASP.NET et Web Tools 2012.2&Prime; RC</a></strong></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Entity Framework Code First : activer la migration automatique</title>
		<link>https://blog.developpez.com/lilroma/p11097/net/entity_framework_code_first_activer_la_m</link>
		<comments>https://blog.developpez.com/lilroma/p11097/net/entity_framework_code_first_activer_la_m#comments</comments>
		<pubDate>Sat, 16 Jun 2012 10:35:58 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP.NET MVC 3]]></category>
		<category><![CDATA[ASP.NET MVC 4]]></category>
		<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[SGBD]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Pendant le développement ou le cycle de vie d’une application, le développeur est très souvent confronté à des situations pouvant entrainer des modifications de son modèle objet et de la base de données. Avec Entity Framework, cette tâche peut s’avérer &#8230; <a href="https://blog.developpez.com/lilroma/p11097/net/entity_framework_code_first_activer_la_m">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Pendant le développement ou le cycle de vie d’une application, le développeur est très souvent confronté à des situations pouvant entrainer des modifications de son modèle objet et de la base de données. Avec Entity Framework, cette tâche peut s’avérer assez complexe et voir même frustrant pour certains.</p>
<p>Une des nouveautés les plus intéressantes qu’apporte Entity Framework 4.3 est la migration pour les mises à jour de la base de données.</p>
<p>Cette fonctionnalité offre aux développeurs des outils permettant d’appliquer avec souplesse et facilité des mises à jour à la base de données à partir des modifications apportées à l’application. </p>
<p><span id="more-80"></span></p>
<p>Dans <a href="http://blog.developpez.com/lilroma/p10807/">un précédent billet de blog</a>, j’ai présenté cette fonctionnalité et comment l’on pouvait l’utiliser pour effectuer des mises à jour de la base de données.</p>
<p>Cet article présentait uniquement l’un des modes de mises à jour qu’offre Entity Framework : le mode basé sur le code.</p>
<p>Supposons que vous disposez déjà d’une application utilisant Entity Framework Code First. Procédez à la mise à jour de celle-ci pour utiliser la version 4.3 d’Entity Framework si ce n’est pas encore le cas.</p>
<p>Vous pouvez utiliser la commande :</p>
<blockquote><p>PM>  install-package EntityFramework
</p></blockquote>
<p><strong>Activer la migration</strong></p>
<p>La première étape est d’activer la migration pour votre DbContext, en utilisant la console du gestionnaire de packages (menu Outils/Gestionnaire de package/Package Manager Console de Visual Studio). Vous allez exécuter la commande «  Enabled-Migrations ».</p>
<p><img src="http://blog.developpez.com/media/enablemigration.png" alt="" title="" /></p>
<p>L’activation de la migration crée un nouveau dossier Migrations dans votre application contenant un fichier Configurations.cs permettant de définir le comportement de la migration pour le DbContext qui est utilisé.</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">namespace</span> DatabaseMigration.Migrations<br />{<br />    <span style="color: #0000ff">using</span> System;<br />    <span style="color: #0000ff">using</span> System.Data.Entity;<br />    <span style="color: #0000ff">using</span> System.Data.Entity.Migrations;<br />    <span style="color: #0000ff">using</span> System.Linq;<br /><br />    <span style="color: #0000ff">internal</span> <span style="color: #0000ff">sealed</span> <span style="color: #0000ff">class</span> Configuration : DbMigrationsConfiguration&lt;DatabaseMigration.DatabaseMigrationContext&gt;<br />    {<br />        <span style="color: #0000ff">public</span> Configuration()<br />        {<br />            AutomaticMigrationsEnabled = <span style="color: #0000ff">false</span>;<br />        }<br /><br />        <span style="color: #0000ff">protected</span> <span style="color: #0000ff">override</span> <span style="color: #0000ff">void</span> Seed(DatabaseMigration.DatabaseMigrationContext context)<br />        {<br />            <br />        }<br />    }<br />}<br /></pre>
<p></div>
<p>Si vous avez défini plusieurs «DbContext » dans votre application, il suffira juste de modifier  DbMigrationsConfiguration(T), en remplaçant T par le nom du DbContext que vous voulez utiliser.</p>
<p><strong>Configurer la migration automatique</strong></p>
<p>Par défaut, la propriété AutomaticMigrationsEnabled est définie à false. Pour utiliser la migration automatique, vous devez affecter la valeur « true » à cette propriété.</p>
<p>Il également possible de définir cette propriété à true lors de l’activation de la migration. Pour cela, vous devez ajouter le paramètre EnableAutomaticMigrations à la commande permettant d’activer la migration :</p>
<blockquote><p>PM> Enable-Migrations -EnableAutomaticMigrations</p></blockquote>
<p>Par défaut, la migration automatique n’autorise pas les mises à jour pouvant entrainer des pertes de données. Pour activer cette option, vous devez éditer le fichier Configuration.cs en y ajoutant la propriété  « AutomaticMigrationDataLossAllowed » qui sera définie à true.</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"><span style="color: #0000ff;">public</span> Configuration()<br />        {<br />            AutomaticMigrationsEnabled = <span style="color: #0000ff;">true</span>;<br />            AutomaticMigrationDataLossAllowed = <span style="color: #0000ff;">true</span>;<br />        }</pre>
<p></div>
<p>Editez ensuite votre DbContext et ajoutez-y la procédure onModelCreating  :</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;">protected</span> <span style="color: #0000ff;">override</span> <span style="color: #0000ff;">void</span> OnModelCreating(DbModelBuilder modelBuilder)<br />        {<br />            Database.SetInitializer(<span style="color: #0000ff;">new</span> MigrateDatabaseToLatestVersion&lt;DatabaseMigrationContext, Configuration&gt;());<br />        }</pre>
<p></div>
<p>Et voilà, c’est tout ;). Toute modification de votre modèle objet (nouvelle entité, ajout d’une propriété, suppression d’une propriété, etc.) sera automatiquement appliquée à la base de données à l’exécution de votre application.</p>
<p><strong>Inconvénients de la migration automatique</strong></p>
<p>La migration automatique permet d’apporter assez rapidement et simplement des mises à jour à une base de données en utilisant Entity Framework Code First. Cette option présente cependant des inconvénients, et personnellement, je ne recommanderais pas son utilise en environnement de production ou sur un système critique.</p>
<p>L’utilisation du mode automatique en environnement de production peut s’avérer assez dangereuse, avec un risque de perte de données, car les modifications apportées à la base de données sont imprévisibles par le développeur, et celui-ci n’a aucune visibilité sur ces changements.</p>
<p>Néanmoins, vous pouvez limiter ces risques en environnement de production en désactivant l’autorisation des mises à jour pouvant entrainer des pertes de données.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Visual Studio 11 : les versions Express seront disponibles en quatre éditions</title>
		<link>https://blog.developpez.com/lilroma/p11049/net/visual_studio_11_les_versions_express_se</link>
		<comments>https://blog.developpez.com/lilroma/p11049/net/visual_studio_11_les_versions_express_se#comments</comments>
		<pubDate>Mon, 28 May 2012 06:54:18 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Contrairement aux versions Express précédentes qui étaient disponibles en fonction des langages de programmation (C# Express, Visual Basic Express, etc.), pour Visual Studio 11, elles seront publiées en fonction des plateformes avec des outils adaptés pour cibler chacune. Les versions &#8230; <a href="https://blog.developpez.com/lilroma/p11049/net/visual_studio_11_les_versions_express_se">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Contrairement aux versions Express précédentes qui étaient disponibles en fonction des langages de programmation (C# Express, Visual Basic Express, etc.), pour Visual Studio 11, elles seront publiées en fonction des plateformes avec des outils adaptés pour cibler chacune.</p>
<p>Les versions Express sont des déclinaisons gratuites, allégées de Visual Studio intégrant des fonctionnalités et outils de bases. Les différentes éditions Express à venir avec Visual Studio 11 seront :</p>
<p><strong>Visual Studio 11 Express pour Windows 8</strong> ;<br />
<strong>Visual Stduio 11 Express pour le Web</strong> ;<br />
<strong>Visual Studio 11 Express pour Azure</strong> ;<br />
<strong>Visual Studio 11 Express pour Windows Phone.</strong></p>
<p>Chaque édition supportera l’ensemble des langages .NET et Web à savoir C#, Visual Basic, F#, C++ et JavaScript. Visual Studio 11 Express pour Windows 8 par exemple permettra la conception des applications Metro fondées sur WinRT.</p>
<p>Visual Studio 11 Express pour Windows Phone sera publiée avec la prochaine mise à jour Windows Phone 8, de même que pour Azure, afin de prendre en charge les nouvelles fonctionnalités et améliorations de ces plateformes.</p>
<p>Par ailleurs, LightSwitch, qui permet de développer rapidement des applications métiers sera désormais intégré par défaut dans Visual Studio 11.</p>
<p>Les exigences matérielles de Visual Studio 11 seront pareilles que celles de Visual Studio 10, à la différence que celui-ci fonctionnera uniquement sur Windows 7 ou Windows 8. Les applications managées cibleront par défaut le Framework .NET 4.5 et les applications natives VC11, ce qui suppose qu’elles ne fonctionneront que sur Windows Vista et versions supérieures.</p>
<p>Néanmoins, les développeurs qui veulent publier leurs applications managées sur Windows XP ou Windows Server 2003 pourront changer la cible pour le Framework .NET 4.0. Pour les applications natives, ils devront se retourner vers Visual Studio 2010.</p>
<p>Visual Studio est actuellement disponible en version Beta. La Release Candidate (RC) sera probablement publiée la première semaine de juin avec la Preview de Windows 8</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Internationalisation d’une application ASP.NET MVC 3 Razor  part 3 : Mécanisme de sélection de la langue dans l’IU</title>
		<link>https://blog.developpez.com/lilroma/p10732/net/internationalisation_d_une_application_a_3</link>
		<comments>https://blog.developpez.com/lilroma/p10732/net/internationalisation_d_une_application_a_3#comments</comments>
		<pubDate>Mon, 20 Feb 2012 10:04:19 +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[Visual Studio]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Dans les parties précédentes, nous avons introduit l’internationalisation sur la plateforme .NET et nous avons vu comment procéder à la localisation des vues, des messages d’erreur de validation et des attributs Display dans le modèle. Cependant, jusqu’ici, lors de nos &#8230; <a href="https://blog.developpez.com/lilroma/p10732/net/internationalisation_d_une_application_a_3">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Dans les parties précédentes, nous avons <a href="http://blog.developpez.com/lilroma/p10697/">introduit l’internationalisation</a> sur la plateforme .NET et nous avons vu comment procéder à <a href="http://blog.developpez.com/lilroma/p10702/">la localisation des vues, des messages d’erreur de validation et des attributs Display dans le modèle</a>.</p>
<p>Cependant, jusqu’ici, lors de nos tests, vous pouvez vous rendre compte que notre application ne dispose d’aucun mécanisme permettant à un l’utilisateur à partir de l’interface de choisir une langue ou de basculer d’une langue à une autre à tout moment.</p>
<p>Cet aspect de l’internationalisation d’une application Web ASP.NET MVC 3 Razor fera l’objet de ce billet de blog.</p>
<p><span id="more-42"></span></p>
<p>Nous allons utiliser l’application que nous avons créée précédemment.</p>
<p>Dans notre cas, nous allons définir la langue qui est utilisée dans L’URL.  Pour cela, nous allons commencer par définir la stratégie de routage qui sera utilisée dans notre application, en spécifiant la langue. L’URL que nous allons utilisera sous la forme suivante :</p>
<p>http://localhost/fr-fr/home/index pour le français<br />
et<br />
http://localhost/en-us/home/index pour l’anglais.</p>
<p>La route par défaut dans ASP.NET MVC 3 est définie sous la forme : http://localhost/controller/action/id.  À partir de là, nous allons définir de nouveaux paramètres de route qui permettront de générer l’URL avec la langue. Pour cela, nous allons définir la route sous la forme suivante : http://localhost/lang/controller/action/id.</p>
<p>Pour atteindre ce résultat, il suffit de modifier le fichier Global.ascx.cs, et enregistrer une nouvelle route. Le code pour faire cela 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">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> RegisterRoutes(RouteCollection routes)<br />        {<br />            routes.IgnoreRoute(<span style="color: #006080">&quot;{resource}.axd/{*pathInfo}&quot;</span>);<br />            routes.IgnoreRoute(<span style="color: #006080">&quot;favicon.ico&quot;</span>);<br /><br />            routes.MapRoute(<br />               <span style="color: #006080">&quot;LocalizedDefault&quot;</span>, <span style="color: #008000">// Route name</span><br />               <span style="color: #006080">&quot;{lang}/{controller}/{action}/{id}&quot;</span>, <span style="color: #008000">// URL with parameters</span><br />               <span style="color: #0000ff">new</span> { controller = <span style="color: #006080">&quot;Home&quot;</span>, action = <span style="color: #006080">&quot;Index&quot;</span>, id = UrlParameter.Optional } <span style="color: #008000">// Parameter defaults</span><br />           );<br /><br />            routes.MapRoute(<br />                <span style="color: #006080">&quot;Default&quot;</span>, <span style="color: #008000">// Route name</span><br />                <span style="color: #006080">&quot;{controller}/{action}/{id}&quot;</span>, <span style="color: #008000">// URL with parameters</span><br />                <span style="color: #0000ff">new</span> { controller = <span style="color: #006080">&quot;Home&quot;</span>, action = <span style="color: #006080">&quot;Index&quot;</span>, id = UrlParameter.Optional } <span style="color: #008000">// Parameter defaults</span><br />            );<br />        }<br /></pre>
<p></div>
<p> Maintenant, vous devez ajouter un nouveau contrôleur (BaseController) qui héritera de System.Web.Mvc.Controller. Sa fonction principale sera de changer la langue du Thread d’exécution courant selon la valeur de la langue dans l’URL ou dans un cookie existant, et de sauvegarder le choix linguistique de l’utilisateur dans un cookie si ce n’est pas déjà fait. Si aucune langue n’est spécifiée dans l’URL, la langue  du Thread d’exécution sera modifiée en utilisant par défaut la langue du navigateur de l’utilisateur. </p>
<p>Le code pour faire cela 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.Linq;<br /><span style="color: #0000ff">using</span> System.Web;<br /><span style="color: #0000ff">using</span> System.Web.Mvc;<br /><span style="color: #0000ff">using</span> System.Text;<br /><span style="color: #0000ff">using</span> System.Threading;<br /><span style="color: #0000ff">using</span> System.Globalization;<br /><br /><span style="color: #0000ff">namespace</span> MvcApplication1.Controllers<br />{<br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> BaseController : Controller<br />    {<br />        <span style="color: #008000">//</span><br />        <span style="color: #008000">// GET: /Base/</span><br /><br />        <span style="color: #0000ff">protected</span> <span style="color: #0000ff">override</span> <span style="color: #0000ff">void</span> ExecuteCore()<br />         {<br />             <span style="color: #0000ff">if</span> (RouteData.Values[<span style="color: #006080">&quot;lang&quot;</span>] != <span style="color: #0000ff">null</span> &amp;&amp;<br />              !<span style="color: #0000ff">string</span>.IsNullOrWhiteSpace(RouteData.Values[<span style="color: #006080">&quot;lang&quot;</span>].ToString()))<br />             {<br />                 <span style="color: #008000">// modification de la culture dans les données de la route</span><br />                 var lang = RouteData.Values[<span style="color: #006080">&quot;lang&quot;</span>].ToString();<br />                 Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(lang);<br />             }<br />             <span style="color: #0000ff">else</span><br />             {<br />                 <span style="color: #008000">// chargement de la culture depuis un cookie</span><br />                 var cookie = HttpContext.Request.Cookies[<span style="color: #006080">&quot;MvcApplication1.CurrentUICulture&quot;</span>];<br />                 var langHeader = <span style="color: #0000ff">string</span>.Empty;<br />                 <span style="color: #0000ff">if</span> (cookie != <span style="color: #0000ff">null</span>)<br />                 {<br />                     <span style="color: #008000">// modification de la culture avec la valeur dans le cookie</span><br />                     langHeader = cookie.Value;<br />                     Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(langHeader);<br />                 }<br />                 <span style="color: #0000ff">else</span><br />                 {<br />                     <span style="color: #008000">// utilisation de la langue par défaut du naviageteur si la culture n'est pas spécifiée</span><br />                     langHeader = HttpContext.Request.UserLanguages[0];<br />                     Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(langHeader);<br />                 }<br />                 <span style="color: #008000">// modification de la culture dans les données de la route</span><br />                 RouteData.Values[<span style="color: #006080">&quot;lang&quot;</span>] = langHeader;<br />             }<br /><br />             <span style="color: #008000">// sauvegarde de la culture dans un cookie</span><br />             HttpCookie _cookie = <span style="color: #0000ff">new</span> HttpCookie(<span style="color: #006080">&quot;MvcApplication1.CurrentUICulture&quot;</span>, Thread.CurrentThread.CurrentUICulture.Name);<br />             _cookie.Expires = DateTime.Now.AddYears(1);<br />             HttpContext.Response.SetCookie(_cookie);<br /><br />             <span style="color: #0000ff">base</span>.ExecuteCore();<br />         }<br /><br />    }<br />}<br /><br /></pre>
<p></div>
<p>Tous les contrôleurs de l’application doivent être modifiés pour hériter de ce contrôleur (Basecontrolleur).</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> HomeController : BaseController</pre>
<p></div>
<p>Après avoir enregistré la route localisée, nous devons procéder à l’écriture d’une fonction permettant de générer l’URL localisée en fonction du choix de la langue de l’utilisateur.<br />
Pour cela, nous allons ajouter un HTML Helper dans notre projet.  Les Helpers HTML sont des méthodes d’extensions pour les classes HtmlHelper. Ces méthodes sont accessibles dans une vue à partir de la méthode HTML.</p>
<p>Le code pour notre Helper HTML 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">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">class</span> SwitchLanguageHelper<br />    {<br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> Language<br />        {<br />            <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Url { get; set; }<br />            <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> ActionName { get; set; }<br />            <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> ControllerName { get; set; }<br />            <span style="color: #0000ff">public</span> RouteValueDictionary RouteValues { get; set; }<br />            <span style="color: #0000ff">public</span> <span style="color: #0000ff">bool</span> IsSelected { get; set; }<br /><br />            <span style="color: #0000ff">public</span> MvcHtmlString HtmlSafeUrl<br />            {<br />                get<br />                {<br />                    <span style="color: #0000ff">return</span> MvcHtmlString.Create(Url);<br />                }<br />            }<br />        }<br /><br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> Language LanguageUrl(<span style="color: #0000ff">this</span> HtmlHelper helper, <span style="color: #0000ff">string</span> cultureName,<br />            <span style="color: #0000ff">string</span> languageRouteName = <span style="color: #006080">&quot;lang&quot;</span>, <span style="color: #0000ff">bool</span> strictSelected = <span style="color: #0000ff">false</span>)<br />        {<br />            <br />            cultureName = cultureName.ToLower();<br />            <span style="color: #008000">// récuperation des valeurs de ka route depuis le view context</span><br />            var routeValues = <span style="color: #0000ff">new</span> RouteValueDictionary(helper.ViewContext.RouteData.Values);<br />            <br />            <span style="color: #008000">//copie de la chaine de requête dans les valeurs de route pour générer le nouveau lien</span><br />            var queryString = helper.ViewContext.HttpContext.Request.QueryString;<br />            <span style="color: #0000ff">foreach</span> (<span style="color: #0000ff">string</span> key <span style="color: #0000ff">in</span> queryString)<br />            {<br />                <span style="color: #0000ff">if</span> (queryString[key] != <span style="color: #0000ff">null</span> &amp;&amp; !<span style="color: #0000ff">string</span>.IsNullOrWhiteSpace(key))<br />                {<br />                    <span style="color: #0000ff">if</span> (routeValues.ContainsKey(key))<br />                    {<br />                        routeValues[key] = queryString[key];<br />                    }<br />                    <span style="color: #0000ff">else</span><br />                    {<br />                        routeValues.Add(key, queryString[key]);<br />                    }<br />                }<br />            }<br />            var actionName = routeValues[<span style="color: #006080">&quot;action&quot;</span>].ToString();<br />            var controllerName = routeValues[<span style="color: #006080">&quot;controller&quot;</span>].ToString();<br />            <span style="color: #008000">//modification de la langue dans les valeurs de route</span><br />            routeValues[languageRouteName] = cultureName;<br />            <span style="color: #008000">//génération de l'url avec la langue</span><br />            var urlHelper = <span style="color: #0000ff">new</span> UrlHelper(helper.ViewContext.RequestContext, helper.RouteCollection);<br />            var url = urlHelper.RouteUrl(<span style="color: #006080">&quot;LocalizedDefault&quot;</span>, routeValues);<br />            <span style="color: #008000">// vérification si la culture courante correspond à celle passée en paramètre</span><br />            var current_lang_name = Thread.CurrentThread.CurrentUICulture.Name.ToLower();<br />            var isSelected = strictSelected ?<br />                current_lang_name == cultureName :<br />                current_lang_name.StartsWith(cultureName);<br />            <span style="color: #0000ff">return</span> <span style="color: #0000ff">new</span> Language()<br />            {<br />                Url = url,<br />                ActionName = actionName,<br />                ControllerName = controllerName,<br />                RouteValues = routeValues,<br />                IsSelected = isSelected<br />            };<br />        }<br /><br />        <br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> MvcHtmlString LanguageSelectorLink(<span style="color: #0000ff">this</span> HtmlHelper helper,<br />           <span style="color: #0000ff">string</span> cultureName, <span style="color: #0000ff">string</span> selectedText, <span style="color: #0000ff">string</span> unselectedText,<br />           IDictionary htmlAttributes, <span style="color: #0000ff">string</span> languageRouteName = <span style="color: #006080">&quot;lang&quot;</span>, <span style="color: #0000ff">bool</span> strictSelected = <span style="color: #0000ff">false</span>)<br />        {<br />            var language = helper.LanguageUrl(cultureName, languageRouteName, strictSelected);<br />            var link = helper.RouteLink(language.IsSelected ? selectedText : unselectedText,<br />                <span style="color: #006080">&quot;LocalizedDefault&quot;</span>, language.RouteValues);<br />            <span style="color: #0000ff">return</span> link;<br />        }<br /><br />       <br />    }<br /></pre>
<p></div>
<p>Enfin, dans le dossier View/Shared, nous allons ajouter une vue partielle (_SelectLanguage.cshtml) pour la sélection de la langue par l’utilisateur.<br />
Le code pour cette  page 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> MvcApplication1.MyHelper<br /><br />@Html.LanguageSelectorLink(<span style="color: #006080;">"en-US"</span>, <span style="color: #006080;">"[English]"</span>, <span style="color: #006080;">"English"</span>, <span style="color: #0000ff;">null</span>)<br />@Html.LanguageSelectorLink(<span style="color: #006080;">"fr-FR"</span>, <span style="color: #006080;">"[Français]"</span>, <span style="color: #006080;">"Français"</span>, <span style="color: #0000ff;">null</span>)<br /></pre>
<p></div>
<p>La vue partielle doit être appelée dans le Layout de votre projet :</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 id=<span style="color: #006080;">"logindisplay"</span>&gt;<br />                @Html.Partial(<span style="color: #006080;">"_LogOnPartial"</span>)<br />                @Html.Partial("_SelectLanguage<br />&lt;/div&gt;</pre>
<p></div>
<p>Nous pouvons maintenant exécuter l’application pour voir le résultat produit comme l’illustrent les captures suivantes :</p>
<p><img src="http://blog.developpez.com/media/lasttesten.png" width="601" height="551" alt="" /></p>
<p><img src="http://blog.developpez.com/media/lasttestfr.png" width="598" height="540" alt="" /></p>
<p>Et voilà, nous venons de finir avec la dernière étape d&rsquo;internationalisation de notre application. J&rsquo;espère que ce tutoriel vous sera d&rsquo;une grande utilité pour créer des applications ASP.NET MVC 3 multilingues ;). </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</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>ASP.NET MVC : résoudre l’erreur « A circular reference was detected while serializing an object of type… »</title>
		<link>https://blog.developpez.com/lilroma/p10448/net/asp_net_mvc_resoudre_l_erreur_l_a_circul</link>
		<comments>https://blog.developpez.com/lilroma/p10448/net/asp_net_mvc_resoudre_l_erreur_l_a_circul#comments</comments>
		<pubDate>Thu, 27 Oct 2011 17:39:12 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP.NET MVC 3]]></category>
		<category><![CDATA[ASP.NET MVC 4]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Visual Studio]]></category>

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

		<guid isPermaLink="false"></guid>
		<description><![CDATA[La conception d&#8217;une application .NET de nos jours nécessite de plus en plus l&#8217;utilisation des bibliothèques externes. Pour faire appel à celles-ci, le développeur devait dans un premier temps trouver le site où télécharger le composant, vérifier si celui-ci est &#8230; <a href="https://blog.developpez.com/lilroma/p10430/net/article_presentation_de_nuget_le_gestion">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>La conception d&rsquo;une application .NET de nos jours nécessite de plus en plus l&rsquo;utilisation des bibliothèques externes. Pour faire appel à celles-ci, le développeur devait dans un premier temps trouver le site où télécharger le composant, vérifier si celui-ci est compatible avec sa plateforme de développement, installer la bibliothèque dans son projet, ajouter une référence à cette bibliothèque et procéder à l&rsquo;édition de son fichier de configuration.</p>
<p>Pire, si la bibliothèque utilisée nécessite la disponibilité d&rsquo;autres bibliothèques externes, le développeur est obligé de répéter ces étapes pour chaque dépendance du composant.</p>
<p>Ces tâches peuvent donc s&rsquo;avérer assez complexes et demandent parfois des efforts considérables en temps et énergie, sans compter le suivi des mises à jour qui sont parfois fréquentes pour certains composants. La gestion des dépendances pour une application peut donc rapidement devenir un casse-tête pour le développeur.</p>
<p>Nuget est un gestionnaire de package .NET open source qui automatise toutes ces tâches fastidieuses pour un package externe ainsi que ses dépendances dans une application. Nous verrons, au travers de ce tutoriel, cet outil fort intéressant et comment l&rsquo;utiliser pour télécharger, installer, mettre à jour des packages dans Visual Studio 2010. Nous verrons, également comment générer et publier ses propres packages Nuget.</p>
<p>L’article est regroupé au sein des parties suivantes :</p>
<p>I. <a href="http://rdonfack.developpez.com/tutoriels/dotnet/presentation-gestionnaire-packages-net-nuget/#LI">Introduction</a></p>
<p>II. <a href="http://rdonfack.developpez.com/tutoriels/dotnet/presentation-gestionnaire-packages-net-nuget/#LII">Description de NuGet</a></p>
<p>III. <a href="http://rdonfack.developpez.com/tutoriels/dotnet/presentation-gestionnaire-packages-net-nuget/#LIII">Installation de NuGet</a></p>
<p>   III-A. <a href="http://rdonfack.developpez.com/tutoriels/dotnet/presentation-gestionnaire-packages-net-nuget/#LIII-A">Installation à parti du site du projet</a></p>
<p>   III-B. <a href="http://rdonfack.developpez.com/tutoriels/dotnet/presentation-gestionnaire-packages-net-nuget/#LIII-B">Installation à partir de Visual Studio</a></p>
<p>IV. <a href="http://rdonfack.developpez.com/tutoriels/dotnet/presentation-gestionnaire-packages-net-nuget/#LIV">Utilisation de NuGet</a> </p>
<p>IV-A. <a href="http://rdonfack.developpez.com/tutoriels/dotnet/presentation-gestionnaire-packages-net-nuget/#LIV-A">Utilisation à partir de la console Package Manager</a></p>
<p>IV-B. <a href="http://rdonfack.developpez.com/tutoriels/dotnet/presentation-gestionnaire-packages-net-nuget/#LIV-B">Utilisation de l&rsquo;interface graphique</a>  </p>
<p>V. <a href="http://rdonfack.developpez.com/tutoriels/dotnet/presentation-gestionnaire-packages-net-nuget/#LV">Création et Publication de son propre package NuGet</a></p>
<p>V-A. <a href="http://rdonfack.developpez.com/tutoriels/dotnet/presentation-gestionnaire-packages-net-nuget/#LV-A">Utilisation de Nuget.exe</a></p>
<p>V-B. <a href="http://rdonfack.developpez.com/tutoriels/dotnet/presentation-gestionnaire-packages-net-nuget/#LV-B">Création et publication d&rsquo;un package avec NuGet Package Explorer</a></p>
<p>VI. <a href="http://rdonfack.developpez.com/tutoriels/dotnet/presentation-gestionnaire-packages-net-nuget/#LVI">Conclusion</a></p>
<p>L&rsquo;article complet est <a href="http://rdonfack.developpez.com/tutoriels/dotnet/presentation-gestionnaire-packages-net-nuget/">disponible sur cette page</a>.</p>
<p>Télécharger <a href="ftp://ftp-developpez.com/rdonfack/tutoriels/dotnet/presentation-gestionnaire-packages-net-nuget/nuget.pdf">la version PDF</a> (<a href="http://rdonfack.ftp-developpez.com/tutoriels/dotnet/presentation-gestionnaire-packages-net-nuget/nuget.pdf">Miroir</a>).</p>
<p>Télécharger <a href="ftp://ftp-developpez.com/rdonfack/tutoriels/dotnet/presentation-gestionnaire-packages-net-nuget/nuget.zip">la version hors-ligne</a> (<a href="http://rdonfack.ftp-developpez.com/tutoriels/dotnet/presentation-gestionnaire-packages-net-nuget/nuget.zip">Miroir</a>).</p>
<p>Bonne lecture <img src="https://blog.developpez.com/lilroma/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" />  </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP.NET MVC 4 Developer Preview : jQuery Mobile, View Switcher et Browser Overriding</title>
		<link>https://blog.developpez.com/lilroma/p10343/net/asp_net_mvc_4_developer_preview_jquery_m</link>
		<comments>https://blog.developpez.com/lilroma/p10343/net/asp_net_mvc_4_developer_preview_jquery_m#comments</comments>
		<pubDate>Tue, 04 Oct 2011 08:59:01 +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[Crystal Report]]></category>
		<category><![CDATA[Mobiles]]></category>
		<category><![CDATA[Nuget]]></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 avons créé notre première application mobile en utilisant le nouveau Template qu’apporte ASP.NET MVC 4. Nous avons également découvert une puissance fonctionnalité introduite par le Framework Web pour le soutien des modes d’affichage. &#8230; <a href="https://blog.developpez.com/lilroma/p10343/net/asp_net_mvc_4_developer_preview_jquery_m">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Dans mon <a href="http://blog.developpez.com/lilroma/p10326/">précédent billet de blog</a>, nous avons créé notre première application mobile en utilisant le nouveau Template qu’apporte ASP.NET MVC 4. Nous avons également découvert une puissance fonctionnalité introduite par le Framework Web pour le soutien des modes d’affichage. </p>
<p>Avec ces nouveautés, nous avons sans apporter aucune modification à nos modèles et contrôleurs, créé des vues personnalisées pour les navigateurs Desktop et les navigateurs mobiles.</p>
<p>Dans ce billet, nous verrons comment procéder autrement en utilisant le package Nuget JQuery.Mobile.MVC.</p>
<p><span id="more-64"></span></p>
<p>Le package jQuery.Mobile.MVC installe la librairie JQuery Mobile qui va permettre la création des interfaces Web optimisées pour les smartphones et autres terminaux tactiles, ainsi que plusieurs autres fichiers pour faciliter la tâche au développeur.  </p>
<p>Ouvrons notre application ASP.NET MVC 4 avec votre éditeur Visual Studio 2010 SP 1 ou Visual Web Developper Express 2010 SP 1.</p>
<p>Nous allons dans un premier temps intégrer la bibliothèque JavaScript à notre projet en utilisant le gestionnaire de packages Nuget.</p>
<p>Pour cela, nous allons faire  un clic droit sur notre projet dans l’explorateur de solution. Dans le menu contextuel qui s’affiche, sélectionnons « Manage Nuget Packages ».</p>
<p>La fenêtre de gestion des packages Nuget s’affiche. Nous devons rechercher le package jQuery.Mobile.MVC en tapant son nom dans la zone de recherche.</p>
<p><img src="http://blog.developpez.com/media/JQuery.MVC.PNG" width="572" height="445" alt="" /> </p>
<p>Nous allons ensuite cliquer sur Install pour que Nuget télécharger et installe automatiquement dans notre projet le package ainsi que toutes ses dépendances.</p>
<p>Nous allons nous rendre compte que plusieurs fichiers ont été ajoutés au projet, dont un nouveau fichier <strong>_Layout.Mobile.cshtml</strong>, <strong>_ViewSwitcher.cshtml</strong> ou encore <strong>ViewSwitcherController.cs</strong>.</p>
<p><img src="http://blog.developpez.com/media/Switcher.PNG" width="287" height="400" alt="" /></p>
<p>Procédons maintenant à l’exécution de notre page pour voir ce qui sera affiché à l’écran en utilisant notre navigateur Firefox, et en définissant comme agent utilisateur iPhone (voir <a href="http://blog.developpez.com/lilroma/p10326/">mon précédent billet de blog</a> pour définir l’agent utilisateur sous Firefox).</p>
<p><img src="http://blog.developpez.com/media/runwebsite5.PNG" width="334" height="448" alt="" /></p>
<p><strong>View Switcher.</strong></p>
<p>Revenons maintenant voir ce qui se trouve sous le capot.</p>
<p>Sur la page affichée dans notre navigateur, nous remarquons qu’une bande noire s’est ajoutée en début de celle-ci avec un lien permettant de basculer sur la vue desktop de la page.</p>
<p>D’où provient cette bande ?</p>
<p>Ouvrons avec notre éditeur la page affichée à l’écran (Index.cshtml).</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 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">@{<br />    ViewBag.Title = <span style="color: #006080">&quot;Home Page&quot;</span>;<br />}<br /><br />&lt;h2&gt;@ViewBag.Message&lt;/h2&gt;<br />&lt;p&gt;<br />    To learn more about ASP.NET MVC visit &lt;a href=<span style="color: #006080">&quot;http://asp.net/mvc&quot;</span> title=<span style="color: #006080">&quot;ASP.NET MVC Website&quot;</span>&gt;http:<span style="color: #008000">//asp.net/mvc&lt;/a&gt;.</span><br />&lt;/p&gt;<br /><br />&lt;ul data-role=<span style="color: #006080">&quot;listview&quot;</span> data-inset=<span style="color: #006080">&quot;true&quot;</span>&gt;<br />    &lt;li data-role=<span style="color: #006080">&quot;list-divider&quot;</span>&gt;Navigation&lt;/li&gt;<br />    &lt;li&gt;@Html.ActionLink(<span style="color: #006080">&quot;About&quot;</span>, <span style="color: #006080">&quot;About&quot;</span>, <span style="color: #006080">&quot;Home&quot;</span>)&lt;/li&gt;<br />    &lt;li&gt;@Html.ActionLink(<span style="color: #006080">&quot;Contact&quot;</span>, <span style="color: #006080">&quot;Contact&quot;</span>, <span style="color: #006080">&quot;Home&quot;</span>)&lt;/li&gt;<br />&lt;/ul&gt;</pre>
<p></div>
<p>À première vue, on se rend compte qu’aucune modification n’a été effectuée dans ce fichier.</p>
<p>Puisque ce fichier est intégré dans le Layout avant d’être affiché, jetons maintenant un coup d’œil sur notre fichier _Layout.Mobile.cshtml. Nous allons apercevoir la ligne de code suivante :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">@Html.Partial(<span style="color: #006080;">"_ViewSwitcher"</span>)</pre>
<p></div>
<p>Qui fait référence à la vue partielle _ViewSwitcher.cshtml. C’est cette vue qui ajoute un lien sur toutes les pages mobiles permettant de basculer du mode d’affichage mobile pour Desktop et vice-versa. Par défaut, elle n’est pas incluse dans les vues Desktop. Pour remédier à cela, vous pouvez juste copier @Html.Partial(&laquo;&nbsp;_ViewSwitcher&nbsp;&raquo;) dans le fichier _Layout.Mobile.cshtml et le coller dans le fichier _Layout.cshtml.</p>
<p>Dans le code de la vue partielle ViewSwitcher, la méthode <strong>GetOverriddenBrowser()</strong> est utilisée pour retourner un objet   HttpBrowserCapabilitiesBase,  qui va donner des informations sur les capacités du navigateur qui a fait la demande. La propriété IsMobileDevice retourne une valeur booléenne permettant de savoir si c’est un navigateur mobile qui effectue la demande.</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 400px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">@<span style="color: #0000ff">if</span> (Request.Browser.IsMobileDevice &amp;&amp; Request.HttpMethod == <span style="color: #006080">&quot;GET&quot;</span>)<br />{<br />    &lt;div <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;view-switcher ui-bar-a&quot;</span>&gt;<br />        @<span style="color: #0000ff">if</span> (ViewContext.HttpContext.GetOverriddenBrowser().IsMobileDevice)<br />        {<br />            @: Displaying mobile view<br />            @Html.ActionLink(<span style="color: #006080">&quot;Desktop view&quot;</span>, <span style="color: #006080">&quot;SwitchView&quot;</span>, <span style="color: #006080">&quot;ViewSwitcher&quot;</span>, <span style="color: #0000ff">new</span> { mobile = <span style="color: #0000ff">false</span>, returnUrl = Request.Url.PathAndQuery }, <span style="color: #0000ff">new</span> { rel = <span style="color: #006080">&quot;external&quot;</span> })<br />        } <br />        <span style="color: #0000ff">else</span> <br />        {<br />            @: Displaying desktop view<br />            @Html.ActionLink(<span style="color: #006080">&quot;Mobile view&quot;</span>, <span style="color: #006080">&quot;SwitchView&quot;</span>, <span style="color: #006080">&quot;ViewSwitcher&quot;</span>, <span style="color: #0000ff">new</span> { mobile = <span style="color: #0000ff">true</span>, returnUrl = Request.Url.PathAndQuery }, <span style="color: #0000ff">new</span> { rel = <span style="color: #006080">&quot;external&quot;</span> })<br />        }<br />    &lt;/div&gt;<br />}</pre>
<p></div>
<p><strong>Browser Overriding</strong></p>
<p>Penchons-nous maintenant sur le contrôleur qui est associé à cette vue.</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 300px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><br /><span style="color: #0000ff">using</span> System.Web.Mvc;<br /><span style="color: #0000ff">using</span> System.Web.WebPages;<br /><br /><span style="color: #0000ff">namespace</span> MvcApplication3.Controllers<br />{<br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> ViewSwitcherController : Controller<br />    {<br />        <span style="color: #0000ff">public</span> RedirectResult SwitchView(<span style="color: #0000ff">bool</span> mobile, <span style="color: #0000ff">string</span> returnUrl) {<br />            <span style="color: #0000ff">if</span> (Request.Browser.IsMobileDevice == mobile)<br />                HttpContext.ClearOverriddenBrowser();<br />            <span style="color: #0000ff">else</span><br />                HttpContext.SetOverriddenBrowser(mobile ? BrowserOverride.Mobile : BrowserOverride.Desktop);<br /><br />            <span style="color: #0000ff">return</span> Redirect(returnUrl);<br />        }<br />    }<br />}</pre>
<p></div>
<p>Le View Switcher utilise une nouvelle fonctionnalité &laquo;&nbsp;Browser Overriding&nbsp;&raquo;, permettant de traiter les demandes d’une application comme  si elles provenaient d’un autre navigateur (Agent utilisateur).</p>
<p>Le Browser Overriding est une caractéristique de base d’ASP.NET MVC 4, et peut de ce fait être utilisé même si vous n’avez pas installé le package jQuery.Mobile.MVC. Avec cette fonctionnalité, en fonction du lien sur lequel l’utilisateur à cliquer (Desktop view ou Mobile view), le contrôleur de la vue Switcher va simuler un agent utilisateur (BrowserOverride.Mobile ou BrowserOverride.Desktop) qui sera utilisé pour charger les vues correspondantes au choix de l’utilisateur malgré que l’agent utilisateur transmit par son navigateur ne soit pas le même.</p>
<p>Le code ci-dessous va donc permettre de substituer l’agent utilisateur du navigateur. Par défaut, les données sur l’agent utilisateur simulé sont stockées en utilisant un cookie. </p>
<p><strong>Conclusion</strong></p>
<p>Nous venons d’apercevoir une fois de plus la puissance fonctionnelle d’ASP.NET MVC 4 pour le développement d’application mobile et Web. Dans le prochain billet de blog, notre attention sera portée sur le Template Web du Framework.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
