<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Mikael Söderström</title><link>http://weblogs.asp.net/mikaelsoderstrom/default.aspx</link><description>Blogging about critical awesomeness</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/MikaelSoderstrom" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>Använd ASP.NET Chart med ASP.NET MVC</title><link>http://feedproxy.google.com/~r/MikaelSoderstrom/~3/uQ9AYh7nkFA/anv-228-nd-asp-net-chart-med-asp-net-mvc.aspx</link><pubDate>Tue, 03 Nov 2009 09:53:41 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7245802</guid><dc:creator>Vimpyboy</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://weblogs.asp.net/mikaelsoderstrom/rsscomments.aspx?PostID=7245802</wfw:commentRss><wfw:comment>http://weblogs.asp.net/mikaelsoderstrom/commentapi.aspx?PostID=7245802</wfw:comment><comments>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/11/03/anv-228-nd-asp-net-chart-med-asp-net-mvc.aspx#comments</comments><description>&lt;p&gt;I .NET 4.0 så ingår webbkontroller för att skapa diagram (så kallade ”charts”) med bland annat ASP.NET. Då det är vanliga webbkontroller så innebär det att de är anpassade för web forms, men de går faktiskt utmärkt att använda för ASP.NET MVC.&lt;/p&gt;  &lt;p&gt;Innan vi lägger till diagrammen så börjar vi med att skapa ett ASP.NET MVC-projekt med en ny modell kallad Article. Den har två properties, Name och Category.&lt;/p&gt;  &lt;p&gt;Utseendet på den klassen ser ut så här:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; MvcChart.Models&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Article&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Name { get; set; }&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Category { get; set; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;    }&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Vi skapar även en ny ActionResult-metod i HomeController som fyller denna med dummy-data, samt skapar en vy för denna som listar upp datan.&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Articles()&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    List&amp;lt;Article&amp;gt; articles = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Article&amp;gt;()&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;new&lt;/span&gt; Article() { Name = &lt;span class="str"&gt;&amp;quot;Artikel 1&amp;quot;&lt;/span&gt;, Category = &lt;span class="str"&gt;&amp;quot;Äpplen&amp;quot;&lt;/span&gt; },&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;new&lt;/span&gt; Article() { Name = &lt;span class="str"&gt;&amp;quot;Artikel 2&amp;quot;&lt;/span&gt;, Category = &lt;span class="str"&gt;&amp;quot;Äpplen&amp;quot;&lt;/span&gt; },&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;new&lt;/span&gt; Article() { Name = &lt;span class="str"&gt;&amp;quot;Artikel 3&amp;quot;&lt;/span&gt;, Category = &lt;span class="str"&gt;&amp;quot;Äpplen&amp;quot;&lt;/span&gt; },&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;new&lt;/span&gt; Article() { Name = &lt;span class="str"&gt;&amp;quot;Artikel 4&amp;quot;&lt;/span&gt;, Category = &lt;span class="str"&gt;&amp;quot;Päron&amp;quot;&lt;/span&gt; },&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;new&lt;/span&gt; Article() { Name = &lt;span class="str"&gt;&amp;quot;Artikel 5&amp;quot;&lt;/span&gt;, Category = &lt;span class="str"&gt;&amp;quot;Päron&amp;quot;&lt;/span&gt; },&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;new&lt;/span&gt; Article() { Name = &lt;span class="str"&gt;&amp;quot;Artikel 6&amp;quot;&lt;/span&gt;, Category = &lt;span class="str"&gt;&amp;quot;Bananer&amp;quot;&lt;/span&gt; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;    };&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; View(articles);&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Om vi kikar på /Home/Articles så får vi nu upp en tabell med namnen på artiklarna samt vilken kategori de tillhör. Vi kan dock ej på ett enkelt sätt se hur många artiklar det finns i varje kategori, så där kan vi ha ett diagram som gör det åt oss.&lt;/p&gt;

&lt;p&gt;Diagrammet kommer att finnas under en ny controller kallad ChartController. Här har vi en metod kallad Articles(). I denna controllern skapar vi ett diagram som returneras direkt till vyn som en png-bild.&lt;/p&gt;

&lt;p&gt;Chart-funktionaliteten som vi vill åt ligger under System.Web.UI.DataVisualization.Charting, vilket i sin tur ligger i System.Web.DataVisualization.dll. Vi måste skapa en referens till den dll:en i Visual Studio då den inte ingår som standard i projekten. Den finns dock med bland listan med assemblies i GAC:n.&lt;/p&gt;

&lt;p&gt;Den fullständiga koden för att returnera diagrammet med samma dummy-data som vi hade i den andra controllern ser ut så här:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.IO;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Linq;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.Mvc;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.UI.DataVisualization.Charting;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; MvcChart.Models;&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; MvcChart.Controllers&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ChartController : Controller&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Articles()&lt;/pre&gt;

  &lt;pre&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="rem"&gt;//Skapa några artiklar&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;            List&amp;lt;Article&amp;gt; articles = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Article&amp;gt;()&lt;/pre&gt;

  &lt;pre class="alt"&gt;            {&lt;/pre&gt;

  &lt;pre&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; Article() { Name = &lt;span class="str"&gt;&amp;quot;Artikel 1&amp;quot;&lt;/span&gt;, Category = &lt;span class="str"&gt;&amp;quot;Äpplen&amp;quot;&lt;/span&gt; },&lt;/pre&gt;

  &lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; Article() { Name = &lt;span class="str"&gt;&amp;quot;Artikel 2&amp;quot;&lt;/span&gt;, Category = &lt;span class="str"&gt;&amp;quot;Äpplen&amp;quot;&lt;/span&gt; },&lt;/pre&gt;

  &lt;pre&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; Article() { Name = &lt;span class="str"&gt;&amp;quot;Artikel 3&amp;quot;&lt;/span&gt;, Category = &lt;span class="str"&gt;&amp;quot;Äpplen&amp;quot;&lt;/span&gt; },&lt;/pre&gt;

  &lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; Article() { Name = &lt;span class="str"&gt;&amp;quot;Artikel 4&amp;quot;&lt;/span&gt;, Category = &lt;span class="str"&gt;&amp;quot;Päron&amp;quot;&lt;/span&gt; },&lt;/pre&gt;

  &lt;pre&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; Article() { Name = &lt;span class="str"&gt;&amp;quot;Artikel 5&amp;quot;&lt;/span&gt;, Category = &lt;span class="str"&gt;&amp;quot;Päron&amp;quot;&lt;/span&gt; },&lt;/pre&gt;

  &lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; Article() { Name = &lt;span class="str"&gt;&amp;quot;Artikel 6&amp;quot;&lt;/span&gt;, Category = &lt;span class="str"&gt;&amp;quot;Bananer&amp;quot;&lt;/span&gt; }&lt;/pre&gt;

  &lt;pre&gt;            };&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="rem"&gt;//Skapa en chart&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            Chart chart = &lt;span class="kwrd"&gt;new&lt;/span&gt; Chart()&lt;/pre&gt;

  &lt;pre&gt;            {&lt;/pre&gt;

  &lt;pre class="alt"&gt;                Height = 300,&lt;/pre&gt;

  &lt;pre&gt;                Width = 300,&lt;/pre&gt;

  &lt;pre class="alt"&gt;                ImageType = ChartImageType.Png&lt;/pre&gt;

  &lt;pre&gt;            };&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="rem"&gt;//Visa som 3D&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            ChartArea chartArea = chart.ChartAreas.Add(&lt;span class="str"&gt;&amp;quot;Categories&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;            chartArea.Area3DStyle.Enable3D = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="rem"&gt;//Skapa en serie med grupperna&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            Series categories = chart.Series.Add(&lt;span class="str"&gt;&amp;quot;Categories&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;            categories.ChartType = SeriesChartType.Doughnut;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="rem"&gt;//Gruppera per CategoryId&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            IEnumerable&amp;lt;IGrouping&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;, Article&amp;gt;&amp;gt; catgroup = articles.GroupBy(a =&amp;gt; a.Category);&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="rem"&gt;//Lägg till en ny DataPoint för varje kategori&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (IGrouping&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;, Article&amp;gt; item &lt;span class="kwrd"&gt;in&lt;/span&gt; catgroup)&lt;/pre&gt;

  &lt;pre class="alt"&gt;            {&lt;/pre&gt;

  &lt;pre&gt;                categories.Points.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; DataPoint()&lt;/pre&gt;

  &lt;pre class="alt"&gt;                {&lt;/pre&gt;

  &lt;pre&gt;                    Label = String.Format(&lt;span class="str"&gt;&amp;quot;{0} ({1})&amp;quot;&lt;/span&gt;, item.Key, item.Count()),&lt;/pre&gt;

  &lt;pre class="alt"&gt;                    YValues = &lt;span class="kwrd"&gt;new&lt;/span&gt; Double[] { item.Count() }&lt;/pre&gt;

  &lt;pre&gt;                });&lt;/pre&gt;

  &lt;pre class="alt"&gt;            }&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="rem"&gt;//Spara ned bilden i en memorystream&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;            MemoryStream ms = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream();&lt;/pre&gt;

  &lt;pre class="alt"&gt;            chart.SaveImage(ms);&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="rem"&gt;//Returnera bilden direkt till vyn&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; File(ms.GetBuffer(), &lt;span class="str"&gt;&amp;quot;image/png&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;        }&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Det första som händer här är att dummydatan skapas upp och läggs i en lista. Sedan skapar vi en instans av Chart, vilket är klassen som används för de olika typerna av diagram. Vi anger även storlek på denna och säger att det ska bli en png-bild.&lt;/p&gt;

&lt;p&gt;Nästa steg blir att skapa en ChartArea så att vi kan sätta inställningar för diagrammet. Det enda vi gör här är att sätta det som 3D för att det skall bli snyggare. Det finns även många andra inställningar man kan göra.&lt;/p&gt;

&lt;p&gt;Efter det så skapar vi en serie. En serie är en samling data som skall visas upp på ett diagram. Man kan ha flera serier på samma diagram, vilka då visas på samma bild. Just den här serien skall vara av typen ”Doughnut”.&lt;/p&gt;

&lt;p&gt;Sedan så grupperar vi alla artiklar efter kategori och lägger till en DataPoint för var och ett. En DataPoint är ett enskilt värde i diagrammet. Vi sätter även en Label på dessa för att kunna se vilken kategori det gäller, samt hur många artiklar det finns för den.&lt;/p&gt;

&lt;p&gt;Det sista som händer är att vi sparar ned diagrammet i en memorystream som sedan returneras direkt till sidan som en png-bild.&lt;/p&gt;

&lt;p&gt;Om vi surfar direkt till /Chart/Articles nu så får vi upp den här bilden:&lt;/p&gt;

&lt;p&gt;&lt;img title="Articles-1" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="304" alt="Articles-1" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/Articles1_6DE6A64A.png" width="304" border="0" /&gt; &lt;/p&gt;

&lt;p&gt;Vi kan enkelt se att t.ex. hälften av alla artiklar (tre stycken) ligger i kategorin ”Äpplen”.&lt;/p&gt;

&lt;p&gt;De går även att använda andra typer av diagram, så genom att byta ut Doughnut mot Pyramid så kan vi få det här:&lt;/p&gt;

&lt;p&gt;&lt;img title="Articles-2" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="304" alt="Articles-2" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/Articles2_2F19D104.png" width="304" border="0" /&gt; &lt;/p&gt;

&lt;p&gt;Och väljer vi Bar så får vi det här:&lt;/p&gt;

&lt;p&gt;&lt;img title="Articles-3" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="304" alt="Articles-3" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/Articles3_15482B86.png" width="304" border="0" /&gt; &lt;/p&gt;

&lt;p&gt;Det finns väldigt många olika typer av diagram samt många olika sätt att påverka utseendet på, så för en bra genomgång av detta så rekommenderar jag en titt på exempelsidan som man kan ladda ned här:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://code.msdn.microsoft.com/mschart/Release/ProjectReleases.aspx?ReleaseId=1591"&gt;http://code.msdn.microsoft.com/mschart/Release/ProjectReleases.aspx?ReleaseId=1591&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Samt dokumentationen som finns här:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=EE8F6F35-B087-4324-9DBA-6DD5E844FD9F&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyId=EE8F6F35-B087-4324-9DBA-6DD5E844FD9F&amp;amp;displaylang=en&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Då grafen är en vanlig vy så fungerar routing för den precis som för allt annat. Vi kan gå tillbaka till Articles-vyn som vi skapade för HomeControllern och lägga till det här:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;img&lt;/span&gt; &lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;&amp;lt;%=Url.Action(&amp;quot;&lt;/span&gt;&lt;span class="attr"&gt;Articles&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;quot;, &amp;quot;&lt;/span&gt;&lt;span class="attr"&gt;Chart&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;quot;) %&amp;gt;&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;alt&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Diagram över artiklar&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Om vi nu går in på /Home/Articles så ser sidan ut så här:&lt;/p&gt;

&lt;p&gt;&lt;img title="Articles-4" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="545" alt="Articles-4" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/Articles4_66850394.png" width="320" border="0" /&gt; &lt;/p&gt;

&lt;p&gt;För att bygga vidare på den här funktionaliteten så skulle man t.ex. kunna göra det möjligt att skicka in variabler till sina ActionResult-metoder i ChartController och därmed göra diagrammen ännu mer dynamiska.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7245802" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/PSvOLogk2TkNFtfj-QOB23jGO9c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PSvOLogk2TkNFtfj-QOB23jGO9c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/PSvOLogk2TkNFtfj-QOB23jGO9c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PSvOLogk2TkNFtfj-QOB23jGO9c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MikaelSoderstrom/~4/uQ9AYh7nkFA" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/ASP.NET+4.0/default.aspx">ASP.NET 4.0</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/ASP.NET+MVC+2/default.aspx">ASP.NET MVC 2</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/VS2010/default.aspx">VS2010</category><feedburner:origLink>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/11/03/anv-228-nd-asp-net-chart-med-asp-net-mvc.aspx</feedburner:origLink></item><item><title>Tävling: Skriv en artikel och vinn en Arc Mouse!</title><link>http://feedproxy.google.com/~r/MikaelSoderstrom/~3/AlYw799lam4/t-228-vling-skriv-en-artikel-och-vinn-en-arc-mouse.aspx</link><pubDate>Wed, 21 Oct 2009 13:27:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7234981</guid><dc:creator>Vimpyboy</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://weblogs.asp.net/mikaelsoderstrom/rsscomments.aspx?PostID=7234981</wfw:commentRss><wfw:comment>http://weblogs.asp.net/mikaelsoderstrom/commentapi.aspx?PostID=7234981</wfw:comment><comments>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/10/21/t-228-vling-skriv-en-artikel-och-vinn-en-arc-mouse.aspx#comments</comments><description>&lt;p&gt;Är du sugen på att vinna ett eget exemplar av Microsoft Arc Mouse?&lt;/p&gt;
  
&lt;p&gt;Det enda du behöver göra för det är att skriva en artikel, en applikation eller spela in en video som handlar om Visual Studio 2010 eller .NET 4.0. Personerna bakom de bästa bidragen belönas med en varsin Arc Mouse!&lt;/p&gt;
  
&lt;p&gt;Tävlingen håller på fram till 22 november och man kan lämna in så många bidrag man vill.&lt;/p&gt;
  
&lt;p&gt;De bästa bidragen kommer även att publiceras på svenska MSDN:s sida för Visual Studio 2010 och .NET 4.0:&lt;/p&gt;
  
&lt;p&gt;&lt;a href="http://www.msdn.se/vs2010" mce_href="http://www.msdn.se/vs2010"&gt;http://www.msdn.se/vs2010&lt;/a&gt;&lt;/p&gt;
  
&lt;p&gt;&lt;b&gt;För att komma till tävlingen så klicka på länken nedan:&lt;/b&gt;&lt;/p&gt;
  
&lt;p&gt;&lt;a href="http://www.aspsidan.se" mce_href="http://www.aspsidan.se"&gt;http://www.aspsidan.se&lt;/a&gt; &lt;/p&gt;
  
&lt;p&gt;Lycka till!&lt;/p&gt;
&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7234981" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/jOQPT8D9AmovqpGsap2VsJQcYZo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jOQPT8D9AmovqpGsap2VsJQcYZo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/jOQPT8D9AmovqpGsap2VsJQcYZo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jOQPT8D9AmovqpGsap2VsJQcYZo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MikaelSoderstrom/~4/AlYw799lam4" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/.NET+4.0/default.aspx">.NET 4.0</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/Visual+Studio+2010/default.aspx">Visual Studio 2010</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/T_26002300_228_3B00_vling/default.aspx">T&amp;#228;vling</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/VS2010/default.aspx">VS2010</category><feedburner:origLink>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/10/21/t-228-vling-skriv-en-artikel-och-vinn-en-arc-mouse.aspx</feedburner:origLink></item><item><title>Använd HtmlEncode utan HtmlEncode</title><link>http://feedproxy.google.com/~r/MikaelSoderstrom/~3/T77bYiDgJiQ/anv-228-nd-htmlencode-utan-htmlencode.aspx</link><pubDate>Wed, 21 Oct 2009 12:15:09 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7234916</guid><dc:creator>Vimpyboy</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://weblogs.asp.net/mikaelsoderstrom/rsscomments.aspx?PostID=7234916</wfw:commentRss><wfw:comment>http://weblogs.asp.net/mikaelsoderstrom/commentapi.aspx?PostID=7234916</wfw:comment><comments>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/10/21/anv-228-nd-htmlencode-utan-htmlencode.aspx#comments</comments><description>&lt;p&gt;Precis som rubriken säger så kan man använda HtmlEncode() utan att använda HtmlEncode(), hur logiskt som helst!&lt;/p&gt;  &lt;p&gt;I ASP.NET 4.0 så kommer ett nytt kodblock, vilket låter oss göra just det här. Något som man väldigt ofta gör på sina sidor är att skydda sig mot HTML genom att använda HtmlEncode() runt strängen som skall skrivas ut för att bl.a. &amp;lt; skall bli &amp;amp;lt; och &amp;gt; skall bli &amp;amp;gt;. Det nya kodblocket i ASP.NET 4.0 låter oss skippa det här och gör det mycket smidigare att säkra upp sidan mot HTML.&lt;/p&gt;  &lt;p&gt;Som exempel så har jag skapat upp ett ASP.NET MVC-projekt i Visual Studio 2010 Beta 2. Jag har inte förändrat något, utan allt är precis som det är från start.&lt;/p&gt;  &lt;p&gt;I Index-metoden i HomeController.cs så har vi den gamla vanliga raden:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;ViewData[&lt;span class="str"&gt;&amp;quot;Message&amp;quot;&lt;/span&gt;] = &lt;span class="str"&gt;&amp;quot;Welcome to ASP.NET MVC!&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Den ser till att ett meddelande skickas till vyn. Väl i vyn så skrivs det ut med HtmlEncode för att se till att inte eventuell HTML skrivs ut:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;h2&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;= Html.Encode(ViewData[&lt;span class="str"&gt;&amp;quot;Message&amp;quot;&lt;/span&gt;]) &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;h2&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Det vi ska göra nu är att skicka med HTML för att se så att det fungerar som väntat.&lt;/p&gt;

&lt;p&gt;Vi skriver om C#-koden tidigare så texten blir kursiv:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;ViewData[&lt;span class="str"&gt;&amp;quot;Message&amp;quot;&lt;/span&gt;] = &lt;span class="str"&gt;&amp;quot;&amp;lt;i&amp;gt;Welcome to ASP.NET MVC!&amp;lt;/i&amp;gt;&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;När vi nu ser på sidan så ser vi att texten skrivs ut precis som strängen ser ut, dvs i rent text utan att vara kursiv.&lt;/p&gt;

&lt;p&gt;Om vi nu plockar bort Html.Encode() från aspx-filen så blir dock texten kursiv.&lt;/p&gt;

&lt;p&gt;Med hjälp av det nya kodblocket så kan vi utan att lägga tillbaka Server.HtmlEncode() ta nytta av funktionen.&lt;/p&gt;

&lt;p&gt;Genom att byta ut = mot : i kodblocket så körs HtmlEncode automatiskt på strängen och skriver ut den.&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;h2&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;: ViewData[&lt;span class="str"&gt;&amp;quot;Message&amp;quot;&lt;/span&gt;] &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;h2&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Det är ett mycket renare sätt att lösa det på, då det väldigt ofta händer att man vill köra HtmlEncode.&lt;/p&gt;

&lt;p&gt;Det här är en ny funktion i ASP.NET 4.0 och går ej att använda med någon av de tidigare versionerna.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7234916" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xKvFuK6UF8F1dBUigSWK4_mU8xI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xKvFuK6UF8F1dBUigSWK4_mU8xI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xKvFuK6UF8F1dBUigSWK4_mU8xI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xKvFuK6UF8F1dBUigSWK4_mU8xI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MikaelSoderstrom/~4/T77bYiDgJiQ" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/ASP.NET+4.0/default.aspx">ASP.NET 4.0</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/VS2010/default.aspx">VS2010</category><feedburner:origLink>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/10/21/anv-228-nd-htmlencode-utan-htmlencode.aspx</feedburner:origLink></item><item><title>Visual Studio 2010 Beta 2 släppt!</title><link>http://feedproxy.google.com/~r/MikaelSoderstrom/~3/6S9O8fw9BOQ/visual-studio-2010-beta-2-sl-228-ppt.aspx</link><pubDate>Mon, 19 Oct 2009 17:33:21 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7233129</guid><dc:creator>Vimpyboy</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://weblogs.asp.net/mikaelsoderstrom/rsscomments.aspx?PostID=7233129</wfw:commentRss><wfw:comment>http://weblogs.asp.net/mikaelsoderstrom/commentapi.aspx?PostID=7233129</wfw:comment><comments>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/10/19/visual-studio-2010-beta-2-sl-228-ppt.aspx#comments</comments><description>&lt;p&gt;Microsoft släppte för någon timme sedan Visual Studio 2010 Beta 2. Jag hade läst att det skulle komma under dagen så jag satt och slet ut F5-knappen idag. :-)&lt;/p&gt;  &lt;p&gt;De olika versioner av Visual Studio 2010 Beta 2 som finns är:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Visual Studio 2010 Ultimate Beta 2&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Visual Studio 2010 Professional Beta 2&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Visual Studio 2010 Premium Beta 2&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;Visual Studio 2010 Express Combo Beta 2&lt;/li&gt;    &lt;li&gt;Visual Studio 2010 VWD Express Beta 2&lt;/li&gt;    &lt;li&gt;Visual Studio 2010 VCS Express Beta 2&lt;/li&gt;    &lt;li&gt;Visual Studio 2010 VC Express Beta 2&lt;/li&gt;    &lt;li&gt;Visual Studio 2010 VB Express Beta 2&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;De tre fetmarkerade är de tre olika versioner av Visual Studio som finns, de övriga är Express-versionerna. Vi kan se några intressanta saker här. Dels så finns det nya namn för Visual Studio – Ultimate, Professional och Premium, dvs precis som för Windows. Sen så har vi även Express Combo som ser ut att vara ett paket med alla Express-versioner.&lt;/p&gt;  &lt;p&gt;Jag påbörjade nedladdningen av VS 2010 Ultimate på jobbet, men var tvungen att gå hem, så jag får nog vänta ett tag innan jag får leka ordentligt. :-(&lt;/p&gt;  &lt;p&gt;Ni kan dock se fram emot ett antal bloggposter dels här, men även på &lt;a href="http://www.msdn.se/vs2010"&gt;http://www.msdn.se/vs2010&lt;/a&gt; som är svenska Microsofts sida för Visual Studio 2010 och .NET 4.0.&lt;/p&gt;  &lt;p&gt;För information om vad som är nytt i ASP.NET 4.0 Beta 2 så kan ni hitta information här:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.asp.net/learn/whitepapers/aspnet40/" href="http://www.asp.net/learn/whitepapers/aspnet40/"&gt;http://www.asp.net/learn/whitepapers/aspnet40/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Till nästa gång så koda lugnt! Eller vad tusan.. Koda så det ryker! :-)&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7233129" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Jkp8jsPDIUQaWMm9AroZQYElb_M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Jkp8jsPDIUQaWMm9AroZQYElb_M/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Jkp8jsPDIUQaWMm9AroZQYElb_M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Jkp8jsPDIUQaWMm9AroZQYElb_M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MikaelSoderstrom/~4/6S9O8fw9BOQ" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/.NET+4.0/default.aspx">.NET 4.0</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/Visual+Studio+2010/default.aspx">Visual Studio 2010</category><feedburner:origLink>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/10/19/visual-studio-2010-beta-2-sl-228-ppt.aspx</feedburner:origLink></item><item><title>Skapa Microsoft Tags på din hemsida</title><link>http://feedproxy.google.com/~r/MikaelSoderstrom/~3/9zL-nrhhcqM/skapa-microsoft-tags-p-229-din-hemsida.aspx</link><pubDate>Sat, 17 Oct 2009 08:11:55 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7231950</guid><dc:creator>Vimpyboy</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://weblogs.asp.net/mikaelsoderstrom/rsscomments.aspx?PostID=7231950</wfw:commentRss><wfw:comment>http://weblogs.asp.net/mikaelsoderstrom/commentapi.aspx?PostID=7231950</wfw:comment><comments>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/10/17/skapa-microsoft-tags-p-229-din-hemsida.aspx#comments</comments><description>&lt;p&gt;Något som är riktigt häftigt är Microsoft Tags. Det är små taggar i form av bilder som man kan använda för att t.ex. göra det enkelt att surfa till en viss URL genom att bara peka mobilkameran mot den. Det kan användas i reklamsyfte, man kan ha det på sitt visitkort för att länka till bloggen eller vad man nu önskar.&lt;/p&gt;  &lt;p&gt;Det är svårt att inse hur häftigt det verkligen är förrän man testar det själv!&lt;/p&gt;  &lt;p&gt;För att kunna testa det här så surfa med mobiltelefonen till:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gettag.mobi/"&gt;http://gettag.mobi/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Det fungerar på de flesta mobiltelefoner, så jag kan rekommendera att ni laddar ned det på direkten. När man startar programmet på mobilen så aktiveras kameran, och när man riktar den mot en bild så startar webbläsaren upp och går till &lt;a href="en"&gt;URL:en&lt;/a&gt; som bilden är riktad mot.&lt;/p&gt;  &lt;p&gt;För att kunna testa att det fungerar så kan ni testa att köra programmet på mobiltelefonen och rikta kameran mot bilden nedan:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/1blog_38792237.gif"&gt;&lt;img title="1 - blog" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="244" alt="1 - blog" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/1blog_thumb_30841086.gif" width="241" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Ni bör nu komma till min blogg på mobiltelefonen!&lt;/p&gt;  &lt;p&gt;För att kunna skapa taggar som denna själv så kan ni skapa ett konto här:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://tag.microsoft.com/"&gt;http://tag.microsoft.com&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Det gör det möjligt att skapa upp egna taggar på sidan och generera upp dem i olika färger och typer.&lt;/p&gt;  &lt;p&gt;För att kunna ta del av det som finns i artikeln så bör ni även registrera er för API:t, vilket ni kan göra här:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.microsoft.com/tag/content/support/developer/"&gt;http://www.microsoft.com/tag/content/support/developer/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ni bör efter ett tag få en API-nyckel skickad till mailen. Den behövs för att ni skall kunna generera taggarna själva.&lt;/p&gt;  &lt;h4&gt;Skapa egna funktioner för att generera taggar&lt;/h4&gt;  &lt;p&gt;För att vi ska kunna generera taggarna så har jag en solution i Visual Studio med två klasser, ett klassbibliotek samt ett ASP.NET MVC 2-projekt.&lt;/p&gt;  &lt;p&gt;I klassbiblioteket så behöver vi en service-referens till den här &lt;a href="en"&gt;URL:en&lt;/a&gt;:&lt;/p&gt;  &lt;p&gt;&lt;a href="https://ws.tag.microsoft.com/MIBPService.wsdl"&gt;https://ws.tag.microsoft.com/MIBPService.wsdl&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Vi kommer även att ha en klass vid namn TagRepository där vi lägger till metoderna för att hantera alla taggar.&lt;/p&gt;  &lt;p&gt;I den här klassen har vi metoder för att skapa kategorier, skapa taggar och sedan hämta dem.&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; MicrosoftTag.TagService;&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; MicrosoftTag&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; TagRepository&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; AccessToken = &lt;span class="str"&gt;&amp;quot;DIN PRIVATA API-NYCKEL&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        UserCredential _credentials;&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; TagRepository()&lt;/pre&gt;

  &lt;pre&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;            _credentials = &lt;span class="kwrd"&gt;new&lt;/span&gt; UserCredential();&lt;/pre&gt;

  &lt;pre&gt;            _credentials.AccessToken = AccessToken;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; CreateTag(&lt;span class="kwrd"&gt;string&lt;/span&gt; categoryname, URITag tag)&lt;/pre&gt;

  &lt;pre&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;using&lt;/span&gt; (MIBPContractClient client = &lt;span class="kwrd"&gt;new&lt;/span&gt; MIBPContractClient())&lt;/pre&gt;

  &lt;pre&gt;            {&lt;/pre&gt;

  &lt;pre class="alt"&gt;                client.CreateTag(_credentials, categoryname, tag);&lt;/pre&gt;

  &lt;pre&gt;            }&lt;/pre&gt;

  &lt;pre class="alt"&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; CreateCategory(Category category)&lt;/pre&gt;

  &lt;pre&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;using&lt;/span&gt; (MIBPContractClient client = &lt;span class="kwrd"&gt;new&lt;/span&gt; MIBPContractClient())&lt;/pre&gt;

  &lt;pre&gt;            {&lt;/pre&gt;

  &lt;pre class="alt"&gt;                client.CreateCategory(_credentials, category);&lt;/pre&gt;

  &lt;pre&gt;            }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] GetBarcode(&lt;span class="kwrd"&gt;string&lt;/span&gt; categoryname, &lt;span class="kwrd"&gt;string&lt;/span&gt; tagname)&lt;/pre&gt;

  &lt;pre class="alt"&gt;        {&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;using&lt;/span&gt; (MIBPContractClient client = &lt;span class="kwrd"&gt;new&lt;/span&gt; MIBPContractClient())&lt;/pre&gt;

  &lt;pre class="alt"&gt;            {&lt;/pre&gt;

  &lt;pre&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; client.GetBarcode(&lt;/pre&gt;

  &lt;pre class="alt"&gt;                    _credentials,&lt;/pre&gt;

  &lt;pre&gt;                    categoryname,&lt;/pre&gt;

  &lt;pre class="alt"&gt;                    tagname,&lt;/pre&gt;

  &lt;pre&gt;                    ImageTypes.gif,&lt;/pre&gt;

  &lt;pre class="alt"&gt;                    0.75F,&lt;/pre&gt;

  &lt;pre&gt;                    DecorationType.HCCBRP_DECORATION_NONE,&lt;/pre&gt;

  &lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;false&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;                    );&lt;/pre&gt;

  &lt;pre class="alt"&gt;            }&lt;/pre&gt;

  &lt;pre&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;    }&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Jag kommer inte att gå in så djupgående vad alla anrop gör, utan det är ganska självförklarande. Det som vi eventuellt skulle kunna påverka här är GetBarcode där vi har möjlighet att påverka de taggar som hämtas ut från tjänsten. Vi kan t.ex. välja att ha ett annorlunda utseende på taggen, vi kan välja att ha den i svartvitt, vi kan ändra storlek (0.75-2 inches) m.m. Här har vi den minsta taggen samt har satt att vi inte vill ha någon dekoration runt. Det ger bilden som jag visade tidigare.&lt;/p&gt;

&lt;p&gt;Nästa steg blir att skapa ASP.NET MVC 2-projektet. Det här projektet skall ha en referens till klassbiblioteket. Vi måste även kopiera några rader från app.config i klassbiblioteket till web.config i webbprojektet för att webbtjänsten skall hittas.&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;system.serviceModel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;bindings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;basicHttpBinding&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;binding&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;BasicHttpBinding_IMIBPContract&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;closeTimeout&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;00:01:00&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;                &lt;span class="attr"&gt;openTimeout&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;00:01:00&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;receiveTimeout&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;00:10:00&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;sendTimeout&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;00:01:00&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;                &lt;span class="attr"&gt;allowCookies&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;bypassProxyOnLocal&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;hostNameComparisonMode&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;StrongWildcard&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;                &lt;span class="attr"&gt;maxBufferSize&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;65536&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;maxBufferPoolSize&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;524288&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;maxReceivedMessageSize&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;65536&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;                &lt;span class="attr"&gt;messageEncoding&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Text&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;textEncoding&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;transferMode&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Buffered&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;                &lt;span class="attr"&gt;useDefaultWebProxy&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;readerQuotas&lt;/span&gt; &lt;span class="attr"&gt;maxDepth&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;32&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;maxStringContentLength&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;8192&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;maxArrayLength&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;16384&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;                    &lt;span class="attr"&gt;maxBytesPerRead&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;4096&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;maxNameTableCharCount&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;16384&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;security&lt;/span&gt; &lt;span class="attr"&gt;mode&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Transport&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;transport&lt;/span&gt; &lt;span class="attr"&gt;clientCredentialType&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;None&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;proxyCredentialType&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;None&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;                        &lt;span class="attr"&gt;realm&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;message&lt;/span&gt; &lt;span class="attr"&gt;clientCredentialType&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;UserName&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;algorithmSuite&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Default&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;security&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;binding&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;basicHttpBinding&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;customBinding&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;binding&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;BasicHttpBinding_IMIBPContract1&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;textMessageEncoding&lt;/span&gt; &lt;span class="attr"&gt;maxReadPoolSize&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;64&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;maxWritePoolSize&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;16&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;                    &lt;span class="attr"&gt;messageVersion&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Soap11&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;writeEncoding&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;readerQuotas&lt;/span&gt; &lt;span class="attr"&gt;maxDepth&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;32&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;maxStringContentLength&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;8192&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;maxArrayLength&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;16384&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;                        &lt;span class="attr"&gt;maxBytesPerRead&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;4096&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;maxNameTableCharCount&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;16384&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;textMessageEncoding&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;httpsTransport&lt;/span&gt; &lt;span class="attr"&gt;manualAddressing&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;maxBufferPoolSize&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;524288&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;                    &lt;span class="attr"&gt;maxReceivedMessageSize&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;65536&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;allowCookies&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;authenticationScheme&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Anonymous&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;                    &lt;span class="attr"&gt;bypassProxyOnLocal&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;hostNameComparisonMode&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;StrongWildcard&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;                    &lt;span class="attr"&gt;keepAliveEnabled&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;maxBufferSize&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;65536&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;proxyAuthenticationScheme&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Anonymous&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;                    &lt;span class="attr"&gt;realm&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;transferMode&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Buffered&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;unsafeConnectionNtlmAuthentication&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;                    &lt;span class="attr"&gt;useDefaultWebProxy&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;requireClientCertificate&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;binding&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;customBinding&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;bindings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;client&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;endpoint&lt;/span&gt; &lt;span class="attr"&gt;address&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;https://ws.tag.microsoft.com/Service.svc&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="attr"&gt;binding&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;basicHttpBinding&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;bindingConfiguration&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;BasicHttpBinding_IMIBPContract&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="attr"&gt;contract&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TagService.IMIBPContract&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;BasicHttpBinding_IMIBPContract&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;client&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;system.serviceModel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;För att slippa problem med storleken på bilden som hämtas så kommer vi även att behöva ändra värdet på maxArrayLength under basicHttpBinding\binding\readerQuotas till 16384000. Annars kommer ett lustigt felmeddelande som säger att gränsen har överskridits.&lt;/p&gt;

&lt;p&gt;Nästa steg blir att skapa en controller vid namn TagController. Här har vi våra metoder för att kunna skapa kategorier och taggar, samt för att kunna hämta taggarna.&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.Mvc;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; MicrosoftTag;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; MicrosoftTag.TagService;&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; Web.Controllers&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; TagController : Controller&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        TagRepository repository = &lt;span class="kwrd"&gt;new&lt;/span&gt; TagRepository();&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Index()&lt;/pre&gt;

  &lt;pre&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; View();&lt;/pre&gt;

  &lt;pre&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult CreateTag()&lt;/pre&gt;

  &lt;pre class="alt"&gt;        {&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; View();&lt;/pre&gt;

  &lt;pre class="alt"&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        [HttpPost]&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult CreateTag(&lt;span class="kwrd"&gt;string&lt;/span&gt; category, FormCollection collection)&lt;/pre&gt;

  &lt;pre class="alt"&gt;        {&lt;/pre&gt;

  &lt;pre&gt;            URITag tag = &lt;span class="kwrd"&gt;new&lt;/span&gt; URITag();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;            UpdateModel(tag);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;            repository.CreateTag(category, tag);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            {&lt;/pre&gt;

  &lt;pre&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; RedirectToAction(&lt;span class="str"&gt;&amp;quot;Index&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;            }&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;catch&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            {&lt;/pre&gt;

  &lt;pre&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; View();&lt;/pre&gt;

  &lt;pre class="alt"&gt;            }&lt;/pre&gt;

  &lt;pre&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult CreateCategory()&lt;/pre&gt;

  &lt;pre class="alt"&gt;        {&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; View();&lt;/pre&gt;

  &lt;pre class="alt"&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        [HttpPost]&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult CreateCategory(FormCollection collection)&lt;/pre&gt;

  &lt;pre class="alt"&gt;        {&lt;/pre&gt;

  &lt;pre&gt;            Category category = &lt;span class="kwrd"&gt;new&lt;/span&gt; Category();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;            UpdateModel(category);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            {&lt;/pre&gt;

  &lt;pre&gt;                repository.CreateCategory(category);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; RedirectToAction(&lt;span class="str"&gt;&amp;quot;Index&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;            }&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;catch&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            {&lt;/pre&gt;

  &lt;pre&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; View();&lt;/pre&gt;

  &lt;pre class="alt"&gt;            }&lt;/pre&gt;

  &lt;pre&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult GetBarcode()&lt;/pre&gt;

  &lt;pre class="alt"&gt;        {&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; View();&lt;/pre&gt;

  &lt;pre class="alt"&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        [HttpPost]&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult GetBarcode(&lt;span class="kwrd"&gt;string&lt;/span&gt; category, &lt;span class="kwrd"&gt;string&lt;/span&gt; tag)&lt;/pre&gt;

  &lt;pre class="alt"&gt;        {&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            {&lt;/pre&gt;

  &lt;pre&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; File(repository.GetBarcode(category, tag), &lt;span class="str"&gt;&amp;quot;image/gif&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;            }&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;catch&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            {&lt;/pre&gt;

  &lt;pre&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; View();&lt;/pre&gt;

  &lt;pre class="alt"&gt;            }&lt;/pre&gt;

  &lt;pre&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;    }&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Våra två formulär har en varsin metod för att ta emot datan och posta till tjänsten. Där kommer sedan kategorier och taggar att lagras. Sedan har vi en metod för att posta namn på kategorin och namnet på taggen för att utifrån det kunna hämta taggarna. Det finns för närvarande ingen metod för att hämta en lista på alla kategorier och taggar, men förhoppningsvis så kommer det i en senare version. Men nu får vi alltså sköta det själva.&lt;/p&gt;

&lt;p&gt;Index-sidan kommer att vara en enkel sida som länkar till de olika vyerna för taggar.&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="asp"&gt;&amp;lt;%@ Page Title=&amp;quot;&amp;quot; Language=&amp;quot;C#&amp;quot; MasterPageFile=&amp;quot;~/Views/Shared/Site.Master&amp;quot; Inherits=&amp;quot;System.Web.Mvc.ViewPage&amp;quot; %&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Content&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Content2&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;ContentPlaceHolderID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;MainContent&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;h2&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Administration av tags&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;h2&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;p&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Använd den här sidan för att administrera dina tags.&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;p&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ul&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;li&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;= Html.ActionLink(&lt;span class="str"&gt;&amp;quot;Skapa tag&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;CreateTag&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Tag&amp;quot;&lt;/span&gt;) &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;li&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;li&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;= Html.ActionLink(&lt;span class="str"&gt;&amp;quot;Skapa kategori&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;CreateCategory&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Tag&amp;quot;&lt;/span&gt;) &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;li&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;li&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;= Html.ActionLink(&lt;span class="str"&gt;&amp;quot;Hämta tag&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;GetBarcode&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Tag&amp;quot;&lt;/span&gt;) &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;li&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ul&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:Content&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Sedan kommer vi att behöva ha sidor för de olika formulären. För kategorivyn och taggvyn så genererar vi bara standardsidor för Create som vi binder mot Category och URITag i webbtjänsten. Det hade varit snyggare att ha egna klasser att binda mot, men då det här fungerar snabbt och enkelt så kör vi på det nu.&lt;/p&gt;

&lt;p&gt;Om vi nu testar att skapa en kategori så kommer vi att se att den kategorin dyker upp på officiella administrationssidan för Microsoft Tags. Detsamma gäller om vi skapar upp taggar. Vi kan nu alltså enkelt skapa upp taggar som sedan kan användas för att vidarebefordra personer till olika sidor.&lt;/p&gt;

&lt;p&gt;Det intressanta sker nu när vi skall skapa sidan för att hämta taggar. Vi börjar med att skapa vyn för formuläret. Det skall inte vara kopplat till någon modell.&lt;/p&gt;

&lt;p&gt;Sidan i sin helhet ser ut så här:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="asp"&gt;&amp;lt;%@ Page Title=&amp;quot;&amp;quot; Language=&amp;quot;C#&amp;quot; MasterPageFile=&amp;quot;~/Views/Shared/Site.Master&amp;quot; Inherits=&amp;quot;System.Web.Mvc.ViewPage&amp;quot; %&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Content&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Content2&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;ContentPlaceHolderID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;MainContent&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;h2&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;GetBarcode&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;h2&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;= Html.ValidationSummary(&lt;span class="str"&gt;&amp;quot;Create was unsuccessful. Please correct the errors and try again.&amp;quot;&lt;/span&gt;) &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="kwrd"&gt;using&lt;/span&gt; (Html.BeginForm()) {&lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;fieldset&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;legend&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Fields&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;legend&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;p&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;label&lt;/span&gt; &lt;span class="attr"&gt;for&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;category&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Kategori:&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;label&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;                &lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;= Html.TextBox(&lt;span class="str"&gt;&amp;quot;category&amp;quot;&lt;/span&gt;) &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;                &lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;= Html.ValidationMessage(&lt;span class="str"&gt;&amp;quot;category&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;*&amp;quot;&lt;/span&gt;)&lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;p&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;p&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;label&lt;/span&gt; &lt;span class="attr"&gt;for&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;tag&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Namn på tag:&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;label&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;                &lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;= Html.TextBox(&lt;span class="str"&gt;&amp;quot;tag&amp;quot;&lt;/span&gt;) &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;                &lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;= Html.ValidationMessage(&lt;span class="str"&gt;&amp;quot;tag&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;*&amp;quot;&lt;/span&gt;) &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;p&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;p&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;input&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;submit&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Hämta&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;p&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;fieldset&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt; } &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;=Html.ActionLink(&lt;span class="str"&gt;&amp;quot;Back to List&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Index&amp;quot;&lt;/span&gt;) &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:Content&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;För att testa det så börjar vi med att skapa en kategori vid namn ”Test” och sedan en tagg under den kategorin vid namn ”MSDN” och en URL som pekar mot &lt;a href="http://www.msdn.se/"&gt;http://www.msdn.se&lt;/a&gt;. När vi väljer att hämta en tagg och fyller i dessa uppgifter så får vi nu:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/2msdn_2484B103.gif"&gt;&lt;img title="2 - msdn" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="244" alt="2 - msdn" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/2msdn_thumb_6378C24F.gif" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Testa gärna att ändra koden så att ni kan få andra utseenden på taggarna. Jag bifogar projektet så att ni enkelt kan få ned det och börja labba själva (ni behöver dock ange en egen API-nyckel):&lt;/p&gt;

&lt;p&gt;&lt;a href="http://misc.mikaelsoderstrom.se/examples/MicrosoftTag.zip"&gt;http://misc.mikaelsoderstrom.se/examples/MicrosoftTag.zip&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kom gärna med egna idéer över hur man kan använda dessa, eller exempel på där de används!&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7231950" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/7FSLnd_xqTyOYuS-Wc89DMU42HU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7FSLnd_xqTyOYuS-Wc89DMU42HU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/7FSLnd_xqTyOYuS-Wc89DMU42HU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7FSLnd_xqTyOYuS-Wc89DMU42HU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MikaelSoderstrom/~4/9zL-nrhhcqM" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/ASP.NET+MVC+2/default.aspx">ASP.NET MVC 2</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/Microsoft+Tag/default.aspx">Microsoft Tag</category><feedburner:origLink>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/10/17/skapa-microsoft-tags-p-229-din-hemsida.aspx</feedburner:origLink></item><item><title>Anropa Microsoft Ajax Minifier från ASP.NET MVC</title><link>http://feedproxy.google.com/~r/MikaelSoderstrom/~3/GppLPctJXPw/anropa-microsoft-ajax-minifier-fr-229-n-asp-net-mvc.aspx</link><pubDate>Fri, 16 Oct 2009 12:11:41 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7231365</guid><dc:creator>Vimpyboy</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://weblogs.asp.net/mikaelsoderstrom/rsscomments.aspx?PostID=7231365</wfw:commentRss><wfw:comment>http://weblogs.asp.net/mikaelsoderstrom/commentapi.aspx?PostID=7231365</wfw:comment><comments>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/10/16/anropa-microsoft-ajax-minifier-fr-229-n-asp-net-mvc.aspx#comments</comments><description>&lt;p&gt;Scott Guthrie gick tidigare idag ut med att Microsoft Ajax Library Preview 6 har släppts. I samband med det så släpptes även Microsoft Ajax Minifier, vilket jag kommer att ta upp nu.&lt;/p&gt;  &lt;p&gt;Med Microsoft Ajax Minifier så kan man krympa storleken på sin JavaScript-kod otroligt mycket. Det gör att koden kan laddas in snabbare på sidan och därmed ge en bättre användarupplevelse.&lt;/p&gt;  &lt;p&gt;För att komprimera sina js-filer så finns det tre olika sätt, antingen använder man ajaxmin.exe som är ett program som kan anropas genom kommandoprompten, eller så använder man ajaxmintask.dll som kan användas med MSBuild för att komprimera dem vid kompilering, eller ajaxmin.dll som innehåller API:er som kan anropas från vanlig .NET-kod.&lt;/p&gt;  &lt;p&gt;Både Microsoft Ajax Library Preview 6 och Microsoft Ajax Minifier går att ladda ned här:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=34488"&gt;http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=34488&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Tyvärr så saknas både ajaxmintask.dll och ajaxmin.dll i nedladdningen ovan i skrivande stund, men det hindrar oss inte från att köra den ändå. :-)&lt;/p&gt;  &lt;p&gt;För att kunna anropa från en ASP.NET MVC-applikation så behöver vi först skapa upp en sådan. Vi skapar sedan en CompressControler och en vy för visning av dels formuläret och dels JavaScriptet som är komprimerat.&lt;/p&gt;  &lt;p&gt;Sedan gör vi ett litet fulhack då dll:en inte finns, vi skapar en referens till ajaxmin.exe istället då den innehåller alla API:er som vi behöver.&lt;/p&gt;  &lt;p&gt;Jag har även skapat en enkel model som kommer att användas i exemplet.&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; JsCompress.Models&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; JavaScript&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; OriginalJavaScript { get; set; }&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; CompressedJavaScript { get; set; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;    }&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Den innehåller originalversionen av JavaScriptet och den komprimerade versionen. Jag kommer inte att göra något med dessa förutom att skriva ut den komprimerade, men det skulle t.ex. kunna cachas för att snabbt kunna komprimeras på servern och laddas in på sidan.&lt;/p&gt;

&lt;p&gt;Den fullständiga controllern ser ut så här:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.Mvc;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; JsCompress.Models;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Ajax.Utilities;&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; JsCompress.Controllers&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CompressController : Controller&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Index()&lt;/pre&gt;

  &lt;pre&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; View();&lt;/pre&gt;

  &lt;pre&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;        [AcceptVerbs(HttpVerbs.Post)]&lt;/pre&gt;

  &lt;pre class="alt"&gt;        [ValidateInput(&lt;span class="kwrd"&gt;false&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; ContentResult Index(FormCollection collection)&lt;/pre&gt;

  &lt;pre class="alt"&gt;        {&lt;/pre&gt;

  &lt;pre&gt;            JavaScript js = &lt;span class="kwrd"&gt;new&lt;/span&gt; JavaScript();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;            UpdateModel(js);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;            JSParser parser = &lt;span class="kwrd"&gt;new&lt;/span&gt; JSParser(js.OriginalJavaScript, &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;            Block block = parser.Parse(&lt;span class="kwrd"&gt;new&lt;/span&gt; CodeSettings());&lt;/pre&gt;

  &lt;pre&gt;            js.CompressedJavaScript = block.ToCode();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; Content(js.CompressedJavaScript, &lt;span class="str"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;        }&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Det jag gör vid postning är att skapa en ny instans av JSParser, vilket kommer från exe-filen. Där skickar jag med originalversionen av JavaScriptet, vilket kommer med i postningen. Sedan parseas JavaScriptet och sparas i CompressedJavaScript.&lt;/p&gt;

&lt;p&gt;Det sista som sker är att det skrivs ut på sidan som text/plain genom en ContentResult.&lt;/p&gt;

&lt;p&gt;Det finns många inställningar för hur parsningen skall ske, så jag rekommenderar att ni läser igenom dokumentationen vilken följer med i nedladdningen.&lt;/p&gt;

&lt;p&gt;Index-vyn i CompressController har bara ett enkelt fält:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&amp;lt;%@ Page Title=&lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt; Language=&lt;span class="str"&gt;&amp;quot;C#&amp;quot;&lt;/span&gt; MasterPageFile=&lt;span class="str"&gt;&amp;quot;~/Views/Shared/Site.Master&amp;quot;&lt;/span&gt; Inherits=&lt;span class="str"&gt;&amp;quot;System.Web.Mvc.ViewPage&amp;lt;JsCompress.Models.JavaScript&amp;gt;&amp;quot;&lt;/span&gt; %&amp;gt;&lt;/pre&gt;

  &lt;pre&gt;&amp;lt;asp:Content ID=&lt;span class="str"&gt;&amp;quot;Content2&amp;quot;&lt;/span&gt; ContentPlaceHolderID=&lt;span class="str"&gt;&amp;quot;MainContent&amp;quot;&lt;/span&gt; runat=&lt;span class="str"&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&amp;gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &amp;lt;h2&amp;gt;Komprimera JavaScript&amp;lt;/h2&amp;gt;&lt;/pre&gt;

  &lt;pre&gt;    &amp;lt;% &lt;span class="kwrd"&gt;using&lt;/span&gt; (Html.BeginForm()) {%&amp;gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &amp;lt;fieldset&amp;gt;&lt;/pre&gt;

  &lt;pre&gt;            &amp;lt;legend&amp;gt;Komprimera ett JavaScript&amp;lt;/legend&amp;gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &amp;lt;p&amp;gt;&lt;/pre&gt;

  &lt;pre&gt;                &amp;lt;label &lt;span class="kwrd"&gt;for&lt;/span&gt;=&lt;span class="str"&gt;&amp;quot;OriginalJavaScript&amp;quot;&lt;/span&gt;&amp;gt;JavaScript:&amp;lt;/label&amp;gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;                &amp;lt;%= Html.TextArea(&lt;span class="str"&gt;&amp;quot;OriginalJavaScript&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; { cols = &lt;span class="str"&gt;&amp;quot;120&amp;quot;&lt;/span&gt;, rows = &lt;span class="str"&gt;&amp;quot;20&amp;quot;&lt;/span&gt; })%&amp;gt;&lt;/pre&gt;

  &lt;pre&gt;            &amp;lt;/p&amp;gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &amp;lt;p&amp;gt;&lt;/pre&gt;

  &lt;pre&gt;                &amp;lt;input type=&lt;span class="str"&gt;&amp;quot;submit&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;=&lt;span class="str"&gt;&amp;quot;Compress&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &amp;lt;/p&amp;gt;&lt;/pre&gt;

  &lt;pre&gt;        &amp;lt;/fieldset&amp;gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &amp;lt;% } %&amp;gt;&lt;/pre&gt;

  &lt;pre&gt;&amp;lt;/asp:Content&amp;gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;För att testa hur det fungerar så kommer jag att använda ett JavaScript som ser ut så här:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="rem"&gt;//En funktion som räknar ut x + y&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; Sum(x, y) {&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; x + y;&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;alert(Sum(1, 2));&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Om vi testar att stoppa in den i textrutan och väljer att komprimera så får vi nu upp det här:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; Sum(x,y){&lt;span class="kwrd"&gt;return&lt;/span&gt; x+y}alert(Sum(1,2))&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Alla onödiga mellanslag och kommentarer har plockats bort, vilket gör att scriptet nu tar mindre plats.&lt;/p&gt;

&lt;p&gt;Det kan antingen användas innan produktionssättning och sedan laddas upp, eller så kan ni modifiera det så att den genererar en kompilerad version direkt på servern varje gång filen uppdateras.&lt;/p&gt;

&lt;p&gt;Projektet med exemplen finns att ladda ned här:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://misc.mikaelsoderstrom.se/examples/jscompress.zip"&gt;http://misc.mikaelsoderstrom.se/examples/jscompress.zip&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7231365" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zi1VuaRI2cf0p2DKsuwF7dcwMxA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zi1VuaRI2cf0p2DKsuwF7dcwMxA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/zi1VuaRI2cf0p2DKsuwF7dcwMxA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zi1VuaRI2cf0p2DKsuwF7dcwMxA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MikaelSoderstrom/~4/GppLPctJXPw" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/ASP.NET+Ajax/default.aspx">ASP.NET Ajax</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/Javascript/default.aspx">Javascript</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/ASP.NET+MVC+2/default.aspx">ASP.NET MVC 2</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/VS2010/default.aspx">VS2010</category><feedburner:origLink>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/10/16/anropa-microsoft-ajax-minifier-fr-229-n-asp-net-mvc.aspx</feedburner:origLink></item><item><title>Lägg in en Wysiwyg-editor i ASP.NET MVC 2</title><link>http://feedproxy.google.com/~r/MikaelSoderstrom/~3/soDOr81XyOI/l-228-gg-in-en-wysiwyg-editor-i-asp-net-mvc-2.aspx</link><pubDate>Thu, 15 Oct 2009 19:02:46 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7230847</guid><dc:creator>Vimpyboy</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://weblogs.asp.net/mikaelsoderstrom/rsscomments.aspx?PostID=7230847</wfw:commentRss><wfw:comment>http://weblogs.asp.net/mikaelsoderstrom/commentapi.aspx?PostID=7230847</wfw:comment><comments>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/10/15/l-228-gg-in-en-wysiwyg-editor-i-asp-net-mvc-2.aspx#comments</comments><description>&lt;p&gt;Något som är väldigt vanligt på webbsidor (speciellt i CMS) är att man vill ha en Wysiwyg-editor på sidan för att enkelt kunna redigera sidorna och låta redaktörerna anpassa utseendet på texten samt lägga in bilder och annat.&lt;/p&gt;  &lt;p&gt;När man vill lägga in en sådan så kan man ladda ned den och lägga in den på de ställen där det passar. Det kan dock krävas en del jobb, samtidigt som man kan behöva lägga in den på flera ställen. Dessutom så finns det en risk för att det kan bli onödigt mycket jobb för att vara säker på att den fortfarande fungerar om den byts ut.&lt;/p&gt;  &lt;p&gt;Så hur kan man lösa det här på ett enkelt sätt?&lt;/p&gt;  &lt;p&gt;UIHint används som bekant av både ASP.NET Dynamic Data och ASP.NET MVC 2 för att anpassa hur olika egenskaper skrivs ut på sidan. Man kan genom att ändra i en user control enkelt byta ut kontroller och vara säker på att de fortfarande fungerar. Jag kommer att gå igenom hur vi kan använda detta för att enkelt få till en Wysiwyg-editor istället för vanliga text-fält.&lt;/p&gt;  &lt;p&gt;Först och främst så skall vi använda oss utav en modell kallad ”Customer” (surprise!). Den kommer att ha två egenskaper, ett id för att identifiera den aktuella kunden och sedan ”Information”, vilket kommer att vara en sträng med HTML där vi har information om kunden.&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; Wysiwyg.Models&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Customer&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Id { get; set; }&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Information { get; set; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;    }&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Vi kommer även att ha en CustomerController. Vid skapandet väljer vi att få med de extra metoderna för att skapa, editera och ta bort. Vi har även med en metod här som används för att fylla på med lite dummy-data.&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; List&amp;lt;Customer&amp;gt; GetCustomers()&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Customer&amp;gt;() {&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;new&lt;/span&gt; Customer() {&lt;/pre&gt;

  &lt;pre class="alt"&gt;            Id = 1,&lt;/pre&gt;

  &lt;pre&gt;            Information = &lt;span class="str"&gt;&amp;quot;Hej 1&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        },&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;new&lt;/span&gt; Customer() {&lt;/pre&gt;

  &lt;pre class="alt"&gt;            Id = 2,&lt;/pre&gt;

  &lt;pre&gt;            Information = &lt;span class="str"&gt;&amp;quot;Hej 2&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        },&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;new&lt;/span&gt; Customer() {&lt;/pre&gt;

  &lt;pre class="alt"&gt;            Id = 3,&lt;/pre&gt;

  &lt;pre&gt;            Information = &lt;span class="str"&gt;&amp;quot;Hej 3&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        }&lt;/pre&gt;

  &lt;pre&gt;    };&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Om vi nu skapar upp en Index-sida och en Edit-sida som vi fyller med informationen från GetCustomers() så kommer vi att kunna se informationen om dem och få möjligheten att få upp ett redigeringsformulär.&lt;/p&gt;

&lt;p&gt;Formuläret ser dock rätt tråkigt ut i dess standardutförande:&lt;/p&gt;

&lt;p&gt;&lt;img title="1 - Form" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="470" alt="1 - Form" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/1Form_77348EAA.png" width="619" border="0" /&gt; &lt;/p&gt;

&lt;p&gt;Det vi vill ha istället för en enkel textruta är en Wysiwyg-editor där man skall kunna använda HTML för att snygga till texten.&lt;/p&gt;

&lt;p&gt;Vi börjar med att skapa upp en EditorTemplate för det. Det gör vi genom att skapa upp en ASP.NET MVC User Control vid namn Wysiwyg.ascx och som vi lägger i Views\Shared\EditorTemplates. Vill vi ha en template för vanlig visning så lägger vi istället våra user controls i en mapp kallad DisplayTemplates.&lt;/p&gt;

&lt;p&gt;Den nyskapade filen kommer att ha det här innehållet:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="asp"&gt;&amp;lt;%@ Control Language=&amp;quot;C#&amp;quot; Inherits=&amp;quot;System.Web.Mvc.ViewUserControl&amp;lt;string&amp;gt;&amp;quot; %&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;= Html.TextArea(&lt;span class="str"&gt;&amp;quot;Information&amp;quot;&lt;/span&gt;, Model }) &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Vi behöver även lägga till ett attribut på Information-fältet i en metadata-klass. Skapa upp en ny partiell klass till Customer som ser ut i stil med det här:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.ComponentModel.DataAnnotations;&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; Wysiwyg.Models&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    [MetadataType(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(Customer_Metadata))]&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Customer&lt;/pre&gt;

  &lt;pre class="alt"&gt;    {&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;class&lt;/span&gt; Customer_Metadata&lt;/pre&gt;

  &lt;pre class="alt"&gt;        {&lt;/pre&gt;

  &lt;pre&gt;            [UIHint(&lt;span class="str"&gt;&amp;quot;Wysiwyg&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Information { get; set; }&lt;/pre&gt;

  &lt;pre&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;    }&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Går vi in på sidan nu så kommer vi istället att ha en text-area, vilket är en bra början. Vi kan nu lägga till text på flera rader, men vi har fortfarande inget Wysiwyg-läge, så hur får vi dit det?&lt;/p&gt;

&lt;p&gt;Först och främst så laddar vi ned CKEditor 3.0 (det hette tidigare FCKEditor, men bytte namn då det är alldeles för likt ett ord som också innehåller bokstäverna FCK ;-)). Det hittar vi här:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://ckeditor.com/"&gt;http://ckeditor.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;När det är nedladdat så lägger vi ckeditor-mappen i roten för får webbapplikation.&lt;/p&gt;

&lt;p&gt;Nu behöver vi ändra lite i vår EditorTemplate för att få fram CKEditor istället för vår TextArea. Jag kommer att använda exempel-filerna som finns med i CKEditor, men ni kan lika gärna skapa egna för att kunna anpassa utseendet mer. För mer information om vad som går att göra så rekommenderar jag att ni kollar igenom exemplen som följer med, samt kollar igenom dokumentationen som finns på CKEditors hemsida.&lt;/p&gt;

&lt;p&gt;Den modifierade versionen av Wysiwyg.ascx ser ut så här:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="asp"&gt;&amp;lt;%@ Control Language=&amp;quot;C#&amp;quot; Inherits=&amp;quot;System.Web.Mvc.ViewUserControl&amp;lt;string&amp;gt;&amp;quot; %&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;/ckeditor/ckeditor.js&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;lt;script src=&lt;span class="str"&gt;&amp;quot;/ckeditor/_samples/sample.js&amp;quot;&lt;/span&gt; type=&lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;link&lt;/span&gt; &lt;span class="attr"&gt;href&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;/ckeditor/_samples/sample.css&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;rel&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;stylesheet&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/css&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;= Html.TextArea(&lt;span class="str"&gt;&amp;quot;Information&amp;quot;&lt;/span&gt;, Model, &lt;span class="kwrd"&gt;new&lt;/span&gt; { @&lt;span class="kwrd"&gt;class&lt;/span&gt; = &lt;span class="str"&gt;&amp;quot;ckeditor&amp;quot;&lt;/span&gt; }) &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Jag har två referenser till js-filer och en till en css-fil här. Jag har även satt klassen för textarean till ”ckeditor”.&lt;/p&gt;

&lt;p&gt;Om vi nu kollar på sidan igen så kommer vi att se en stor förändring:&lt;/p&gt;

&lt;p&gt;&lt;img title="2 - Wysiwyg" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="545" alt="2 - Wysiwyg" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/2Wysiwyg_7C3BEDBB.png" width="742" border="0" /&gt; &lt;/p&gt;

&lt;p&gt;Genom att sätta [UIHint(”Wysiwyg”)] på valfritt fält i någon klass så kan vi alltså få in en Wysiwyg-editor direkt på sidan utan något strul alls.&lt;/p&gt;

&lt;p&gt;Om vi postar formuläret nu så kommer vi dock att få ett felmeddelande på grund av ValidateRequest i ASP.NET. För att slippa detta så måste vi sätta ValidateInput till false på de controllers som man skall kunna posta HTML till. Det här är för att vara säker på att ingen postar HTML där det inte är meningen att man ska kunna göra det.&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;[AcceptVerbs(HttpVerbs.Post)]&lt;/pre&gt;

  &lt;pre&gt;[ValidateInput(&lt;span class="kwrd"&gt;false&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Edit(&lt;span class="kwrd"&gt;int&lt;/span&gt; id, FormCollection collection)&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;När det här är gjort så kommer vi att kunna använda vår Wysiwyg-editor som om det vore vilken kontroll som helst på sidan.&lt;/p&gt;

&lt;p&gt;Vem har sagt att programmering är svårt? :-)&lt;/p&gt;

&lt;p&gt;Exemplet i artikeln finns att ladda ned här:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://misc.mikaelsoderstrom.se/examples/wysiwyg.zip"&gt;http://misc.mikaelsoderstrom.se/examples/wysiwyg.zip&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7230847" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YOAC0cDy8HT2UBaXzKwEzE2YId0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YOAC0cDy8HT2UBaXzKwEzE2YId0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YOAC0cDy8HT2UBaXzKwEzE2YId0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YOAC0cDy8HT2UBaXzKwEzE2YId0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MikaelSoderstrom/~4/soDOr81XyOI" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/ASP.NET+MVC+2/default.aspx">ASP.NET MVC 2</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/VS2010/default.aspx">VS2010</category><feedburner:origLink>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/10/15/l-228-gg-in-en-wysiwyg-editor-i-asp-net-mvc-2.aspx</feedburner:origLink></item><item><title>Framtiden för ASP.NET MVC</title><link>http://feedproxy.google.com/~r/MikaelSoderstrom/~3/Ep2rXvtUyfs/framtiden-f-246-r-asp-net-mvc.aspx</link><pubDate>Wed, 07 Oct 2009 10:00:39 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7224677</guid><dc:creator>Vimpyboy</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://weblogs.asp.net/mikaelsoderstrom/rsscomments.aspx?PostID=7224677</wfw:commentRss><wfw:comment>http://weblogs.asp.net/mikaelsoderstrom/commentapi.aspx?PostID=7224677</wfw:comment><comments>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/10/07/framtiden-f-246-r-asp-net-mvc.aspx#comments</comments><description>&lt;p&gt;Jag har tidigare nämnt att det som finns i ASP.NET MVC 2 Preview 2 (och Preview 1 förstås) är något som är långt ifrån färdigt, och mycket väl kan fungera helt annorlunda när det väl är släppt. Ser man på ASP.NET MVC 1 så var det enorm skillnad på de första preview-versionerna jämfört med den färdiga produkten.&lt;/p&gt;  &lt;p&gt;Men finns det något roligare än att labba med preview-versionerna av ASP.NET MVC? Japp! Man kan även labba med ASP.NET MVC Futures. :-)&lt;/p&gt;  &lt;p&gt;ASP.NET MVC Futures är ett paket med funktioner som inte har kommit till det stadiet där det kan användas i preview-versionerna. Det beror på att de mest används för att testa nya funktioner, som eventuellt kan hamna i en preview och därefter möjligtvis kan hamna i den färdiga produkten. Det har även släppts några ASP.NET Futures för vanliga ASP.NET, där vissa funktioner kommer med, andra inte.&lt;/p&gt;  &lt;p&gt;Innan jag går vidare så rekommenderar jag att du laddar ned ASP.NET MVC Futures, vilket du hittar här:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=33836"&gt;http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=33836&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Det ni behöver är både ASP.NET MVC 2 Preview 2, och ASP.NET MVC Futures Assembly for Preview 2.&lt;/p&gt;  &lt;h4&gt;Sätt upp projektet&lt;/h4&gt;  &lt;p&gt;När det är nedladdat så skapa ett ASP.NET MVC 2-projekt. Här lägger vi till en klass i models-mappen som ser ut på detta vis:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Customer&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    [DisplayName(&lt;span class="str"&gt;&amp;quot;Kund-ID&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; CustomerId { get; set; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;    [Required(ErrorMessage = &lt;span class="str"&gt;&amp;quot;Du måste ange ett förnamn!&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; FirstName { get; set; }&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    [Required(ErrorMessage = &lt;span class="str"&gt;&amp;quot;Du måste ange ett förnamn!&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; LastName { get; set; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;    [Required(ErrorMessage=&lt;span class="str"&gt;&amp;quot;Du måste ange ett födelsedatum&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; DateTime Birthday { get; set; }&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Vi kommer även att skapa en CustomerController, där vi lägger till den här metoden på slutet för att få lite dummy-data:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; List&amp;lt;Customer&amp;gt; GetCustomers()&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    List&amp;lt;Customer&amp;gt; customers = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Customer&amp;gt;();&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    customers.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; Customer()&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        CustomerId = 1,&lt;/pre&gt;

  &lt;pre&gt;        FirstName = &lt;span class="str"&gt;&amp;quot;Sven&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre class="alt"&gt;        LastName = &lt;span class="str"&gt;&amp;quot;Svensson&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;        Birthday = &lt;span class="kwrd"&gt;new&lt;/span&gt; DateTime(1900, 01, 01)&lt;/pre&gt;

  &lt;pre class="alt"&gt;    });&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    customers.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; Customer()&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        CustomerId = 2,&lt;/pre&gt;

  &lt;pre&gt;        FirstName = &lt;span class="str"&gt;&amp;quot;Nils&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre class="alt"&gt;        LastName = &lt;span class="str"&gt;&amp;quot;Nilsson&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;        Birthday = &lt;span class="kwrd"&gt;new&lt;/span&gt; DateTime(1948, 10, 22)&lt;/pre&gt;

  &lt;pre class="alt"&gt;    });&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    customers.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; Customer()&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        CustomerId = 3,&lt;/pre&gt;

  &lt;pre&gt;        FirstName = &lt;span class="str"&gt;&amp;quot;Petter&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre class="alt"&gt;        LastName = &lt;span class="str"&gt;&amp;quot;Pettersson&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;        Birthday = &lt;span class="kwrd"&gt;new&lt;/span&gt; DateTime(1940, 05, 12)&lt;/pre&gt;

  &lt;pre class="alt"&gt;    });&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; customers;&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Vi ser även till att vi får vår lista till Index-metoden:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; View(GetCustomers());&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Skapa sedan en Index-view som är hårt typad till Customer och som ska lista kunder.&lt;/p&gt;

&lt;p&gt;För att få en länk till den här sidan så lägger vi även till det här i master-sidan:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&amp;lt;li&amp;gt;&amp;lt;%= Html.ActionLink(&lt;span class="str"&gt;&amp;quot;Customers&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Index&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Customer&amp;quot;&lt;/span&gt;)%&amp;gt;&amp;lt;/li&amp;gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Det vi har nu är en helt vanlig ASP.NET MVC 2-sida med möjlighet att lista kunder. Om något verkar oklart så rekommenderar jag att du läser mina introduktionsartiklar till ASP.NET MVC innan du fortsätter.&lt;/p&gt;

&lt;h4&gt;Webbkontroller för ASP.NET MVC&lt;/h4&gt;

&lt;p&gt;Japp, det är sant. Webbkontroller kommer (eventuellt) till ASP.NET MVC, precis som de fanns för ASP.NET Web Forms. Min första tanke var något i stil med ”WTF!? OMFG!!!”, men efter att ha testat lite så verkar det inte alltför dumt då det gör det enklare att introducera ASP.NET Web Forms-utvecklare till ASP.NET MVC.&lt;/p&gt;

&lt;p&gt;För att kunna använda webbkontrollerna så börjar vi med att lägga till den här raden i web.config under configuration/system.web/pages/controls:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&amp;lt;add tagPrefix=&lt;span class="str"&gt;&amp;quot;mvc&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;namespace&lt;/span&gt;=&lt;span class="str"&gt;&amp;quot;Microsoft.Web.Mvc.Controls&amp;quot;&lt;/span&gt; assembly=&lt;span class="str"&gt;&amp;quot;Microsoft.Web.Mvc&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Det här gör att vi slipper skapa referenser till assemblyn på varje sida där vi använder kontrollerna, vilket gör aspx-filerna lite renare. Anledningen till att jag har satt ”mvc” som prefix är för att det annars kan krocka med den vanliga webbkontrollerna.&lt;/p&gt;

&lt;p&gt;Vi kan även lägga till kontrollerna i toolboxen i Visual Studio. Det gör vi genom att högerklicka i toolboxen, välja ”Choose Items…” och sedan bläddra fram till Microsoft.Web.Mvc. När vi väljer den assemblyn så får vi automatiskt alla kontroller som finns i den.&lt;/p&gt;

&lt;p&gt;Vi har nu det här i vår toolbox:&lt;/p&gt;

&lt;p&gt;&lt;img title="1 - Toolbox" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="182" alt="1 - Toolbox" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/1Toolbox_50E72B86.png" width="164" border="0" /&gt; &lt;/p&gt;

&lt;p&gt;Det finns alltså kontroller för de funktioner som vi använder oftast i vår applikation. Jag kommer att gå igenom dessa en för en, för att visa hur det fungerar.&lt;/p&gt;

&lt;h4&gt;Webbkontroller&lt;/h4&gt;

&lt;h5&gt;ActionLink&lt;/h5&gt;

&lt;p&gt;Den första kontrollen vi har är en ActionLink, vilken gör exakt vad det låter som. För att använda den på vår sida så öppnar vi först upp master-sidan. Sedan byter vi ut vår customer-länk som nu ser ut så här:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&amp;lt;li&amp;gt;&amp;lt;%= Html.ActionLink(&lt;span class="str"&gt;&amp;quot;Customers&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Index&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Customer&amp;quot;&lt;/span&gt;)%&amp;gt;&amp;lt;/li&amp;gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Mot:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&amp;lt;li&amp;gt;&amp;lt;mvc:ActionLink runat=&lt;span class="str"&gt;&amp;quot;server&amp;quot;&lt;/span&gt; ActionName=&lt;span class="str"&gt;&amp;quot;Index&amp;quot;&lt;/span&gt; ControllerName=&lt;span class="str"&gt;&amp;quot;Customer&amp;quot;&lt;/span&gt; Text=&lt;span class="str"&gt;&amp;quot;Customers&amp;quot;&lt;/span&gt; /&amp;gt;&amp;lt;/li&amp;gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Det är alltså en webbkontroll som använder properties för att ange action, controller och texten som skall synas.&lt;/p&gt;

&lt;p&gt;Något som är väldigt positivt här är att det inte renderas någon hemsk HTML i stil med Web Forms, utan det som kommer är ett vanligt a-element precis som för Html.ActionLink(). Kontrollen kan ses som en Html.ActionLink(), men utan kodblocken runt.&lt;/p&gt;

&lt;h5&gt;DropDownList&lt;/h5&gt;

&lt;p&gt;DropDownList-kontrollen returnerar en enkel select-lista på sidan. Då ASP.NET MVC inte har stöd för PostBacks så finns ingen möjlighet att använda AutoPostBack på kontrollen, utan sådant får man sköta med egna JavaScript om man så önskar.&lt;/p&gt;

&lt;p&gt;För att använda kontrollen så lägger vi först in kontrollen på index-sidan:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&amp;lt;mvc:DropDownList runat=&lt;span class="str"&gt;&amp;quot;server&amp;quot;&lt;/span&gt; Name=&lt;span class="str"&gt;&amp;quot;customers&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;För att kunna fylla den med data så måste vi använda ViewData[”customers”] och fylla den med en IEnumerable&amp;lt;SelectListItem&amp;gt;. Då fylls vår DropDownList med datan som finns i ViewData-objektet.&lt;/p&gt;

&lt;p&gt;Koden vi använder i controllern för att fylla listan med namnen på alla personer är:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;List&amp;lt;SelectListItem&amp;gt; customers = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;SelectListItem&amp;gt;();&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;foreach&lt;/span&gt; (Customer customer &lt;span class="kwrd"&gt;in&lt;/span&gt; GetCustomers())&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    customers.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; SelectListItem()&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        Text = customer.FirstName + &lt;span class="str"&gt;&amp;quot; &amp;quot;&lt;/span&gt; + customer.LastName&lt;/pre&gt;

  &lt;pre&gt;    });&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;ViewData[&lt;span class="str"&gt;&amp;quot;customers&amp;quot;&lt;/span&gt;] = customers;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;När vi sedan kör sidan så får vi upp en enkel lista med alla namn:&lt;/p&gt;

&lt;p&gt;&lt;img title="2 - Dropdownlist" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="76" alt="2 - Dropdownlist" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/2Dropdownlist_78D6FE5A.png" width="133" border="0" /&gt; &lt;/p&gt;

&lt;h5&gt;Hidden&lt;/h5&gt;

&lt;p&gt;Det händer ofta att man vill ha med dolda input-fält på klienten som sedan skall följa med när man postar.&lt;/p&gt;

&lt;p&gt;När man använder kontrollen så ser det ut så här:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;mvc:Hidden&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Format&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;hemlis&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;hiddenfield&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Det renderas så här:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;input&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;hiddenfield&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;hidden&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;hemlis&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Format är alltså värdet vi vill skicka med och Name just namnet som sedan används när man ska plocka fram värdet vid en postning.&lt;/p&gt;

&lt;h5&gt;Label&lt;/h5&gt;

&lt;p&gt;En ganska användbar kontroll är Label-kontrollen. Det som renderas är ren text, ungefär som Literal-kontrollen för Web Forms. Den har dock vissa funktioner för att kapa texten efter en viss längd, vilket kan vara användbart när man t.ex. skriver ut kortfattade nyheter på startsidan och sedan vill länka till den fullständiga nyheten.&lt;/p&gt;

&lt;p&gt;När man använder den med alla dess properties så ser den ut så här:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;mvc:Label&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;lbl&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="attr"&gt;EncodeType&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Html&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="attr"&gt;Format&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;En label med en massa text. Den kapas efter 15 tecken.&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="attr"&gt;TruncateLength&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;15&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="attr"&gt;TruncateText&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;...&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="attr"&gt;Visible&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Name måste anges trots att den inte används.&lt;/p&gt;

&lt;p&gt;EncodeType kan sättas till None, Html och HtmlAttribute, där den Html och HtmlAttribute kör HtmlEncode på texten.&lt;/p&gt;

&lt;p&gt;Format är själva texten som skall skrivas ut.&lt;/p&gt;

&lt;p&gt;TruncateLength avgör hur många tecken som ska visas.&lt;/p&gt;

&lt;p&gt;TruncateText visar vilken text som skall visas efter att den inmatade texten har klippts. HtmlEncode körs aldrig på denna.&lt;/p&gt;

&lt;p&gt;Visible är en boolean och kan sättas till false om man inte vill att texten skall visas.&lt;/p&gt;

&lt;h5&gt;Password&lt;/h5&gt;

&lt;p&gt;Password-kontrollen renderar ett vanligt lösenordsfält.&lt;/p&gt;

&lt;p&gt;Den används på det här sättet:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;mvc:Password&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;pwd&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Det som matas in blir automatiskt dolt för användaren.&lt;/p&gt;

&lt;h5&gt;TextBox&lt;/h5&gt;

&lt;p&gt;TextBox-kontrollen renderar en vanlig textruta på sidan.&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;mvc:TextBox&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="attr"&gt;Format&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Text...&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;textruta&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="attr"&gt;Visible&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Format innehåller standardvärdet för kontrollen och visible avgör om den skall visas eller ej.&lt;/p&gt;

&lt;h5&gt;Repeater&lt;/h5&gt;

&lt;p&gt;En av de mest intressanta kontrollerna är repeater-kontrollen. När man arbetar med ASP.NET MVC och har foreach-loopar i kodblock direkt i koden så kan det lätt bli rörigt. Det kan Repeater-kontrollen lösa snyggt.&lt;/p&gt;

&lt;p&gt;Den kan användas så här:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;mvc:Repeater&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;rptcustomers&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;EmptyDataTemplate&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;li&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Ingen data...&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;li&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;EmptyDataTemplate&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ItemTemplate&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;li&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;#Eval(&lt;span class="str"&gt;&amp;quot;FirstName&amp;quot;&lt;/span&gt;) &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;li&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ItemTemplate&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;mvc:Repeater&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Om vi kör sidan nu så ser vi bara texten ”Ingen data…”, vilket beror på att vi ännu inte har skickat med någon data till kontrollen.&lt;/p&gt;

&lt;p&gt;För att fylla repeater-kontrollen med data så lägger vi till det här i controllern:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;ViewData[&lt;span class="str"&gt;&amp;quot;rptcustomers&amp;quot;&lt;/span&gt;] = GetCustomers();&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Det som sker nu är att vi har bundit vår List&amp;lt;Customer&amp;gt; till Repeater-kontrollen, vilket gör att vi kommer åt alla element genom Eval(”property”).&lt;/p&gt;

&lt;h4&gt;Gör dina vyer Rest-baserade&lt;/h4&gt;

&lt;p&gt;Något som är riktigt häftigt och som följer med i ASP.NET MVC 2 Futures är möjligheten att använda sina vyer för rest-baserade anrop. Vi kan på ett väldigt enkelt sätt göra det möjligt att returnera XML eller Json istället för de vanliga HTML-baserade vyerna.&lt;/p&gt;

&lt;p&gt;För att göra det här möjligt så lägger vi till de här raderna i Application_Start() i global.asax:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;ResourceControllerFactory factory = &lt;span class="kwrd"&gt;new&lt;/span&gt; ResourceControllerFactory();&lt;/pre&gt;

  &lt;pre&gt;ModelBinders.Binders.DefaultBinder = &lt;span class="kwrd"&gt;new&lt;/span&gt; ResourceModelBinder();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;ControllerBuilder.Current.SetControllerFactory(factory);&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;När vi sedan vill göra det möjligt att använda Rest för en vy så lägger vi till WebApiEnabled-attributet på de metoder i våra controllers där vi vill ha det.&lt;/p&gt;

&lt;p&gt;Exempel:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;[WebApiEnabled]&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Index()&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Om vi nu surfar till /Customer?format=xml så får vi det här:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/3XML_7C77A9E8.png"&gt;&lt;img title="3 - XML" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="217" alt="3 - XML" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/3XML_thumb_5F963726.png" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Vi kan även ange format=json för att få det som Json, vilket underlättar om vi kör med Ajax för att rendera data.&lt;/p&gt;

&lt;p&gt;Det här gör det riktigt smidigt att kunna använda Rest för att kunna hantera datan på sidan.&lt;/p&gt;

&lt;p&gt;Om vi har tur så kommer det här till ASP.NET MVC 2!&lt;/p&gt;

&lt;h4&gt;ViewState i ASP.NET MVC? WTF?&lt;/h4&gt;

&lt;p&gt;Något som gör att många föredrar ASP.NET MVC framför ASP.NET Web Forms är just det att man inte har någon ViewState. I ASP.NET MVC Futures så kan vi dock hitta detta. Det är inte riktigt samma sak som i Web Forms, utan vi får istället möjlighet att påverka den helt, och vi behöver inte använda den om vi inte vill.&lt;/p&gt;

&lt;p&gt;För att testa detta så skapar vi en Edit-sida för våra customers.&lt;/p&gt;

&lt;p&gt;Under raden med ”using (Html.BeginForm())” så lägger vi till det här:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;= Html.Serialize(&lt;span class="str"&gt;&amp;quot;customer&amp;quot;&lt;/span&gt;, Model) &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;När vi sedan kollar i den renderade HTML-koden så ser vi det här:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;input&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;customer&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;hidden&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;/wEykAIAAQAAAP////8BAAAAAAAAAAwCAAAAPkZ1dHVyZXMsIFZlcnNpb249MS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsBQEAAAAXRnV0dXJlcy5Nb2RlbHMuQ3VzdG9tZXIEAAAAGzxDdXN0b21lcklkPmtfX0JhY2tpbmdGaWVsZBo8Rmlyc3ROYW1lPmtfX0JhY2tpbmdGaWVsZBk8TGFzdE5hbWU+a19fQmFja2luZ0ZpZWxkGTxCaXJ0aGRheT5rX19CYWNraW5nRmllbGQAAQEACA0CAAAAAQAAAAYDAAAABFN2ZW4GBAAAAAhTdmVuc3NvbgBAVyBTBVEICw==&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Det som lagras är den aktuella typen som modellen använder. Det kan sedan användas när man postar formuläret, vilket gör att vi kan skippa vissa fält i formuläret och bara ta med det vi vill.&lt;/p&gt;

&lt;p&gt;Det finns även en tredje parameter till Serialize-metoden som vi kan använda om vi vill, nämligen en av typen SerializationMode. Det är en enum med fyra fält, Encrypted, EncryptedAndSigned, PlainText och Signed. Standard är PlainText, vilket returnerar en Base64-kodad sträng.&lt;/p&gt;

&lt;p&gt;Det här är något som finns med, men som absolut inte behöver användas. Vi kan lika väl dölja denna.&lt;/p&gt;

&lt;p&gt;När vi tar emot postningen i en controller så måste vi sedan ha med en parameter av typen Customer och som har Deserialize-attributet. Då får vi automatiskt med alla ordinare värden, även om vi bara har ett fält för namnet i formuläret.&lt;/p&gt;

&lt;p&gt;Det är upp till var och en om man vill använda serialisering eller inte. Fördelen är att man inte behöver fält för värden man inte bryr sig om, nackdelen är att html-koden blir fulare.&lt;/p&gt;

&lt;p&gt;Det finns även en del annat intressant i ASP.NET MVC Futures, men det här är de delar som jag ser som mest intressanta i nuläget.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7224677" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hho7x8_OfCIcYr0CqfWgPKbe7Ec/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hho7x8_OfCIcYr0CqfWgPKbe7Ec/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hho7x8_OfCIcYr0CqfWgPKbe7Ec/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hho7x8_OfCIcYr0CqfWgPKbe7Ec/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MikaelSoderstrom/~4/Ep2rXvtUyfs" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/ASP.NET+MVC+2/default.aspx">ASP.NET MVC 2</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/VS2010/default.aspx">VS2010</category><feedburner:origLink>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/10/07/framtiden-f-246-r-asp-net-mvc.aspx</feedburner:origLink></item><item><title>Microsoft My Phone äntligen släppt!</title><link>http://feedproxy.google.com/~r/MikaelSoderstrom/~3/C2TQJF5QE7w/microsoft-my-phone-228-ntligen-sl-228-ppt.aspx</link><pubDate>Tue, 06 Oct 2009 15:59:39 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7224043</guid><dc:creator>Vimpyboy</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://weblogs.asp.net/mikaelsoderstrom/rsscomments.aspx?PostID=7224043</wfw:commentRss><wfw:comment>http://weblogs.asp.net/mikaelsoderstrom/commentapi.aspx?PostID=7224043</wfw:comment><comments>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/10/06/microsoft-my-phone-228-ntligen-sl-228-ppt.aspx#comments</comments><description>&lt;p&gt;Jag har sedan länge använt betaversionen av Microsoft My Phone, vilket har fungerat utmärkt på min mobil.&lt;/p&gt;  &lt;p&gt;För er som inte har använt det så är det ett program som gör det möjligt att synkronisera mobiltelefonen eller mobiltelefonerna om du har fler, så att du alltid har tillgång till alla bilder, all musik, alla videos, dina SMS och mycket annat. Allt lagras i molnet, så om din mobil går sönder, om du blir av med den eller om du bara har köpt en ny så kan du på ett väldigt enkelt sätt återställa allt på den nya.&lt;/p&gt;  &lt;p&gt;När man har laddat upp allt så går det att komma åt innehållet på hemsidan för My Phone, vilket gör att man kan se sina bilder, läsa SMS och annat utan att behöva ha telefonen på sig.&lt;/p&gt;  &lt;p&gt;Nu har – i samband med släppet av Windows Phones (telefoner med Windows Mobile 6.5) – My Phone gått ur betastadiet och släppts skarpt.&lt;/p&gt;  &lt;p&gt;Nya funktioner som finns med den skarpa versionen är:&lt;/p&gt;  &lt;p&gt;Dela foton via sociala nätverk.&lt;/p&gt;  &lt;p&gt;Hitta en borttappad telefon.&lt;/p&gt;  &lt;p&gt;Premiumtjänster som att låsa telefonen, skicka ett meddelande till telefonen eller helt enkelt rensa den på allt innehåll, direkt via hemsidan. Premiumtjänsterna är gratis ett tag framöver, så se till att testa dem under tiden!&lt;/p&gt;  &lt;p&gt;Har du en mobiltelefon med Windows Mobile? Då bör du definitivt testa det på en gång!&lt;/p&gt;  &lt;p&gt;Mer information finns här:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://myphone.microsoft.com"&gt;http://myphone.microsoft.com&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7224043" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_5RqgEdrRj8sQX9jaMx-6tTqpRs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_5RqgEdrRj8sQX9jaMx-6tTqpRs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_5RqgEdrRj8sQX9jaMx-6tTqpRs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_5RqgEdrRj8sQX9jaMx-6tTqpRs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MikaelSoderstrom/~4/C2TQJF5QE7w" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/Windows+Mobile/default.aspx">Windows Mobile</category><feedburner:origLink>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/10/06/microsoft-my-phone-228-ntligen-sl-228-ppt.aspx</feedburner:origLink></item><item><title>Skapa objekt med data dynamiskt med ExpandoObject</title><link>http://feedproxy.google.com/~r/MikaelSoderstrom/~3/WO5Uo-7qCoU/skapa-objekt-med-data-dynamiskt-med-expandoobject.aspx</link><pubDate>Tue, 06 Oct 2009 11:54:50 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7223988</guid><dc:creator>Vimpyboy</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://weblogs.asp.net/mikaelsoderstrom/rsscomments.aspx?PostID=7223988</wfw:commentRss><wfw:comment>http://weblogs.asp.net/mikaelsoderstrom/commentapi.aspx?PostID=7223988</wfw:comment><comments>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/10/06/skapa-objekt-med-data-dynamiskt-med-expandoobject.aspx#comments</comments><description>&lt;p&gt;När man arbetar med dynamic i .NET 4.0 så tar man ett befintligt objekt och säger att man vill använda vissa metoder eller egenskaper som finns för det objektet. Det laddas anropas sedan under runtime. Om objektet inte har de metoder som finns så får man under runtime ett fel om det, trots att allt kompilerade utan problem. &lt;p&gt;Så hur gör vi nu om vi vill skapa ett dynamiskt objekt och berätta för det vilka egenskaper och värden som finns samt till dela dem värden för att sedan anropa dem? &lt;p&gt;I .NET 4.0 under System.Dynamic så finns det ett objekt för detta, kallat ExpandoObject. Det är ett helt tomt objekt utan några egenskaper eller metoder som helst förutom de vanliga Equals(), GetHashCode(), GetType() och ToString(). Det implementerar dock ett antal interfaces, vilka används internt för att hålla reda på de metoder vi lägger på det dynamiska objektet: IDynamicMetaObjectProvider, IDictionary&amp;lt;string, Object&amp;gt;, ICollection&amp;lt;KeyValuePair&amp;lt;string, Object&amp;gt;&amp;gt;, IEnumerable&amp;lt;KeyValuePair&amp;lt;string, Object&amp;gt;&amp;gt; och IEnumerable. &lt;p&gt;När vi använder ExpandoObject så kan vi skapa instansen som vanligt: &lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;ExpandoObject o = &lt;span class="kwrd"&gt;new&lt;/span&gt; ExpandoObject(); &lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;Det här gör dock att vi star där med en instans av ett object som inte kan göra något förutom att visa att det är ett ExpandoObject, ingen höjdare alltså.
&lt;p&gt;Vi kan däremot skapa en dynamisk instans av detta objekt, och då lägga på några metoder.
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;dynamic magic = &lt;span class="kwrd"&gt;new&lt;/span&gt; ExpandoObject();&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;magic.IntX = 10;&lt;/pre&gt;&lt;pre&gt;magic.IntY = 20;&lt;/pre&gt;&lt;pre class="alt"&gt;magic.Name = &lt;span class="str"&gt;"Nisse"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;magic.SayHello = &lt;span class="kwrd"&gt;new&lt;/span&gt; Action&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;(x =&amp;gt; Console.WriteLine(&lt;span class="str"&gt;"Hello, "&lt;/span&gt; + x + &lt;span class="str"&gt;"!"&lt;/span&gt;));&lt;/pre&gt;&lt;pre class="alt"&gt;magic.Multiply = &lt;span class="kwrd"&gt;new&lt;/span&gt; Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;((x, y) =&amp;gt; x * y);&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;Här har vi skapat en dynamisk instans av ett ExpandoObject, och säger att vi har ett antal metoder och egenskaper som ska finnas på det objektet.
&lt;p&gt;Om det här hade varit en instans av ett vanligt objekt så hade vi fått ett runtime-fel som sager att metoderna inte finns för objektet. Det naturliga vore om detsamma gäller för detta objekt, så vi lägger till de här raderna under:
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;Console.WriteLine(&lt;span class="str"&gt;"X: {0}"&lt;/span&gt;, magic.IntX);&lt;/pre&gt;&lt;pre&gt;Console.WriteLine(&lt;span class="str"&gt;"Y: {0}"&lt;/span&gt;, magic.IntY);&lt;/pre&gt;&lt;pre class="alt"&gt;Console.WriteLine(&lt;span class="str"&gt;"Name: {0}"&lt;/span&gt;, magic.Name);&lt;/pre&gt;&lt;pre&gt;Console.WriteLine(&lt;span class="str"&gt;"Multiply(X, Y): {0}"&lt;/span&gt;, magic.Multiply(magic.IntX, magic.IntY));&lt;/pre&gt;&lt;pre class="alt"&gt;magic.SayHello(magic.Name);&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;När vi nu startar igång programmet så ser vi att vi inte alls fick något fel, utan istället det här:
&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/1Console_1606DD96.png"&gt;&lt;img title="1 - Console" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="63" alt="1 - Console" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/1Console_thumb_37F4D0CB.png" width="157" border="0"&gt;&lt;/a&gt; 
&lt;p&gt;Vi har alltså skapat upp ett dynamiskt objekt och tilldelat det metoder och egenskaper, på precis samma sätt som vi hade gjort med ett dynamiskt språk som JavaScript eller IronRuby, trots att det är ett statiskt språk vi arbetar med!
&lt;p&gt;Så hur går det till? Som jag nämnde tidigare så implementerar ExpandoObject ett antal interfaces som används för collections. När vi tilldelar vårt objekt egenskaper med dess värden så lagras dessa i collections internt i objektet, och plockas sedan fram när vi anropar dem.
&lt;p&gt;Om vi debuggar så ser vi att vi får upp detta:
&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/2DebugDynamicView_27102CDB.png"&gt;&lt;img title="2 - Debug Dynamic View" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="150" alt="2 - Debug Dynamic View" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/2DebugDynamicView_thumb_7F029F1D.png" width="644" border="0"&gt;&lt;/a&gt; 
&lt;p&gt;I Visual Studio 2010 så finns det en ny visualizer som används för att visa vad som finns i dynamiska vyer som denna. Vi kan här se att det har skapats olika metoder för vårt objekt med antingen datan vi har skickat in, eller de delegater som används (Action&amp;lt;string&amp;gt; och Func&amp;lt;int, int, int&amp;gt;).
&lt;p&gt;Om vi går ännu djupare så kan vi se att det i vårt objekt finns en Dictionary&amp;lt;string, object&amp;gt; som håller reda på våra objekt:
&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/3Dictionary_55B30932.png"&gt;&lt;img title="3 - Dictionary" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="120" alt="3 - Dictionary" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/3Dictionary_thumb_38D19670.png" width="644" border="0"&gt;&lt;/a&gt; 
&lt;p&gt;Vi kan enkelt se alla nycklar:
&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/4Keys_2066A475.png"&gt;&lt;img title="4 - Keys" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="125" alt="4 - Keys" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/4Keys_thumb_6FD326BC.png" width="225" border="0"&gt;&lt;/a&gt; 
&lt;p&gt;Och värden:
&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/5Values_583B7949.png"&gt;&lt;img title="5 - Values" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="121" alt="5 - Values" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/5Values_thumb_55954E49.png" width="384" border="0"&gt;&lt;/a&gt; 
&lt;p&gt;Om vi analyserar IL-koden så kan vi se att Action&amp;lt;&amp;gt; och Func&amp;lt;&amp;gt; har skrivits om till vanliga void.
&lt;p&gt;SayHello:
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;.method &lt;span class="kwrd"&gt;private&lt;/span&gt; hidebysig &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; &amp;lt;Main&amp;gt;b__12(&lt;span class="kwrd"&gt;string&lt;/span&gt; x) cil managed&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;    .custom instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()&lt;/pre&gt;&lt;pre&gt;    .maxstack 8&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0000: ldstr &lt;span class="str"&gt;"Hello, "&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_0005: ldarg.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0006: ldstr &lt;span class="str"&gt;"!"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_000b: call &lt;span class="kwrd"&gt;string&lt;/span&gt; [mscorlib]System.String::Concat(&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0010: call &lt;span class="kwrd"&gt;void&lt;/span&gt; [mscorlib]System.Console::WriteLine(&lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_0015: nop &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0016: ret &lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;.field &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`1&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; CS$&amp;lt;&amp;gt;9__CachedAnonymousMethodDelegate14&lt;/pre&gt;&lt;pre class="alt"&gt;{&lt;/pre&gt;&lt;pre&gt;    .custom instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()&lt;/pre&gt;&lt;pre class="alt"&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;Multiply:
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;.method &lt;span class="kwrd"&gt;private&lt;/span&gt; hidebysig &lt;span class="kwrd"&gt;static&lt;/span&gt; int32 &amp;lt;Main&amp;gt;b__13(int32 x, int32 y) cil managed&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;    .custom instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()&lt;/pre&gt;&lt;pre&gt;    .maxstack 2&lt;/pre&gt;&lt;pre class="alt"&gt;    .locals init (&lt;/pre&gt;&lt;pre&gt;        [0] int32 CS$1$0000)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0000: ldarg.0 &lt;/pre&gt;&lt;pre&gt;    L_0001: ldarg.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0002: mul &lt;/pre&gt;&lt;pre&gt;    L_0003: stloc.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0004: br.s L_0006&lt;/pre&gt;&lt;pre&gt;    L_0006: ldloc.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0007: ret &lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;.field &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;int32, int32, int32&amp;gt; CS$&amp;lt;&amp;gt;9__CachedAnonymousMethodDelegate15&lt;/pre&gt;&lt;pre class="alt"&gt;{&lt;/pre&gt;&lt;pre&gt;    .custom instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()&lt;/pre&gt;&lt;pre class="alt"&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;Det är inga konstigheter här, utan vid kompilering så sker detta alltid automatiskt.
&lt;p&gt;Därememot så är Main-metoden mer intressant.
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;.method &lt;span class="kwrd"&gt;private&lt;/span&gt; hidebysig &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args) cil managed&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;    .entrypoint&lt;/pre&gt;&lt;pre&gt;    .maxstack 15&lt;/pre&gt;&lt;pre class="alt"&gt;    .locals init (&lt;/pre&gt;&lt;pre&gt;        [0] &lt;span class="kwrd"&gt;object&lt;/span&gt; magic,&lt;/pre&gt;&lt;pre class="alt"&gt;        [1] &lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo[] CS$0$0000)&lt;/pre&gt;&lt;pre&gt;    L_0000: nop &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0001: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [System.Core]System.Dynamic.ExpandoObject::.ctor()&lt;/pre&gt;&lt;pre&gt;    L_0006: stloc.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0007: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, int32, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site1&lt;/pre&gt;&lt;pre&gt;    L_000c: brtrue.s L_004a&lt;/pre&gt;&lt;pre class="alt"&gt;    L_000e: ldstr &lt;span class="str"&gt;"IntX"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_0013: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0018: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre&gt;    L_001d: ldc.i4.2 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_001e: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre&gt;    L_0023: stloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0024: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0025: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0026: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_0027: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0028: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_002d: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_002e: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_002f: ldc.i4.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0030: ldc.i4.3 &lt;/pre&gt;&lt;pre&gt;    L_0031: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0032: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_0037: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0038: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0039: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpSetMemberBinder::.ctor(&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_003e: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, int32, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre&gt;    L_0043: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, int32, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site1&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0048: br.s L_004a&lt;/pre&gt;&lt;pre&gt;    L_004a: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, int32, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site1&lt;/pre&gt;&lt;pre class="alt"&gt;    L_004f: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, int32, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre&gt;    L_0054: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, int32, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site1&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0059: ldloc.0 &lt;/pre&gt;&lt;pre&gt;    L_005a: ldc.i4.s 10&lt;/pre&gt;&lt;pre class="alt"&gt;    L_005c: callvirt instance !3 [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, int32, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1, !2)&lt;/pre&gt;&lt;pre&gt;    L_0061: pop &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0062: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, int32, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site2&lt;/pre&gt;&lt;pre&gt;    L_0067: brtrue.s L_00a5&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0069: ldstr &lt;span class="str"&gt;"IntY"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_006e: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0073: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre&gt;    L_0078: ldc.i4.2 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0079: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre&gt;    L_007e: stloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_007f: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0080: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0081: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_0082: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0083: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_0088: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0089: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_008a: ldc.i4.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_008b: ldc.i4.3 &lt;/pre&gt;&lt;pre&gt;    L_008c: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_008d: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_0092: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0093: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0094: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpSetMemberBinder::.ctor(&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0099: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, int32, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre&gt;    L_009e: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, int32, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site2&lt;/pre&gt;&lt;pre class="alt"&gt;    L_00a3: br.s L_00a5&lt;/pre&gt;&lt;pre&gt;    L_00a5: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, int32, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site2&lt;/pre&gt;&lt;pre class="alt"&gt;    L_00aa: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, int32, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre&gt;    L_00af: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, int32, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site2&lt;/pre&gt;&lt;pre class="alt"&gt;    L_00b4: ldloc.0 &lt;/pre&gt;&lt;pre&gt;    L_00b5: ldc.i4.s 20&lt;/pre&gt;&lt;pre class="alt"&gt;    L_00b7: callvirt instance !3 [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, int32, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1, !2)&lt;/pre&gt;&lt;pre&gt;    L_00bc: pop &lt;/pre&gt;&lt;pre class="alt"&gt;    L_00bd: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site3&lt;/pre&gt;&lt;pre&gt;    L_00c2: brtrue.s L_0100&lt;/pre&gt;&lt;pre class="alt"&gt;    L_00c4: ldstr &lt;span class="str"&gt;"Name"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_00c9: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre class="alt"&gt;    L_00ce: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre&gt;    L_00d3: ldc.i4.2 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_00d4: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre&gt;    L_00d9: stloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_00da: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_00db: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_00dc: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_00dd: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_00de: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_00e3: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_00e4: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_00e5: ldc.i4.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_00e6: ldc.i4.3 &lt;/pre&gt;&lt;pre&gt;    L_00e7: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_00e8: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_00ed: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_00ee: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_00ef: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpSetMemberBinder::.ctor(&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_00f4: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre&gt;    L_00f9: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site3&lt;/pre&gt;&lt;pre class="alt"&gt;    L_00fe: br.s L_0100&lt;/pre&gt;&lt;pre&gt;    L_0100: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site3&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0105: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre&gt;    L_010a: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site3&lt;/pre&gt;&lt;pre class="alt"&gt;    L_010f: ldloc.0 &lt;/pre&gt;&lt;pre&gt;    L_0110: ldstr &lt;span class="str"&gt;"Nisse"&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0115: callvirt instance !3 [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1, !2)&lt;/pre&gt;&lt;pre&gt;    L_011a: pop &lt;/pre&gt;&lt;pre class="alt"&gt;    L_011b: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`1&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site4&lt;/pre&gt;&lt;pre&gt;    L_0120: brtrue.s L_015e&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0122: ldstr &lt;span class="str"&gt;"SayHello"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_0127: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre class="alt"&gt;    L_012c: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre&gt;    L_0131: ldc.i4.2 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0132: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre&gt;    L_0137: stloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0138: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0139: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_013a: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_013b: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_013c: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_0141: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0142: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0143: ldc.i4.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0144: ldc.i4.1 &lt;/pre&gt;&lt;pre&gt;    L_0145: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0146: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_014b: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_014c: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_014d: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpSetMemberBinder::.ctor(&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0152: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`1&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre&gt;    L_0157: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`1&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site4&lt;/pre&gt;&lt;pre class="alt"&gt;    L_015c: br.s L_015e&lt;/pre&gt;&lt;pre&gt;    L_015e: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`1&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site4&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0163: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`1&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre&gt;    L_0168: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`1&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site4&lt;/pre&gt;&lt;pre class="alt"&gt;    L_016d: ldloc.0 &lt;/pre&gt;&lt;pre&gt;    L_016e: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`1&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; ExpandoObjectTesting.Program::CS$&amp;lt;&amp;gt;9__CachedAnonymousMethodDelegate14&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0173: brtrue.s L_0188&lt;/pre&gt;&lt;pre&gt;    L_0175: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0176: ldftn &lt;span class="kwrd"&gt;void&lt;/span&gt; ExpandoObjectTesting.Program::&amp;lt;Main&amp;gt;b__12(&lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_017c: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [mscorlib]System.Action`1&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;::.ctor(&lt;span class="kwrd"&gt;object&lt;/span&gt;, native &lt;span class="kwrd"&gt;int&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0181: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`1&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; ExpandoObjectTesting.Program::CS$&amp;lt;&amp;gt;9__CachedAnonymousMethodDelegate14&lt;/pre&gt;&lt;pre&gt;    L_0186: br.s L_0188&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0188: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`1&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; ExpandoObjectTesting.Program::CS$&amp;lt;&amp;gt;9__CachedAnonymousMethodDelegate14&lt;/pre&gt;&lt;pre&gt;    L_018d: callvirt instance !3 [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`1&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1, !2)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0192: pop &lt;/pre&gt;&lt;pre&gt;    L_0193: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;int32, int32, int32&amp;gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site5&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0198: brtrue.s L_01d6&lt;/pre&gt;&lt;pre&gt;    L_019a: ldstr &lt;span class="str"&gt;"Multiply"&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    L_019f: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre&gt;    L_01a4: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_01a9: ldc.i4.2 &lt;/pre&gt;&lt;pre&gt;    L_01aa: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre class="alt"&gt;    L_01af: stloc.1 &lt;/pre&gt;&lt;pre&gt;    L_01b0: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_01b1: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_01b2: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_01b3: ldnull &lt;/pre&gt;&lt;pre&gt;    L_01b4: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_01b9: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;    L_01ba: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_01bb: ldc.i4.1 &lt;/pre&gt;&lt;pre&gt;    L_01bc: ldc.i4.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_01bd: ldnull &lt;/pre&gt;&lt;pre&gt;    L_01be: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_01c3: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;    L_01c4: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_01c5: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpSetMemberBinder::.ctor(&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre&gt;    L_01ca: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;int32, int32, int32&amp;gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_01cf: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;int32, int32, int32&amp;gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site5&lt;/pre&gt;&lt;pre&gt;    L_01d4: br.s L_01d6&lt;/pre&gt;&lt;pre class="alt"&gt;    L_01d6: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;int32, int32, int32&amp;gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site5&lt;/pre&gt;&lt;pre&gt;    L_01db: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;int32, int32, int32&amp;gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre class="alt"&gt;    L_01e0: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;int32, int32, int32&amp;gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site5&lt;/pre&gt;&lt;pre&gt;    L_01e5: ldloc.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_01e6: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;int32, int32, int32&amp;gt; ExpandoObjectTesting.Program::CS$&amp;lt;&amp;gt;9__CachedAnonymousMethodDelegate15&lt;/pre&gt;&lt;pre&gt;    L_01eb: brtrue.s L_0200&lt;/pre&gt;&lt;pre class="alt"&gt;    L_01ed: ldnull &lt;/pre&gt;&lt;pre&gt;    L_01ee: ldftn int32 ExpandoObjectTesting.Program::&amp;lt;Main&amp;gt;b__13(int32, int32)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_01f4: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;int32, int32, int32&amp;gt;::.ctor(&lt;span class="kwrd"&gt;object&lt;/span&gt;, native &lt;span class="kwrd"&gt;int&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_01f9: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;int32, int32, int32&amp;gt; ExpandoObjectTesting.Program::CS$&amp;lt;&amp;gt;9__CachedAnonymousMethodDelegate15&lt;/pre&gt;&lt;pre class="alt"&gt;    L_01fe: br.s L_0200&lt;/pre&gt;&lt;pre&gt;    L_0200: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;int32, int32, int32&amp;gt; ExpandoObjectTesting.Program::CS$&amp;lt;&amp;gt;9__CachedAnonymousMethodDelegate15&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0205: callvirt instance !3 [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;int32, int32, int32&amp;gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1, !2)&lt;/pre&gt;&lt;pre&gt;    L_020a: pop &lt;/pre&gt;&lt;pre class="alt"&gt;    L_020b: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site6&lt;/pre&gt;&lt;pre&gt;    L_0210: brtrue.s L_025b&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0212: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_0213: ldstr &lt;span class="str"&gt;"WriteLine"&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0218: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre&gt;    L_021d: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0222: ldnull &lt;/pre&gt;&lt;pre&gt;    L_0223: ldc.i4.3 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0224: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre&gt;    L_0229: stloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_022a: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_022b: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_022c: ldc.i4.s 0x21&lt;/pre&gt;&lt;pre&gt;    L_022e: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_022f: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_0234: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0235: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0236: ldc.i4.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0237: ldc.i4.3 &lt;/pre&gt;&lt;pre&gt;    L_0238: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0239: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_023e: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_023f: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0240: ldc.i4.2 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0241: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_0242: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0243: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_0248: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0249: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_024a: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpInvokeMemberBinder::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpCallFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type&amp;gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_024f: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre&gt;    L_0254: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site6&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0259: br.s L_025b&lt;/pre&gt;&lt;pre&gt;    L_025b: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site6&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0260: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre&gt;    L_0265: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site6&lt;/pre&gt;&lt;pre class="alt"&gt;    L_026a: ldtoken [mscorlib]System.Console&lt;/pre&gt;&lt;pre&gt;    L_026f: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0274: ldstr &lt;span class="str"&gt;"X: {0}"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_0279: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site7&lt;/pre&gt;&lt;pre class="alt"&gt;    L_027e: brtrue.s L_02b2&lt;/pre&gt;&lt;pre&gt;    L_0280: ldstr &lt;span class="str"&gt;"IntX"&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0285: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre&gt;    L_028a: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_028f: ldc.i4.1 &lt;/pre&gt;&lt;pre&gt;    L_0290: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0295: stloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0296: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0297: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_0298: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0299: ldnull &lt;/pre&gt;&lt;pre&gt;    L_029a: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_029f: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;    L_02a0: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_02a1: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpGetMemberBinder::.ctor(&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre&gt;    L_02a6: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_02ab: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site7&lt;/pre&gt;&lt;pre&gt;    L_02b0: br.s L_02b2&lt;/pre&gt;&lt;pre class="alt"&gt;    L_02b2: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site7&lt;/pre&gt;&lt;pre&gt;    L_02b7: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre class="alt"&gt;    L_02bc: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site7&lt;/pre&gt;&lt;pre&gt;    L_02c1: ldloc.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_02c2: callvirt instance !2 [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1)&lt;/pre&gt;&lt;pre&gt;    L_02c7: callvirt instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1, !2, !3)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_02cc: nop &lt;/pre&gt;&lt;pre&gt;    L_02cd: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site8&lt;/pre&gt;&lt;pre class="alt"&gt;    L_02d2: brtrue.s L_031d&lt;/pre&gt;&lt;pre&gt;    L_02d4: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_02d5: ldstr &lt;span class="str"&gt;"WriteLine"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_02da: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre class="alt"&gt;    L_02df: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre&gt;    L_02e4: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_02e5: ldc.i4.3 &lt;/pre&gt;&lt;pre&gt;    L_02e6: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre class="alt"&gt;    L_02eb: stloc.1 &lt;/pre&gt;&lt;pre&gt;    L_02ec: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_02ed: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_02ee: ldc.i4.s 0x21&lt;/pre&gt;&lt;pre class="alt"&gt;    L_02f0: ldnull &lt;/pre&gt;&lt;pre&gt;    L_02f1: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_02f6: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;    L_02f7: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_02f8: ldc.i4.1 &lt;/pre&gt;&lt;pre&gt;    L_02f9: ldc.i4.3 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_02fa: ldnull &lt;/pre&gt;&lt;pre&gt;    L_02fb: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0300: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;    L_0301: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0302: ldc.i4.2 &lt;/pre&gt;&lt;pre&gt;    L_0303: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0304: ldnull &lt;/pre&gt;&lt;pre&gt;    L_0305: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_030a: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;    L_030b: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_030c: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpInvokeMemberBinder::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpCallFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type&amp;gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre&gt;    L_0311: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0316: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site8&lt;/pre&gt;&lt;pre&gt;    L_031b: br.s L_031d&lt;/pre&gt;&lt;pre class="alt"&gt;    L_031d: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site8&lt;/pre&gt;&lt;pre&gt;    L_0322: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0327: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site8&lt;/pre&gt;&lt;pre&gt;    L_032c: ldtoken [mscorlib]System.Console&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0331: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre&gt;    L_0336: ldstr &lt;span class="str"&gt;"Y: {0}"&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    L_033b: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site9&lt;/pre&gt;&lt;pre&gt;    L_0340: brtrue.s L_0374&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0342: ldstr &lt;span class="str"&gt;"IntY"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_0347: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre class="alt"&gt;    L_034c: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre&gt;    L_0351: ldc.i4.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0352: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre&gt;    L_0357: stloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0358: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0359: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_035a: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_035b: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_035c: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_0361: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0362: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0363: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpGetMemberBinder::.ctor(&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0368: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre&gt;    L_036d: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site9&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0372: br.s L_0374&lt;/pre&gt;&lt;pre&gt;    L_0374: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site9&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0379: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre&gt;    L_037e: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site9&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0383: ldloc.0 &lt;/pre&gt;&lt;pre&gt;    L_0384: callvirt instance !2 [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0389: callvirt instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1, !2, !3)&lt;/pre&gt;&lt;pre&gt;    L_038e: nop &lt;/pre&gt;&lt;pre class="alt"&gt;    L_038f: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitea&lt;/pre&gt;&lt;pre&gt;    L_0394: brtrue.s L_03df&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0396: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_0397: ldstr &lt;span class="str"&gt;"WriteLine"&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    L_039c: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre&gt;    L_03a1: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_03a6: ldnull &lt;/pre&gt;&lt;pre&gt;    L_03a7: ldc.i4.3 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_03a8: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre&gt;    L_03ad: stloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_03ae: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_03af: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_03b0: ldc.i4.s 0x21&lt;/pre&gt;&lt;pre&gt;    L_03b2: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_03b3: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_03b8: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_03b9: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_03ba: ldc.i4.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_03bb: ldc.i4.3 &lt;/pre&gt;&lt;pre&gt;    L_03bc: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_03bd: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_03c2: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_03c3: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_03c4: ldc.i4.2 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_03c5: ldc.i4.0 &lt;/pre&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;L_03c6: ldnull &lt;/pre&gt;&lt;pre&gt;    L_03c7: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_03cc: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;    L_03cd: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_03ce: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpInvokeMemberBinder::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpCallFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type&amp;gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre&gt;    L_03d3: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_03d8: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitea&lt;/pre&gt;&lt;pre&gt;    L_03dd: br.s L_03df&lt;/pre&gt;&lt;pre class="alt"&gt;    L_03df: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitea&lt;/pre&gt;&lt;pre&gt;    L_03e4: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre class="alt"&gt;    L_03e9: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitea&lt;/pre&gt;&lt;pre&gt;    L_03ee: ldtoken [mscorlib]System.Console&lt;/pre&gt;&lt;pre class="alt"&gt;    L_03f3: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre&gt;    L_03f8: ldstr &lt;span class="str"&gt;"Name: {0}"&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    L_03fd: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Siteb&lt;/pre&gt;&lt;pre&gt;    L_0402: brtrue.s L_0436&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0404: ldstr &lt;span class="str"&gt;"Name"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_0409: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre class="alt"&gt;    L_040e: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre&gt;    L_0413: ldc.i4.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0414: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre&gt;    L_0419: stloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_041a: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_041b: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_041c: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_041d: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_041e: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_0423: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0424: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0425: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpGetMemberBinder::.ctor(&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_042a: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre&gt;    L_042f: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Siteb&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0434: br.s L_0436&lt;/pre&gt;&lt;pre&gt;    L_0436: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Siteb&lt;/pre&gt;&lt;pre class="alt"&gt;    L_043b: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre&gt;    L_0440: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Siteb&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0445: ldloc.0 &lt;/pre&gt;&lt;pre&gt;    L_0446: callvirt instance !2 [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_044b: callvirt instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1, !2, !3)&lt;/pre&gt;&lt;pre&gt;    L_0450: nop &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0451: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitec&lt;/pre&gt;&lt;pre&gt;    L_0456: brtrue.s L_04a1&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0458: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_0459: ldstr &lt;span class="str"&gt;"WriteLine"&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    L_045e: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre&gt;    L_0463: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0468: ldnull &lt;/pre&gt;&lt;pre&gt;    L_0469: ldc.i4.3 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_046a: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre&gt;    L_046f: stloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0470: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0471: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0472: ldc.i4.s 0x21&lt;/pre&gt;&lt;pre&gt;    L_0474: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0475: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_047a: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_047b: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_047c: ldc.i4.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_047d: ldc.i4.3 &lt;/pre&gt;&lt;pre&gt;    L_047e: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_047f: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_0484: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0485: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0486: ldc.i4.2 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0487: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_0488: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0489: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_048e: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_048f: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0490: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpInvokeMemberBinder::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpCallFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type&amp;gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0495: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre&gt;    L_049a: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitec&lt;/pre&gt;&lt;pre class="alt"&gt;    L_049f: br.s L_04a1&lt;/pre&gt;&lt;pre&gt;    L_04a1: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitec&lt;/pre&gt;&lt;pre class="alt"&gt;    L_04a6: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre&gt;    L_04ab: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitec&lt;/pre&gt;&lt;pre class="alt"&gt;    L_04b0: ldtoken [mscorlib]System.Console&lt;/pre&gt;&lt;pre&gt;    L_04b5: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_04ba: ldstr &lt;span class="str"&gt;"Multiply(X, Y): {0}"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_04bf: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`5&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sited&lt;/pre&gt;&lt;pre class="alt"&gt;    L_04c4: brtrue.s L_050e&lt;/pre&gt;&lt;pre&gt;    L_04c6: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_04c7: ldstr &lt;span class="str"&gt;"Multiply"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_04cc: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre class="alt"&gt;    L_04d1: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre&gt;    L_04d6: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_04d7: ldc.i4.3 &lt;/pre&gt;&lt;pre&gt;    L_04d8: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre class="alt"&gt;    L_04dd: stloc.1 &lt;/pre&gt;&lt;pre&gt;    L_04de: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_04df: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_04e0: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_04e1: ldnull &lt;/pre&gt;&lt;pre&gt;    L_04e2: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_04e7: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;    L_04e8: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_04e9: ldc.i4.1 &lt;/pre&gt;&lt;pre&gt;    L_04ea: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_04eb: ldnull &lt;/pre&gt;&lt;pre&gt;    L_04ec: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_04f1: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;    L_04f2: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_04f3: ldc.i4.2 &lt;/pre&gt;&lt;pre&gt;    L_04f4: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_04f5: ldnull &lt;/pre&gt;&lt;pre&gt;    L_04f6: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_04fb: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;    L_04fc: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_04fd: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpInvokeMemberBinder::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpCallFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type&amp;gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre&gt;    L_0502: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`5&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0507: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`5&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sited&lt;/pre&gt;&lt;pre&gt;    L_050c: br.s L_050e&lt;/pre&gt;&lt;pre class="alt"&gt;    L_050e: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`5&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sited&lt;/pre&gt;&lt;pre&gt;    L_0513: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`5&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0518: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`5&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sited&lt;/pre&gt;&lt;pre&gt;    L_051d: ldloc.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_051e: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitee&lt;/pre&gt;&lt;pre&gt;    L_0523: brtrue.s L_0557&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0525: ldstr &lt;span class="str"&gt;"IntX"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_052a: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre class="alt"&gt;    L_052f: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre&gt;    L_0534: ldc.i4.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0535: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre&gt;    L_053a: stloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_053b: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_053c: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_053d: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_053e: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_053f: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_0544: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0545: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0546: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpGetMemberBinder::.ctor(&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_054b: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre&gt;    L_0550: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitee&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0555: br.s L_0557&lt;/pre&gt;&lt;pre&gt;    L_0557: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitee&lt;/pre&gt;&lt;pre class="alt"&gt;    L_055c: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre&gt;    L_0561: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitee&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0566: ldloc.0 &lt;/pre&gt;&lt;pre&gt;    L_0567: callvirt instance !2 [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_056c: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitef&lt;/pre&gt;&lt;pre&gt;    L_0571: brtrue.s L_05a5&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0573: ldstr &lt;span class="str"&gt;"IntY"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_0578: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre class="alt"&gt;    L_057d: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre&gt;    L_0582: ldc.i4.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0583: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre&gt;    L_0588: stloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0589: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_058a: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_058b: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_058c: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_058d: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_0592: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0593: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0594: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpGetMemberBinder::.ctor(&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0599: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre&gt;    L_059e: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitef&lt;/pre&gt;&lt;pre class="alt"&gt;    L_05a3: br.s L_05a5&lt;/pre&gt;&lt;pre&gt;    L_05a5: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitef&lt;/pre&gt;&lt;pre class="alt"&gt;    L_05aa: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre&gt;    L_05af: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitef&lt;/pre&gt;&lt;pre class="alt"&gt;    L_05b4: ldloc.0 &lt;/pre&gt;&lt;pre&gt;    L_05b5: callvirt instance !2 [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_05ba: callvirt instance !4 [mscorlib]System.Func`5&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1, !2, !3)&lt;/pre&gt;&lt;pre&gt;    L_05bf: callvirt instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1, !2, !3)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_05c4: nop &lt;/pre&gt;&lt;pre&gt;    L_05c5: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site10&lt;/pre&gt;&lt;pre class="alt"&gt;    L_05ca: brtrue.s L_060a&lt;/pre&gt;&lt;pre&gt;    L_05cc: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_05cd: ldstr &lt;span class="str"&gt;"SayHello"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_05d2: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre class="alt"&gt;    L_05d7: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre&gt;    L_05dc: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_05dd: ldc.i4.2 &lt;/pre&gt;&lt;pre&gt;    L_05de: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre class="alt"&gt;    L_05e3: stloc.1 &lt;/pre&gt;&lt;pre&gt;    L_05e4: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_05e5: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_05e6: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_05e7: ldnull &lt;/pre&gt;&lt;pre&gt;    L_05e8: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_05ed: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;    L_05ee: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_05ef: ldc.i4.1 &lt;/pre&gt;&lt;pre&gt;    L_05f0: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_05f1: ldnull &lt;/pre&gt;&lt;pre&gt;    L_05f2: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_05f7: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;    L_05f8: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_05f9: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpInvokeMemberBinder::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpCallFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type&amp;gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre&gt;    L_05fe: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0603: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site10&lt;/pre&gt;&lt;pre&gt;    L_0608: br.s L_060a&lt;/pre&gt;&lt;pre class="alt"&gt;    L_060a: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site10&lt;/pre&gt;&lt;pre&gt;    L_060f: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0614: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site10&lt;/pre&gt;&lt;pre&gt;    L_0619: ldloc.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_061a: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site11&lt;/pre&gt;&lt;pre&gt;    L_061f: brtrue.s L_0653&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0621: ldstr &lt;span class="str"&gt;"Name"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_0626: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre class="alt"&gt;    L_062b: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre&gt;    L_0630: ldc.i4.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0631: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre&gt;    L_0636: stloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0637: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0638: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0639: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_063a: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_063b: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_0640: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0641: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0642: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpGetMemberBinder::.ctor(&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0647: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre&gt;    L_064c: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site11&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0651: br.s L_0653&lt;/pre&gt;&lt;pre&gt;    L_0653: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site11&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0658: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre&gt;    L_065d: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site11&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0662: ldloc.0 &lt;/pre&gt;&lt;pre&gt;    L_0663: callvirt instance !2 [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0668: callvirt instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [mscorlib]System.Action`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1, !2)&lt;/pre&gt;&lt;pre&gt;    L_066d: nop &lt;/pre&gt;&lt;pre class="alt"&gt;    L_066e: call &lt;span class="kwrd"&gt;string&lt;/span&gt; [mscorlib]System.Console::ReadLine()&lt;/pre&gt;&lt;pre&gt;    L_0673: pop &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0674: ret &lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;För att göra en lång historia kort... Det som sker är att det först skapas upp en instans av ExpandoObject, vilket ger ett object. Sedan används ett antal CallSites för att skapa upp en dynamisk call site som har hand om alla dynamiska handlingar som sker mot objektet.
&lt;p&gt;När objektet binds så returneras ett expression tree med data för objektet, vilket sedan används för att arbeta med de metoder och den data som vi tidigare har skapat.
&lt;p&gt;Då objekten skapas upp under runtime så kan vi även använda dem runt om i applikationen, vilket gör att vi kan göra t.ex. så här:
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;static&lt;/span&gt; dynamic GetExpendo()&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;    dynamic magic = &lt;span class="kwrd"&gt;new&lt;/span&gt; ExpandoObject();&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;    magic.IntX = 10;&lt;/pre&gt;&lt;pre&gt;    magic.IntY = 20;&lt;/pre&gt;&lt;pre class="alt"&gt;    magic.Name = &lt;span class="str"&gt;"Nisse"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;    magic.SayHello = &lt;span class="kwrd"&gt;new&lt;/span&gt; Action&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;(x =&amp;gt; Console.WriteLine(&lt;span class="str"&gt;"Hello, "&lt;/span&gt; + x + &lt;span class="str"&gt;"!"&lt;/span&gt;));&lt;/pre&gt;&lt;pre class="alt"&gt;    magic.Multiply = &lt;span class="kwrd"&gt;new&lt;/span&gt; Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;((x, y) =&amp;gt; x * y);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; magic;&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;Vi kan sedan skapa upp objektet genom:
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;dynamic magic = GetExpendo();&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;Det här fungerar lika bra som innan. Med andra ord så behandlas dynamiska ExpandoObject-instanser på samma sätt som vanliga statiska instanser.
&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7223988" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/bhYStJc15QqfdnfR0heQ1vAWaSI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bhYStJc15QqfdnfR0heQ1vAWaSI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/bhYStJc15QqfdnfR0heQ1vAWaSI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bhYStJc15QqfdnfR0heQ1vAWaSI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MikaelSoderstrom/~4/WO5Uo-7qCoU" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/.NET+4.0/default.aspx">.NET 4.0</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/C_2300_+4.0/default.aspx">C# 4.0</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/VS2010/default.aspx">VS2010</category><feedburner:origLink>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/10/06/skapa-objekt-med-data-dynamiskt-med-expandoobject.aspx</feedburner:origLink></item><item><title>Bygg ut dina applikationer med dynamic i .NET 4.0</title><link>http://feedproxy.google.com/~r/MikaelSoderstrom/~3/musc1lQlFmM/bygg-ut-dina-applikationer-med-dynamic-i-net-4-0.aspx</link><pubDate>Tue, 06 Oct 2009 09:08:53 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7223948</guid><dc:creator>Vimpyboy</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://weblogs.asp.net/mikaelsoderstrom/rsscomments.aspx?PostID=7223948</wfw:commentRss><wfw:comment>http://weblogs.asp.net/mikaelsoderstrom/commentapi.aspx?PostID=7223948</wfw:comment><comments>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/10/06/bygg-ut-dina-applikationer-med-dynamic-i-net-4-0.aspx#comments</comments><description>&lt;p&gt;I C# 4.0 så kommer ett nytt keyword kallat ”dynamic”. Precis som ”var” i C# 3.5 så säger det inget om vilken typ det är när man skriver. Skillnaden mot var är att var blir hårt typad vid kompilering, medan dynamic blir det vid runtime.&lt;/p&gt;  &lt;p&gt;Så, varför skulle vi vilja typa variablerna vid runtime? När man arbetar med COM som i t.ex. Office-biblioteken så är inte allt hårt typat, när man anropar DOM:en via Silverlight så är det inte heller starkt typat mot det enskilta objektet och om vi vill köra kod i ett språk baserat på DLR så är det förstås inte heller starkt typat.&lt;/p&gt;  &lt;p&gt;Det vi kan göra med dynamic är att vi kan anropa en metod i något av dessa bibliotek trots att .NET inte känner till att metoden finns under kompileringen. När vi däremot kör koden så ser .NET att objektet finns, och kör därefter den metoden vi just bad om.&lt;/p&gt;  &lt;p&gt;Istället för att ta ett objekt och peka på en metod som vi vill anropa så tar vi ett objekt och säger att vi vill anropa en metod med ett visst namn.&lt;/p&gt;  &lt;p&gt;Fördelen med det här är att vi enkelt kan anropa metoder som nödvändigtvis inte behöver när vi kompilerar, men som kommer att finnas när vi kör applikationen. Om nu inte metoden finns så får vi ett felmeddelande när vi anropar metoden.&lt;/p&gt;  &lt;p&gt;Men varför vill vi blanda t.ex. C# och IronRuby i våra applikationer? Tänk dig att vi har en applikation som vi vill att användarna skall kunna bygga ut enkelt. Om vi skriver applikationen i C# och vill utöka funktionaliteten med t.ex. C# eller Visual Basic så kan vi använda MEF eller liknande för att få den funktionaliteten. Det här kräver dock att användaren skriver sin kod, kompilerar den och sedan lägger den i en mapp som vi sedan läser in. Fördelen med ett dynamiskt språk som IronRuby är att den inte behöver kompileras, utan kan köras direkt. Vi gör det därmed möjligt för personer att enkelt skriva ihop en fil som gör det de vill och sedan låter dem injicera koden i vår applikation.&lt;/p&gt;  &lt;p&gt;I exemplet jag kommer att gå igenom så använder jag Visual Studio 2010 Beta 1 med .NET 4.0 Beta 1 och den versionen av IronRuby som finns tillgänglig för just dessa. IronRuby för .NET 4.0 Beta 1 finns att ladda ned här:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://ironruby.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=27606"&gt;http://ironruby.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=27606&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Vi börjar med att skapa ett console-projekt och lägger till referenser till Microsoft.Scripting, IronRuby och IronRuby.Libraries. Det finns även assemblies för IronPython för de som föredrar det.&lt;/p&gt;  &lt;p&gt;Applikationen vi ska skriva nu kommer att hämta alla rb-filer (IronRuby) och köra en metod vid namn ”sayhello” i klassen ”RubyTest”.&lt;/p&gt;  &lt;p&gt;Jag kommer att ha två olika rb-filer i exemplet, den ena skriver ut en rad direkt i programmet, och den andra kommer att visa en MessageBox med det inmatade värdet.&lt;/p&gt;  &lt;p&gt;Console.rb:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; RubyTest&lt;/pre&gt;

  &lt;pre&gt;  def sayhello&lt;/pre&gt;

  &lt;pre class="alt"&gt;    input = System::Console.ReadLine&lt;/pre&gt;

  &lt;pre&gt;    System::Console::WriteLine &lt;span class="str"&gt;&amp;quot;Ruby says: &amp;quot;&lt;/span&gt; + input&lt;/pre&gt;

  &lt;pre class="alt"&gt;  end&lt;/pre&gt;

  &lt;pre&gt;end&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;msgbox.rb&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;require &lt;span class="str"&gt;'System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; RubyTest&lt;/pre&gt;

  &lt;pre&gt;  def sayhello&lt;/pre&gt;

  &lt;pre class="alt"&gt;    input = System::Console.ReadLine&lt;/pre&gt;

  &lt;pre&gt;    System::Windows::Forms::MessageBox.Show input, &lt;span class="str"&gt;&amp;quot;Ruby says&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;  end&lt;/pre&gt;

  &lt;pre&gt;end&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;I båda fallen så läser vi in en sträng i programmet som vi sedan använder oss utav. Vi kommer alltså åt programmet utan att filerna på något sätt har med det att göra, utöver det faktum att de körs från det.&lt;/p&gt;

&lt;p&gt;Det vi behöver göra nu är att läsa in filerna från console-programmet och köra sayhello-metoderna.&lt;/p&gt;

&lt;p&gt;Grundstommen för vårt program ser ut så här:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.IO;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; IronRuby;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Scripting.Hosting;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; IronRubyConsole&lt;/pre&gt;

  &lt;pre class="alt"&gt;{&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;class&lt;/span&gt; Program&lt;/pre&gt;

  &lt;pre class="alt"&gt;    {&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;

  &lt;pre class="alt"&gt;        {&lt;/pre&gt;

  &lt;pre&gt;            DirectoryInfo di = &lt;span class="kwrd"&gt;new&lt;/span&gt; DirectoryInfo(Environment.CurrentDirectory + &lt;span class="str"&gt;&amp;quot;\\scripts&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;            CallRuby(di.GetFiles(&lt;span class="str"&gt;&amp;quot;*.rb&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;            Console.ReadKey();&lt;/pre&gt;

  &lt;pre class="alt"&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; CallRuby(FileInfo[] files)&lt;/pre&gt;

  &lt;pre&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (FileInfo file &lt;span class="kwrd"&gt;in&lt;/span&gt; files)&lt;/pre&gt;

  &lt;pre&gt;            {&lt;/pre&gt;

  &lt;pre class="alt"&gt;                Console.WriteLine(&lt;span class="str"&gt;&amp;quot;{0}------------{0}{1}{0}------------&amp;quot;&lt;/span&gt;, Environment.NewLine, file.Name);&lt;/pre&gt;

  &lt;pre&gt;                ExecuteRuby(file.FullName);&lt;/pre&gt;

  &lt;pre class="alt"&gt;            }&lt;/pre&gt;

  &lt;pre&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ExecuteRuby(&lt;span class="kwrd"&gt;string&lt;/span&gt; path)&lt;/pre&gt;

  &lt;pre class="alt"&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        }&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Vi loopar igenom alla rb-filer i mappen “scripts” som ligger i samma mapp som exe-filen. Sedan anropar vi metoden ExecuteRuby() där vi kommer att köra filerna.&lt;/p&gt;

&lt;p&gt;Koden som vi använder i ExecuteRuby är:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;ScriptEngine engine = Ruby.CreateEngine();&lt;/pre&gt;

  &lt;pre&gt;engine.ExecuteFile(path);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;object&lt;/span&gt; rubyclass = engine.Runtime.Globals.GetVariable(&lt;span class="str"&gt;&amp;quot;RubyTest&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;dynamic rubytest = engine.Operations.CreateInstance(rubyclass);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;rubytest.sayhello();&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;För att köra våra IronRuby-filer så behöver vi skapa ett ScriptEnginge-objekt som finns under Microsoft.Scripting.Hosting. Den ScriptEnginge vi använder är den som finns för IronRuby. Det finns även en för IronPython.&lt;/p&gt;

&lt;p&gt;När vi har en ScriptEngine så kan vi exekvera filen som vi fick in via parametern.&lt;/p&gt;

&lt;p&gt;Sedan anropar vi klassen RubyTest och skapar en instans av den.&lt;/p&gt;

&lt;p&gt;Då variabeln ”rubytest” är satt som dynamic så kan vi anropa vilken metod som helst och kompilera, även om metoden inte är skapad än. Det kan vi se på den nedersta raden, ”rubytest.sayhello();”.&lt;/p&gt;

&lt;p&gt;Om sayhello tar emot en parameter i IronRuby-filen så kan vi skicka med den som vanligt i anropet.&lt;/p&gt;

&lt;p&gt;När vi nu kör applikationen och fyller den med text så får vi upp det här:&lt;/p&gt;

&lt;p&gt;&lt;img title="1 - Execute" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="210" alt="1 - Execute" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/1Execute_1334AAB8.png" width="509" border="0" /&gt; &lt;/p&gt;

&lt;p&gt;Vi kan alltså på ett väldigt enkelt sätt göra det möjligt för användarna av våra program att skriva script i IronRuby och andra dynamiska språk.&lt;/p&gt;

&lt;p&gt;Jag har lagt upp projektet här (kräver .NET 4.0 Beta 1 för att kunna köras):&lt;/p&gt;

&lt;p&gt;&lt;a href="http://cid-4aa13e17331c7398.skydrive.live.com/self.aspx/Public/VS%202010%20%5E0%20.NET%204.0/IronRubyConsole.rar"&gt;http://cid-4aa13e17331c7398.skydrive.live.com/self.aspx/Public/VS%202010%20%5E0%20.NET%204.0/IronRubyConsole.rar&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7223948" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BMYw-fhrWhZQLKOveVGgkLwd1PI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BMYw-fhrWhZQLKOveVGgkLwd1PI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/BMYw-fhrWhZQLKOveVGgkLwd1PI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BMYw-fhrWhZQLKOveVGgkLwd1PI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MikaelSoderstrom/~4/musc1lQlFmM" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/.NET+4.0/default.aspx">.NET 4.0</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/C_2300_+4.0/default.aspx">C# 4.0</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/IronRuby/default.aspx">IronRuby</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/VS2010/default.aspx">VS2010</category><feedburner:origLink>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/10/06/bygg-ut-dina-applikationer-med-dynamic-i-net-4-0.aspx</feedburner:origLink></item><item><title>Areor i ASP.NET MVC 2</title><link>http://feedproxy.google.com/~r/MikaelSoderstrom/~3/7UW_9KXIIhY/areor-i-asp-net-mvc-2.aspx</link><pubDate>Fri, 02 Oct 2009 19:48:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7221837</guid><dc:creator>Vimpyboy</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://weblogs.asp.net/mikaelsoderstrom/rsscomments.aspx?PostID=7221837</wfw:commentRss><wfw:comment>http://weblogs.asp.net/mikaelsoderstrom/commentapi.aspx?PostID=7221837</wfw:comment><comments>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/10/02/areor-i-asp-net-mvc-2.aspx#comments</comments><description>&lt;p&gt;När man utvecklar större webbplatser så brukar det underlätta om man kan dela upp dessa i olika areor där varje area kan handla om ett eget ämne. I ASP.NET MVC så har vi tidigare fått skapa upp en större mängd controllers med tillhörande vyer, men med ASP.NET MVC 2 så finns möjligheten att skapa dessa areor enklare.&lt;/p&gt;  &lt;p&gt;Just ”Area” har blivit ett reserverat ord i routes, så om ni använder det nu så rekommenderar jag att ni ändrar till något annat för att det inte ska krocka om ni uppgraderar. Det är fortfarande bara Preview 2, så det kan dock komma att ändras i senare versioner. Om ni minns hur det var under beta-versionerna av ASP.NET 2.0 så hette t.ex. App_Themes bara Themes, vilket gjorde att många fick problem, och därav prefixet ”App_”. Det finns en möjlighet att det här ändras, men för säkerhets skull så bör ni ändå ändra.&lt;/p&gt;  &lt;p&gt;Det som behövs för att ni ska kunna köra exemplet jag kommer att ta upp är ASP.NET MVC 2 Preview 2. I Preview 1 så fanns enbart möjligheten att skapa areor i separata projekt, men nu går det att ha dem i samma som den vanliga sidan.&lt;/p&gt;  &lt;p&gt;Vi kommer att ha två areor, Cars och Customers. Vi börjar med att skapa en mapp ”Area” som ligger i roten. I dessa lägger vi sedan till två mappar för Controllers och Views. Det blir alltså en egen uppsättning för varje area. Vi kopierar även web.config-filen från ~/Views till de båda Views-mapparna i areorna för att få med referenserna till rätt namespaces. Till slut så skapar vi en cs-fil vid namn ”Routes.cs” i roten för varje area. Dessa kommer att innehålla routes för de specifika areorna.&lt;/p&gt;  &lt;p&gt;Projektet bör se ut så här nu:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/1Project_430ABA24.png" mce_href="http://weblogs.asp.net/blogs/mikaelsoderstrom/1Project_430ABA24.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/mikaelsoderstrom/1Project_thumb_17EACE72.png" title="1 - Project" style="border: 0px none ; display: inline;" alt="1 - Project" mce_src="http://weblogs.asp.net/blogs/mikaelsoderstrom/1Project_thumb_17EACE72.png" border="0" height="358" width="171"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Nästa steg blir att skapa upp våra routes i routes.cs-filerna.&lt;/p&gt;  &lt;p&gt;För Cars så har jag detta:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.Mvc;&lt;/pre&gt;

  &lt;pre&gt;&amp;nbsp;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; Areas.Areas.Cars&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Routes : AreaRegistration&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; AreaName&lt;/pre&gt;

  &lt;pre&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;            get { &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;"cars"&lt;/span&gt;; }&lt;/pre&gt;

  &lt;pre&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; RegisterArea(AreaRegistrationContext context)&lt;/pre&gt;

  &lt;pre class="alt"&gt;        {&lt;/pre&gt;

  &lt;pre&gt;            context.MapRoute(&lt;/pre&gt;

  &lt;pre class="alt"&gt;                &lt;span class="str"&gt;"car"&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;                &lt;span class="str"&gt;"cars/{controller}/{action}"&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; { controller = &lt;span class="str"&gt;"Home"&lt;/span&gt;, action = &lt;span class="str"&gt;"Index"&lt;/span&gt; }&lt;/pre&gt;

  &lt;pre&gt;            );&lt;/pre&gt;

  &lt;pre class="alt"&gt;        }&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Och för Customers:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.Mvc;&lt;/pre&gt;

  &lt;pre&gt;&amp;nbsp;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; Areas.Areas.Customers&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Routes : AreaRegistration&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; AreaName&lt;/pre&gt;

  &lt;pre&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;            get { &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;"customers"&lt;/span&gt;; }&lt;/pre&gt;

  &lt;pre&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; RegisterArea(AreaRegistrationContext context)&lt;/pre&gt;

  &lt;pre class="alt"&gt;        {&lt;/pre&gt;

  &lt;pre&gt;            context.MapRoute(&lt;/pre&gt;

  &lt;pre class="alt"&gt;                &lt;span class="str"&gt;"customers"&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;                &lt;span class="str"&gt;"customers/{controller}/{action}/{id}"&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; { controller = &lt;span class="str"&gt;"Home"&lt;/span&gt;, action = &lt;span class="str"&gt;"Index"&lt;/span&gt;, id = &lt;span class="str"&gt;""&lt;/span&gt; }&lt;/pre&gt;

  &lt;pre&gt;            );&lt;/pre&gt;

  &lt;pre class="alt"&gt;        }&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Klasserna måste ärva AreaRegistration, och köra en override på AreaName och RegisterArea(). AreaName kommer vi att använda när vi skapar referenser mot den specifika arean, och RegisterArea körs när applikationen startas så att routen skall registreras. Utan dessa så kommer vi inte att kunna komma åt areorna.&lt;/p&gt;

&lt;p&gt;Nästa steg är att se till så att RegisterArea-metoden i de olika areorna anropas. Det gör vi genom att lägga till en rad i global.asax.&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.Mvc;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.Routing;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; Areas&lt;/pre&gt;

  &lt;pre class="alt"&gt;{&lt;/pre&gt;

  &lt;pre&gt;&amp;nbsp;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MvcApplication : System.Web.HttpApplication&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; RegisterRoutes(RouteCollection routes)&lt;/pre&gt;

  &lt;pre&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;            routes.IgnoreRoute(&lt;span class="str"&gt;"{resource}.axd/{*pathInfo}"&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&amp;nbsp;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            AreaRegistration.RegisterAllAreas();&lt;/pre&gt;

  &lt;pre&gt;&amp;nbsp;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            routes.MapRoute(&lt;/pre&gt;

  &lt;pre&gt;                &lt;span class="str"&gt;"Default"&lt;/span&gt;,                                              &lt;span class="rem"&gt;// Route name&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;                &lt;span class="str"&gt;"{controller}/{action}/{id}"&lt;/span&gt;,                           &lt;span class="rem"&gt;// URL with parameters&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; { controller = &lt;span class="str"&gt;"Home"&lt;/span&gt;, action = &lt;span class="str"&gt;"Index"&lt;/span&gt;, id = &lt;span class="str"&gt;""&lt;/span&gt; }  &lt;span class="rem"&gt;// Parameter defaults&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            );&lt;/pre&gt;

  &lt;pre&gt;&amp;nbsp;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            routes.MapRoute(&lt;span class="str"&gt;"Kunder"&lt;/span&gt;, &lt;span class="str"&gt;"kunder/{id}"&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; { id = &lt;span class="str"&gt;""&lt;/span&gt; });&lt;/pre&gt;

  &lt;pre&gt;&amp;nbsp;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&amp;nbsp;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Application_Start()&lt;/pre&gt;

  &lt;pre&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;            RegisterRoutes(RouteTable.Routes);&lt;/pre&gt;

  &lt;pre&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;    }&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;AreaRegistration.RegisterAllAreas() går igenom alla klasser i area-mappen som ärver AreaRegistration och registrerar dem.&lt;/p&gt;

&lt;p&gt;Nu har vi fungerande areor som registreras när vi startar sidan första gången. Vi har dock inget innehåll i dessa än.&lt;/p&gt;

&lt;p&gt;Härnäst så behöver vi skapa upp modellerna som skall användas. Vi skapar två filer i Models-mappen, Car.cs och Customer.cs. De ser ut som följande:&lt;/p&gt;

&lt;p&gt;Car.cs&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; Areas.Models&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Car&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; CarId { get; set; }&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Color { get; set; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Name { get; set; }&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Customer.cs:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; Areas.Models&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Customer&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; CustomerId { get; set; }&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Name { get; set; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Age { get; set; }&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Härnäst behöver vi skapa upp våra controllers, vilket vi gör på exakt samma sätt som tidigare, bara att det sker i våra areor.&lt;/p&gt;

&lt;p&gt;CarController.cs:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.Mvc;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Areas.Models;&lt;/pre&gt;

  &lt;pre&gt;&amp;nbsp;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; Areas.Areas.Cars.Controllers&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CarController : Controller&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Index()&lt;/pre&gt;

  &lt;pre&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;            List&amp;lt;Car&amp;gt; cars = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Car&amp;gt;() {&lt;/pre&gt;

  &lt;pre&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; Car() {&lt;/pre&gt;

  &lt;pre class="alt"&gt;                    CarId = 1,&lt;/pre&gt;

  &lt;pre&gt;                    Name = &lt;span class="str"&gt;"Volvo"&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre class="alt"&gt;                    Color = &lt;span class="str"&gt;"Röd"&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;                },&lt;/pre&gt;

  &lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; Car() {&lt;/pre&gt;

  &lt;pre&gt;                    CarId = 2,&lt;/pre&gt;

  &lt;pre class="alt"&gt;                    Name = &lt;span class="str"&gt;"Saab"&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;                    Color = &lt;span class="str"&gt;"Gul"&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;                },&lt;/pre&gt;

  &lt;pre&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; Car() {&lt;/pre&gt;

  &lt;pre class="alt"&gt;                    CarId = 3,&lt;/pre&gt;

  &lt;pre&gt;                    Name = &lt;span class="str"&gt;"Koenigsegg"&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre class="alt"&gt;                    Color = &lt;span class="str"&gt;"Svart"&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;                }&lt;/pre&gt;

  &lt;pre class="alt"&gt;            };&lt;/pre&gt;

  &lt;pre&gt;&amp;nbsp;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; View(cars);&lt;/pre&gt;

  &lt;pre&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;    }&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;CustomerController.cs&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.Mvc;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Areas.Models;&lt;/pre&gt;

  &lt;pre&gt;&amp;nbsp;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; Areas.Areas.Customers.Controllers&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CustomerController : Controller&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Index()&lt;/pre&gt;

  &lt;pre&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;            List&amp;lt;Customer&amp;gt; customers = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Customer&amp;gt;() {&lt;/pre&gt;

  &lt;pre&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; Customer() {&lt;/pre&gt;

  &lt;pre class="alt"&gt;                    CustomerId = 1,&lt;/pre&gt;

  &lt;pre&gt;                    Name = &lt;span class="str"&gt;"Per Persson"&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre class="alt"&gt;                    Age = 21&lt;/pre&gt;

  &lt;pre&gt;                },&lt;/pre&gt;

  &lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; Customer() {&lt;/pre&gt;

  &lt;pre&gt;                    CustomerId = 2,&lt;/pre&gt;

  &lt;pre class="alt"&gt;                    Name = &lt;span class="str"&gt;"Nils Nilsson"&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;                    Age = 53&lt;/pre&gt;

  &lt;pre class="alt"&gt;                },&lt;/pre&gt;

  &lt;pre&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; Customer() {&lt;/pre&gt;

  &lt;pre class="alt"&gt;                    CustomerId = 3,&lt;/pre&gt;

  &lt;pre&gt;                    Name = &lt;span class="str"&gt;"Santa Claus"&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre class="alt"&gt;                    Age = 1243&lt;/pre&gt;

  &lt;pre&gt;                }&lt;/pre&gt;

  &lt;pre class="alt"&gt;            };&lt;/pre&gt;

  &lt;pre&gt;&amp;nbsp;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; View(customers);&lt;/pre&gt;

  &lt;pre&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Vi högerklickar sedan i Index-metoderna och väljer att skapa vyer för dessa. Se till att välja rätt modeller för de olika vyerna!&lt;/p&gt;

&lt;p&gt;När vi länkar till en vy som ligger i en area så måste vi lägga till ett värde som specifierar vilken area som vyn tillhör.&lt;/p&gt;

&lt;p&gt;I master-sidan så lägger vi till dessa två rader för menyn:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&amp;lt;li&amp;gt;&amp;lt;%= Html.ActionLink(&lt;span class="str"&gt;"Bilar"&lt;/span&gt;, &lt;span class="str"&gt;"Index"&lt;/span&gt;, &lt;span class="str"&gt;"Car"&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; { area = &lt;span class="str"&gt;"cars"&lt;/span&gt; }, &lt;span class="kwrd"&gt;null&lt;/span&gt;)%&amp;gt;&amp;lt;/li&amp;gt;&lt;/pre&gt;

  &lt;pre&gt;&amp;lt;li&amp;gt;&amp;lt;%= Html.ActionLink(&lt;span class="str"&gt;"Kunder"&lt;/span&gt;, &lt;span class="str"&gt;"Index"&lt;/span&gt;, &lt;span class="str"&gt;"Customer"&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; { area = &lt;span class="str"&gt;"customers"&lt;/span&gt; }, &lt;span class="kwrd"&gt;null&lt;/span&gt;)%&amp;gt;&amp;lt;/li&amp;gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Genom att sätta area till namnet som vi angav i areornas routes-filer så genereras länkarna automatiskt så att de går mot dessa.&lt;/p&gt;

&lt;p&gt;Vi kan nu klicka på F5 och surfa till sidorna precis som tidigare. Det här är ett enkelt sätt att dela upp större webbplatser på så att vi kan få en bättre struktur än tidigare.&lt;/p&gt;

&lt;p&gt;Det finns för tillfället inget sätt att snabbt skapa upp en area på, men förhoppningsvis så kommer ett alternativ för att skapa upp dessa med Routes-filer, web.config och annat från början.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7221837" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/3boewHsC-gOFz2t8erm4kRQNeBc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3boewHsC-gOFz2t8erm4kRQNeBc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/3boewHsC-gOFz2t8erm4kRQNeBc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3boewHsC-gOFz2t8erm4kRQNeBc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MikaelSoderstrom/~4/7UW_9KXIIhY" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/ASP.NET+MVC+2/default.aspx">ASP.NET MVC 2</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/VS2010/default.aspx">VS2010</category><feedburner:origLink>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/10/02/areor-i-asp-net-mvc-2.aspx</feedburner:origLink></item><item><title>ASP.NET MVC 2 - Använd en separat klass för metadata</title><link>http://feedproxy.google.com/~r/MikaelSoderstrom/~3/_FNO78_w_EU/asp-net-mvc-2-anv-228-nd-en-separat-klass-f-246-r-metadata.aspx</link><pubDate>Tue, 29 Sep 2009 09:58:20 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7219839</guid><dc:creator>Vimpyboy</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://weblogs.asp.net/mikaelsoderstrom/rsscomments.aspx?PostID=7219839</wfw:commentRss><wfw:comment>http://weblogs.asp.net/mikaelsoderstrom/commentapi.aspx?PostID=7219839</wfw:comment><comments>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/09/29/asp-net-mvc-2-anv-228-nd-en-separat-klass-f-246-r-metadata.aspx#comments</comments><description>&lt;p&gt;Jag skrev tidigare om hur man kan använda metadata på modellerna för att kunna anpassa renderingen av dessa på sidorna. Jag fick en intressant kommentar på det av användaren ”BlackMustard” på aspsidan som lyder:&lt;/p&gt;  &lt;p&gt;&lt;i&gt;men går inte detta lite stick i stäv med separation of concerns-principen? nu har jag ju plötsligt attribut i min model som bestämmer hur saker ska renderas!&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;Med Dynamic Data så går detta att lösa enkelt med en metadataklass, och då jag inte har sett någon dokumentation om detta för ASP.NET MVC 2 så antog jag att de inte hade implementerat det ännu för detta. Efter att ha testat det så insåg jag att det visst fungerade, vilket gör att man på ett bättre sätt kan sätta metadata utan att behöva ändra direkt på modellen.&lt;/p&gt;  &lt;p&gt;Jag kommer att använda samma projekt som i den föregående artikeln, samt använda samma funktionalitet, men flytta ut attributen till en separat klass.&lt;/p&gt;  &lt;p&gt;Det första vi behöver göra är att ändra på Customer-klassen så att den blir partial. Det gör att vi kan lägga till information på den utan att behöva ändra i original-klassen. Kör vi med till exempel Linq to Entities så är det en genererad klass och partial som default.&lt;/p&gt;  &lt;p&gt;När vi har satt klassen som partial så ska vi skapa en ny fil (Customer_Metadata.cs), vilken kommer att innehålla vår metadata.&lt;/p&gt;  &lt;p&gt;Det vi gör är att vi tar de properties vi vill modifiera i Customer-klassen och sätter attributen på dem. Sedan kan vi ta bort attributen från original-klassen.&lt;/p&gt;  &lt;p&gt;Den partiella Customer-klass vi har skapat i den nya filen skall ha attributet ”MetadataType()”, vilken gör att vi kan sätta en klass som innehåller metadata för denna.&lt;/p&gt;  &lt;p&gt;Den nya cs-filen ser då ut så här:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.ComponentModel;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.ComponentModel.DataAnnotations;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; Customers.Models&lt;/pre&gt;

  &lt;pre class="alt"&gt;{&lt;/pre&gt;

  &lt;pre&gt;    [MetadataType(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(Customer_Metadata))]&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Customer { }&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Customer_Metadata&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        [DisplayName(&lt;span class="str"&gt;&amp;quot;Kund-ID&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; CustomerId { get; set; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;        [UIHint(&lt;span class="str"&gt;&amp;quot;CapitalString&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; FirstName { get; set; }&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Om vi kör sidan nu så ser vi att vi får exakt samma resultat som innan, utan att behöva ändra i original-Customer-klassen.&lt;/p&gt;

&lt;p&gt;Vi kan på detta sätt enkelt separera på logiken som finns i modellen och den som används för presentationen av denna.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7219839" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/bU-hoexMLZDISviEQ8qE4c0vzAU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bU-hoexMLZDISviEQ8qE4c0vzAU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/bU-hoexMLZDISviEQ8qE4c0vzAU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bU-hoexMLZDISviEQ8qE4c0vzAU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MikaelSoderstrom/~4/_FNO78_w_EU" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/ASP.NET+MVC+2/default.aspx">ASP.NET MVC 2</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/VS2010/default.aspx">VS2010</category><feedburner:origLink>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/09/29/asp-net-mvc-2-anv-228-nd-en-separat-klass-f-246-r-metadata.aspx</feedburner:origLink></item><item><title>Förstå Expression Trees</title><link>http://feedproxy.google.com/~r/MikaelSoderstrom/~3/qFHy_sbR1Qo/f-246-rst-229-expression-trees.aspx</link><pubDate>Sun, 27 Sep 2009 12:10:11 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7217862</guid><dc:creator>Vimpyboy</dc:creator><slash:comments>4</slash:comments><wfw:commentRss>http://weblogs.asp.net/mikaelsoderstrom/rsscomments.aspx?PostID=7217862</wfw:commentRss><wfw:comment>http://weblogs.asp.net/mikaelsoderstrom/commentapi.aspx?PostID=7217862</wfw:comment><comments>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/09/27/f-246-rst-229-expression-trees.aspx#comments</comments><description>&lt;p&gt;När man arbetar med data som inte ligger i objekt i minnet (vanliga POCO-collections) som t.ex. SQL så har man tidigare behövt skriva en SQL-sats som gör det man vill, vilket kan vara att hämta data, att lägga till data, att ta bort data samt att uppdatera data i databasen. Med Linq to SQL och Linq to Entities, vilka kom i .NET 3.5 respektive .NET 3.5 SP 1 så har det blivit mycket enklare.&lt;/p&gt;  &lt;p&gt;Med dessa så används ett nytt interface kallat IQueryable&amp;lt;T&amp;gt;. Detta implementerar IEnumerable, vilket vi har kunnat använda sedan länge. Skillnaden mellan IQueryable och IEnumerable är hur de behandlar datan. Anledningen till att Linq använder sig utav IQueryable är möjligheten till att använda en nyhet kallad &lt;b&gt;Expression Trees&lt;/b&gt;, vilket jag kommer att gå igenom här. &lt;/p&gt;  &lt;p&gt;För att göra det enklare att studera Expression Trees så kan jag rekommendera att du laddar ned en visualizer som följer med i CSharp Samples for Visual Studio 2008. Du kan ladda ned det här:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://code.msdn.microsoft.com/csharpsamples"&gt;http://code.msdn.microsoft.com/csharpsamples&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;När exemplen är nedladdade och uppackade så öppnar projektet som finns under &lt;i&gt;LinqSamples\ExpressionTreeVisualizer&lt;/i&gt;. Kompilera sedan ExpressionTreeVisualizer i release-läget och kopiera &lt;i&gt;ExpressionTreeVisualizer.dll&lt;/i&gt; till &lt;i&gt;Mina Dokument\Visual Studio 2008\Visualizers&lt;/i&gt;. När detta är gjort så skapar vi ett nytt projekt (jag använder ett Console-projekt) och skriver in detta:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;Expression&amp;lt;Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;bool&lt;/span&gt;&amp;gt;&amp;gt; isTenTree = x =&amp;gt; x == 10;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;När vi nu kör programmet i debug-läge, så får vi möjlighet att se hur vårt Expression Tree ser ut:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/1Visualizerknapp_4FE177C6.png"&gt;&lt;img title="1 - Visualizerknapp" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="120" alt="1 - Visualizerknapp" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/1Visualizerknapp_thumb_09F56608.png" width="523" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;När vi klickar på förstoringsglaset:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/2Visualizer_091F90CF.png"&gt;&lt;img title="2 - Visualizer" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="537" alt="2 - Visualizer" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/2Visualizer_thumb_1B0F26D6.png" width="353" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Genom att sätta vår &lt;i&gt;Func&amp;lt;&amp;gt;&lt;/i&gt; som en &lt;i&gt;Expression&amp;lt;Func&amp;lt;&amp;gt;&amp;gt;&lt;/i&gt; så har vi gjort om den till ett Expression Tree. Som ni kan se i bilden ovan så är det en trädvy.&lt;/p&gt;

&lt;p&gt;När vi skapar en Func&amp;lt;&amp;gt; så blir det en kompilerad funktion som vi kan avända oss utav direkt och köra, men när vi har en Expression&amp;lt;&amp;gt; så blir det en trädvy som måste kompileras.&lt;/p&gt;

&lt;p&gt;Hade det här bara varit en Func&amp;lt;&amp;gt; så hade vi kunnat köra det här:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;bool&lt;/span&gt;&amp;gt; isTen = x =&amp;gt; x == 10;&lt;/pre&gt;

  &lt;pre&gt;Console.WriteLine(isTen(10));&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Och fått resultatet ”True” utskrivet på skärmen.&lt;/p&gt;

&lt;p&gt;Kör vi istället med en Expression som inte är kompilerad så måste vi kompilera den för att kunna köra den. Vi kan alltså inte ta ett träd och och ställa frågor mot det direkt.&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;Expression&amp;lt;Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;bool&lt;/span&gt;&amp;gt;&amp;gt; isTenTree = x =&amp;gt; x == 10;&lt;/pre&gt;

  &lt;pre&gt;Console.WriteLine(isTenTree.Compile()(10));&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Det här ger samma resultat som koden innan. Genom att köra Compile()-metoden så kompileras vårt träd och vi kan köra det.&lt;/p&gt;

&lt;h4&gt;Varför ska man använda Expression Trees?&lt;/h4&gt;

&lt;p&gt;När man skall hämta data som inte finns i minnet på den aktuella servern så är det möjligt att vi måste skriva om koden. Det kan till exempel vara SQL som jag nämnde innan, men även till exempel Web Services (SOAP), SharePoint (CAML), JSON eller något annat. Genom att använda Expression Trees som inte är kompilerade så kan vi på ett enklare sätt läsa ut hur anropet skall se ut än om vi hade använt en kompilerad motsvarighet.&lt;/p&gt;

&lt;p&gt;Skillnaden mellan Expression&amp;lt;Func&amp;lt;&amp;gt;&amp;gt; och Func&amp;lt;&amp;gt; är alltså att det förstnämnda är en datastruktur medan det andra är kompilerad kod.&lt;/p&gt;

&lt;h4&gt;Uppbyggnaden av Expression Trees&lt;/h4&gt;

&lt;p&gt;Expression&amp;lt;T&amp;gt; har fyra properties som vi kan använda oss utav för att kunna tolka hur datan skall hämtas.&lt;/p&gt;

&lt;p&gt;Det är:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Body &lt;/li&gt;

  &lt;li&gt;Parameters&lt;/li&gt;

  &lt;li&gt;NodeType&lt;/li&gt;

  &lt;li&gt;Type&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Om vi kikar på bilden ovan så kan vi se att vi i det exemplet har:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/3VisualizerProperties_57EDEB6C.png"&gt;&lt;img title="3 - VisualizerProperties" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="537" alt="3 - VisualizerProperties" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/3VisualizerProperties_thumb_48E31E60.png" width="353" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;b&gt;1. Body&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Body är av typen ExpressionEqual, vilket beror på att vi har ”==” för jämförelsen. Hade vi istället haft ”&amp;gt;” så hade det varit GreaterThan.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;2. Parameters&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Vi skickar med en parameter kallad ”x” som är av typen Int32.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;3. NodeType&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Det vi har använt är en Lambda Expression.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;4. Type&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Typen är en Func&amp;lt;Int32, Boolean&amp;gt;, vilket stämmer överens med det vi skapade.&lt;/p&gt;

&lt;p&gt;Vi kan alltså med den här informationen se att det vi ska ha är data där den inskickade parametern x har ett värde som är lika med 10, och om så är fallet så returnerar vi true.&lt;/p&gt;

&lt;p&gt;Vi kan även använda mer avancerade exempel med fler parametrar.&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;Expression&amp;lt;Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;&amp;gt; isTenTree2 = (x, y) =&amp;gt; x + y;&lt;/pre&gt;

  &lt;pre&gt;Console.WriteLine(isTenTree2.Compile()(10, 20));&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;I det här exemplet så tar vi emot två parametrar av typen Int32 och returnerar sedan summan av dem som en Int32.&lt;/p&gt;

&lt;p&gt;Vårt Expression Tree ser nu ut på detta sätt:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/4TwoParameters_1FFFBB6A.png"&gt;&lt;img title="4 - TwoParameters" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="601" alt="4 - TwoParameters" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/4TwoParameters_thumb_0291CA19.png" width="353" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Om vi ska tolka detta så kan vi se att:&lt;/p&gt;

&lt;p&gt;&lt;b&gt;1. Body&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Body är av typen ExpressionAdd då vi summerar värdena i det.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;2. Parameters&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Vi har två parametrar, båda av typen Int32.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;3. NodeType&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;NodeType är en Lambda Expression.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;4. Type&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Typen är en Func&amp;lt;Int32, Int32, Int32&amp;gt;, då vi skickar in två Int32 och sedan returnerar en tredje.&lt;/p&gt;

&lt;h4&gt;Skapa expressions programmatiskt&lt;/h4&gt;

&lt;p&gt;Istället för att direkt ange hur vår expression skall vara uppbyggd så kan vi istället skapa den från grunden själva.&lt;/p&gt;

&lt;p&gt;För att skapa den senaste frågan ((x, y) =&amp;gt; x + y) så kan vi skriva detta:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;ParameterExpression paramX = Expression.Parameter(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(Int32), &lt;span class="str"&gt;&amp;quot;x&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;ParameterExpression paramY = Expression.Parameter(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(Int32), &lt;span class="str"&gt;&amp;quot;y&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;BinaryExpression body = Expression.Add(paramX, paramY);&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;ParameterExpression[] parameters = &lt;span class="kwrd"&gt;new&lt;/span&gt; ParameterExpression[] { paramX, paramY };&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;Expression&amp;lt;Func&amp;lt;Int32, Int32, Int32&amp;gt;&amp;gt; result = Expression.Lambda&amp;lt;Func&amp;lt;Int32, Int32, Int32&amp;gt;&amp;gt;(body, parameters);&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Det vi gör här är att vi först skapar de två parametrarna, x och y. Sedan skapar vi en BinaryExpression med dessa två parametrar. För att de skall skickas in som parametrar i vårt Expression Tree så behöver vi även ange dem när vi till sist skapar själva frågan.&lt;/p&gt;

&lt;p&gt;Om vi kompilerar och debuggar så kan vi se att vi har fått exakt samma Expression Tree som tidigare.&lt;/p&gt;

&lt;p&gt;Vi kan även läsa av dessa propertys ur det skapade Expression Tree vi har. För enkelhetens skull så har jag skapat en metod för att skriva ut innehållet:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; WriteExpression(Expression&amp;lt;Func&amp;lt;Int32, Int32, Int32&amp;gt;&amp;gt; exp)&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    Console.Clear();&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Body\n-----&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;    Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Body.NodeType: {0}&amp;quot;&lt;/span&gt;, exp.Body.NodeType.ToString());&lt;/pre&gt;

  &lt;pre class="alt"&gt;    Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Body.NodeType: {0}&amp;quot;&lt;/span&gt;, exp.Body.Type.ToString());&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    Console.WriteLine();&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    Console.WriteLine(&lt;span class="str"&gt;&amp;quot;NodeType\n-----&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;    Console.WriteLine(&lt;span class="str"&gt;&amp;quot;NodeType: {0}&amp;quot;&lt;/span&gt;, exp.NodeType.ToString());&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;    Console.WriteLine();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;    Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Parameters\n-----&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (ParameterExpression p &lt;span class="kwrd"&gt;in&lt;/span&gt; exp.Parameters)&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        Console.WriteLine(&lt;span class="str"&gt;&amp;quot;{0}&amp;quot;&lt;/span&gt;, p.Name);&lt;/pre&gt;

  &lt;pre&gt;        Console.WriteLine(&lt;span class="str"&gt;&amp;quot;\tNodeType: {0}&amp;quot;&lt;/span&gt;, p.NodeType.ToString());&lt;/pre&gt;

  &lt;pre class="alt"&gt;        Console.WriteLine(&lt;span class="str"&gt;&amp;quot;\tType: {0}&amp;quot;&lt;/span&gt;, p.Type.ToString());&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;    Console.WriteLine();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;    Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Type\n-----&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;    Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Type: {0}&amp;quot;&lt;/span&gt;, exp.Type.ToString());&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Vi tar här emot en Expression&amp;lt;Func&amp;lt;Int32, Int32, Int32&amp;gt;&amp;gt; och skriver ut innehållet ur den.&lt;/p&gt;

&lt;p&gt;När vi sedan anropar metoden med ”result” som parameter så får vi:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/5ExpressionTreeProperties_3276AE9E.png"&gt;&lt;img title="5 - ExpressionTreeProperties" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="260" alt="5 - ExpressionTreeProperties" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/5ExpressionTreeProperties_thumb_7D6CB01E.png" width="480" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Här har vi läst av alla parametrar och kan se att det är just det vi nyss skapade.&lt;/p&gt;

&lt;p&gt;För att kunna exekvera vårt Expression Tree så måste det kompileras innan det kan köras. Då det är en Expression&amp;lt;Func&amp;lt;Int32, Int32, Int32&amp;gt;&amp;gt; när det är okompilerat så blir det en Func&amp;lt;Int32, Int32, Int32&amp;gt; när det är kompilerat.&lt;/p&gt;

&lt;p&gt;Vi kan till exempel köra det så här:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;Func&amp;lt;Int32, Int32, Int32&amp;gt; summera = result.Compile();&lt;/pre&gt;

  &lt;pre&gt;Console.WriteLine(summera(1, 2));&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Resultatet blir här ”3”.&lt;/p&gt;

&lt;p&gt;De två parametrarna vi har skickat in (1 och 2) är vad som är Left och Right i ett Expression Tree.&lt;/p&gt;

&lt;p&gt;Om vi kör den här koden så får vi lätt fram den vänstra och högra sidan av ett Expression Tree:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;BinaryExpression exbody = (BinaryExpression)result.Body;&lt;/pre&gt;

  &lt;pre&gt;ParameterExpression exleft = (ParameterExpression)body.Left;&lt;/pre&gt;

  &lt;pre class="alt"&gt;ParameterExpression exright = (ParameterExpression)body.Right;&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Left: {0}&amp;quot;&lt;/span&gt;, exleft.Name);&lt;/pre&gt;

  &lt;pre&gt;Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Right: {0}&amp;quot;&lt;/span&gt;, exright.Name);&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Det här skrivet ut ”Left: x” och ”Right: y”, då det är de två parametrarna som används. Vi kan även få ut detta i Expression Tree Viewer på ett snyggt sätt:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/6LeftRightParameters_437FFDE3.png"&gt;&lt;img title="6 - LeftRightParameters" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="181" alt="6 - LeftRightParameters" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/6LeftRightParameters_thumb_0E75FF64.png" width="295" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Vi har alltså full insyn på hur vårt Expression Tree är uppbyggt.&lt;/p&gt;

&lt;h4&gt;Expression Trees != Lambda Expressions&lt;/h4&gt;

&lt;p&gt;Jag har visat upp lite exempel på Expression Trees och hur de används med Lambda Expressions, men de är inte samma sak. Vi kan använda Lambda Expressions för att skapa Expression Trees, eller så kan vi skapa dem manuellt som i det föregående exemplet. Alla Lambda Expressions kan dock ej förvandlas till Expression Trees.&lt;/p&gt;

&lt;p&gt;Ett exempel på det är:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;Action&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; PrintParameter = s =&amp;gt; { Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Parameter: {0}&amp;quot;&lt;/span&gt;, s); };&lt;/pre&gt;

  &lt;pre&gt;Expression&amp;lt;Action&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;&amp;gt; PrintParameterTree = s =&amp;gt; { Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Parameter: {0}&amp;quot;&lt;/span&gt;, s); };&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Den förstnämnda kan vi skapa utan problem, men när vi försöker skapa ett Expression Tree av den så får vi det här felmeddelandet:&lt;/p&gt;

&lt;p&gt;&lt;i&gt;A lambda expression with a statement body cannot be converted to an expression tree&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;Det är alltså två olika funktioner, men som i vissa fall kan användas tillsammans.&lt;/p&gt;

&lt;h4&gt;Linq to Entities&lt;/h4&gt;

&lt;p&gt;I det här exemplet så har jag skapat upp en enkel databas med en tabell (Customers) som har tre fält (id, FirstName, LastName). Jag har sedan skapat upp en Entity-modell med den här tabellen.&lt;/p&gt;

&lt;p&gt;Jag använder den här koden för att hämta ut alla personer där efternamnet slutar med ”son”:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;Database1Entities ent = &lt;span class="kwrd"&gt;new&lt;/span&gt; Database1Entities();&lt;/pre&gt;

  &lt;pre&gt;var customers = ent.Customers.Where(c =&amp;gt; c.LastName.EndsWith(&lt;span class="str"&gt;&amp;quot;son&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var customer &lt;span class="kwrd"&gt;in&lt;/span&gt; customers)&lt;/pre&gt;

  &lt;pre class="alt"&gt;{&lt;/pre&gt;

  &lt;pre&gt;    Console.WriteLine(customer.FirstName);&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;När vi nu debuggar så får vi fram:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/7EntitiesDebug_58FFCDEF.png"&gt;&lt;img title="7 - EntitiesDebug" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="138" alt="7 - EntitiesDebug" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/7EntitiesDebug_thumb_0CD1455E.png" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Då Linq to Entities är uppbyggt med Expression Trees så kan vi få fram hur det är uppbyggt när frågan ställs. Klicka på förstoringsglaset för att få fram visualizern:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/8EntitiesDebugVisualizer_2A98FEE2.png"&gt;&lt;img title="8 - EntitiesDebugVisualizer" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="844" alt="8 - EntitiesDebugVisualizer" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/8EntitiesDebugVisualizer_thumb_53F90656.png" width="602" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Vi kan se här att det precis som tidigare är ett vanligt Expression Tree, vilket vi skulle kunna bygga dynamiskt om vi vill. Vi behöver alltså inte använda Linq-frågor, eller Lambda Expressions, utan vi kan själva generera det här trädet och på så vis ställa egna frågor.&lt;/p&gt;

&lt;p&gt;Om vi ser vilken Type som används (längst ned i bilden) så ser vi att det är en IQueryable&amp;lt;Customers&amp;gt;, vilket gör det möjligt att skapa upp detta Expression Tree. Hade vi kört frågan mot vanliga POCO-objekt så hade vi istället använt en IEnumerable&amp;lt;Customers&amp;gt; då frågorna inte behöver skrivas om.&lt;/p&gt;

&lt;p&gt;Då det är ett Expression Tree som lätt kan tolkas så gör det att Entity Framework lätt kan använda SQL Server-providern för att skriva om detta till en lämplig SQL-sats. För att gå ett steg längre i felsökningen så kan vi ladda ned en visualizer för det. Ni hittar en här:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://visualstudiogallery.msdn.microsoft.com/en-us/99468ece-689b-481c-868c-19e00e0a4e69"&gt;http://visualstudiogallery.msdn.microsoft.com/en-us/99468ece-689b-481c-868c-19e00e0a4e69&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ladda ned dll-filen och lägg i Visualizers-mappen precis som tidigare och starta om Visual Studio. När vi sedan debuggar koden igen så får vi fram det här:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/9EntityVisualizer_3B28D1D2.png"&gt;&lt;img title="9 - EntityVisualizer" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="52" alt="9 - EntityVisualizer" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/9EntityVisualizer_thumb_25640AD7.png" width="556" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Och när vi klickar där:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/10EntityVisualizerView_2904B665.png"&gt;&lt;img title="10 - EntityVisualizerView" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="554" alt="10 - EntityVisualizerView" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/10EntityVisualizerView_thumb_58B51584.png" width="763" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Här kan vi enkelt se att vårt Expression Tree har översatts till:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;[Extent1].[id] &lt;span class="kwrd"&gt;AS&lt;/span&gt; [id], &lt;/pre&gt;

  &lt;pre class="alt"&gt;[Extent1].[FirstName] &lt;span class="kwrd"&gt;AS&lt;/span&gt; [FirstName], &lt;/pre&gt;

  &lt;pre&gt;[Extent1].[LastName] &lt;span class="kwrd"&gt;AS&lt;/span&gt; [LastName]&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;FROM&lt;/span&gt; [dbo].[Customers] &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Extent1]&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;WHERE&lt;/span&gt; (&lt;span class="kwrd"&gt;RIGHT&lt;/span&gt;([Extent1].[LastName], &lt;span class="kwrd"&gt;CAST&lt;/span&gt;(LEN(N&lt;span class="str"&gt;'son'&lt;/span&gt;) &lt;span class="kwrd"&gt;AS&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt;))) = N&lt;span class="str"&gt;'son'&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Det här är den stora fördelen med Expression Trees, det är alltså möjligt att enkelt skriva om dessa till något som kan tolkas av systemet det kopplas mot.&lt;/p&gt;

&lt;h4&gt;Nyhet i .NET 4.0 – Skapa dynamiska metoder&lt;/h4&gt;

&lt;p&gt;En nyhet som kommer i .NET 4.0 är att vi på ett smidigt (allt är relativt..) sätt kan skapa dynamiska metoder. Tidigare så har vi varit tvungna att använda System.Reflection.Emit för att göra detta, vilket gör att vi hamnar i ”OpCode hell”. Med .NET 4.0 så går det att lösa mycket smidigare.&lt;/p&gt;

&lt;p&gt;För att köra det här så behöver du Visual Studio 2010 och .NET 4.0.&lt;/p&gt;

&lt;p&gt;Till skillnad från .NET 3.5 där vi har Expression Trees och därmed kan skapa Expressions med kod, så har vi i .NET 4.0 även stöd för Statement Trees. Med dessa kan vi dynamiskt skapa metoder utan att behöva blanda in IL.&lt;/p&gt;

&lt;p&gt;Metoden vi kommer att skapa nu motsvarar det här:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; DynamicMethod(&lt;span class="kwrd"&gt;int&lt;/span&gt; parameter)&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt; = 0;&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;do&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; &amp;lt; 10)&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;value&lt;/span&gt; += parameter;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;    } &lt;span class="kwrd"&gt;while&lt;/span&gt; (&lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Vi kommer att skicka in en parameter med värdet ”3” till den här metoden. Sedan körs en loop till dess att if-satsen inte är giltig längre. Om vi kör den här koden kommer resultatet att bli ”12”.&lt;/p&gt;

&lt;p&gt;Motsvarande med Statement Expressions är detta:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="rem"&gt;// Skapa en ParameterExpression som tillhandahåller det inskickade värdet&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;ParameterExpression parameter = Expression.Parameter(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;int&lt;/span&gt;), &lt;span class="str"&gt;&amp;quot;parameter&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="rem"&gt;// Det lokala värdet som finns i bodyn i vår metod&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;ParameterExpression localvalue = Expression.Parameter(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;int&lt;/span&gt;), &lt;span class="str"&gt;&amp;quot;localvalue&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="rem"&gt;// En label för att kunna gå ut ur loopen&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;LabelTarget target = Expression.Label(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;int&lt;/span&gt;));&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="rem"&gt;// Den dynamiska metodens body&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;BlockExpression block = Expression.Block(&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="rem"&gt;// Skapar en lokal variabel i scopet&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;new&lt;/span&gt;[] { localvalue },&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="rem"&gt;// Sätter värdet på localvalue till 0&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    Expression.Assign(localvalue, Expression.Constant(0)),&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    Expression.Loop(&lt;/pre&gt;

  &lt;pre&gt;        Expression.IfThenElse(&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="rem"&gt;// Testar om value &amp;lt; 10&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;            Expression.LessThan(localvalue, Expression.Constant(10, &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(Int32))),&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="rem"&gt;// Om sant så lägg till det inskickade värdet&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            Expression.AddAssign(localvalue, parameter),&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="rem"&gt;// Om falskt så gå ut ur loopen&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;            Expression.Break(target, localvalue)&lt;/pre&gt;

  &lt;pre class="alt"&gt;        ),&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="rem"&gt;// Gå ut ur loopen genom att gå till labeln&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        target&lt;/pre&gt;

  &lt;pre&gt;    )&lt;/pre&gt;

  &lt;pre class="alt"&gt;);&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="rem"&gt;// Spara ned ett expression tree&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;Expression&amp;lt;Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;&amp;gt; dynamicmethod = Expression.Lambda&amp;lt;Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;&amp;gt;(block, parameter);&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Parametern som skapas i början är den som skickas in i metoden. Sedan skapar vi en lokal variabel som är den som vi i det tidigare exemplet kallar för ”value”. Efter det skapar vi en label, vilket motsvarar break;. Vi får använda denna label för att berätta att vi ska ut ur loopen när villkoret inte är giltigt längre, annars får vi en evighetsloop.&lt;/p&gt;

&lt;p&gt;Efter det kommer något som är nytt i C# 4.0, nämligen en BlockExpression, vilket gör det möjligt att skapa kodblock med egen logik i. I det här exemplet så har vi i den själva loopen med en if-sats i.&lt;/p&gt;

&lt;p&gt;Vi kan alltså med hjälp av Statement Expressions generera kod i C# som vi sedan kan kompilera med &lt;i&gt;dynamicmethod.Compile()&lt;/i&gt; och efter det anropa den precis som tidigare.&lt;/p&gt;

&lt;h4&gt;Sammanfattning&lt;/h4&gt;

&lt;p&gt;Expressions är otroligt kraftfulla verktyg för att kunna generera kod, antingen för att kunna kompilera till något annat språk som SQL, eller till C# eller ett dynamiskt språk (DLR använder Statement Expressions väldigt mycket för att generera kod).&lt;/p&gt;

&lt;p&gt;I C# 5.0 är det även sagt att det ska bli mer &lt;i&gt;Compiler as a Service&lt;/i&gt;, så vi lär definitivt se mer av detta framöver.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7217862" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Iilf5R5G7AwWwJ4ndnrS6Sgakmk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Iilf5R5G7AwWwJ4ndnrS6Sgakmk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Iilf5R5G7AwWwJ4ndnrS6Sgakmk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Iilf5R5G7AwWwJ4ndnrS6Sgakmk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MikaelSoderstrom/~4/qFHy_sbR1Qo" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/C_2300_+4.0/default.aspx">C# 4.0</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/VS2010/default.aspx">VS2010</category><feedburner:origLink>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/09/27/f-246-rst-229-expression-trees.aspx</feedburner:origLink></item><item><title>Introduktion till ASP.NET MVC 2</title><link>http://feedproxy.google.com/~r/MikaelSoderstrom/~3/kOdsRy-6J9s/introduktion-till-asp-net-mvc-2.aspx</link><pubDate>Thu, 24 Sep 2009 19:18:26 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7215870</guid><dc:creator>Vimpyboy</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://weblogs.asp.net/mikaelsoderstrom/rsscomments.aspx?PostID=7215870</wfw:commentRss><wfw:comment>http://weblogs.asp.net/mikaelsoderstrom/commentapi.aspx?PostID=7215870</wfw:comment><comments>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/09/24/introduktion-till-asp-net-mvc-2.aspx#comments</comments><description>&lt;p&gt;Inte alls långt efter att ASP.NET MVC släpptes som RTW så kom preview 1 av ASP.NET MVC 2. Precis som olika versioner av .NET så kommer dock inte kunskapen från tidigare versionen att vara bortkastad, utan tvärtom, du kommer att ha stor nytta av det. Om du inte har arbetat med ASP.NET MVC tidigare så rekommenderar jag att du börjar med min introduktionsartikel som du hittar här:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/mikaelsoderstrom/archive/2009/04/02/kom-ig-229-ng-med-asp-net-mvc.aspx"&gt;http://weblogs.asp.net/mikaelsoderstrom/archive/2009/04/02/kom-ig-229-ng-med-asp-net-mvc.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Det jag kommer att ta upp i den här artikeln är starkt typade helpers-funktioner och templates. Om du tidigare har använt Dynamic Data (kom med .NET 3.5 SP 1) så kommer du säkert att känna templates-exemplen som jag kommer att gå igenom. Om du inte har kikat på Dynamic Data så kan jag rekommendera att du skapar ett testprojekt där och labbar lite med t.ex. UIHint() för att få bättre förståelse för vad det kan göra.&lt;/p&gt;  &lt;p&gt;Värt att tänka på är att artikeln tar upp preview 1 av ASP.NET MVC 2, och för er som var med i de första förhandsvisningarna av ASP.NET MVC 1 vet säkert att det var mycket som förändrades, så när senare previews av ASP.NET MVC 2 släpps så kan mycket i artikeln vara förändrat. Men nog om det, dags att programmera! :-)&lt;/p&gt;  &lt;p&gt;Det första som behövs är ASP.NET MVC 2 Preview 1, det hittar ni här:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=d34f9eaa-fcbe-4e20-b2fd-a9a03de7d6dd#tm"&gt;http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=d34f9eaa-fcbe-4e20-b2fd-a9a03de7d6dd#tm&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;När det är installerat så börjar vi med att skapa ett projekt.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/1_6614B8E5.png"&gt;&lt;img title="1" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="493" alt="1" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/1_thumb_02DF612B.png" width="687" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Lägg märke till att det är .NET 3.5 som används här. Den slutgiltiga versionen kommer att finnas inbyggt i .NET 4.0, men för .NET 3.5 så kommer vi att behöva installera det separat. Om vi kör .NET 3.5 så får vi ingen möjlighet till att köra alla nya funktioner som kommer med .NET 4.0, så vill vi få ut det mesta så rekommenderar jag att du kör med den senare.&lt;/p&gt;  &lt;p&gt;När vi nu har vårt projekt så ska vi fortsätta med att skapa en controller som skall användas i exemplet. Projektet har jag givit namnet ”Customers” då det kommer att lista olika kunder. Vi skapar därför en controller vid namn ”CustomersController”. Vi kommer att ha tre olika vyer kopplade till denna, och skapar därmed ActionResults för List, Details och Edit.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/3_263AF84F.png"&gt;&lt;img title="3" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="163" alt="3" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/3_thumb_7D579558.png" width="394" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult List()&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; View(GetCustomers());&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="rem"&gt;//&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="rem"&gt;// GET: /Customers/Details/5&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Details(&lt;span class="kwrd"&gt;int&lt;/span&gt; id)&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    Customer customer = GetCustomers().Where(c =&amp;gt; c.CustomerId == id).SingleOrDefault();&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; View(customer);&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="rem"&gt;//&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="rem"&gt;// GET: /Customers/Edit/5&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Edit(&lt;span class="kwrd"&gt;int&lt;/span&gt; id)&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    Customer customer = GetCustomers().Where(c =&amp;gt; c.CustomerId == id).SingleOrDefault();&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; View(customer);&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;För att slippa hämta data från en databas nu så kör vi en liten fuling och lägger till den här metoden i samma klass:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; List&amp;lt;Customer&amp;gt; GetCustomers()&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    List&amp;lt;Customer&amp;gt; customers = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Customer&amp;gt;();&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    customers.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; Customer()&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        CustomerId = 1,&lt;/pre&gt;

  &lt;pre&gt;        FirstName = &lt;span class="str"&gt;&amp;quot;Sven&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre class="alt"&gt;        LastName = &lt;span class="str"&gt;&amp;quot;Svensson&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;        Birthday = &lt;span class="kwrd"&gt;new&lt;/span&gt; DateTime(1900, 01, 01)&lt;/pre&gt;

  &lt;pre class="alt"&gt;    });&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    customers.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; Customer()&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        CustomerId = 2,&lt;/pre&gt;

  &lt;pre&gt;        FirstName = &lt;span class="str"&gt;&amp;quot;Nils&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre class="alt"&gt;        LastName = &lt;span class="str"&gt;&amp;quot;Nilsson&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;        Birthday = &lt;span class="kwrd"&gt;new&lt;/span&gt; DateTime(1948, 10, 22)&lt;/pre&gt;

  &lt;pre class="alt"&gt;    });&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    customers.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; Customer()&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        CustomerId = 3,&lt;/pre&gt;

  &lt;pre&gt;        FirstName = &lt;span class="str"&gt;&amp;quot;Petter&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre class="alt"&gt;        LastName = &lt;span class="str"&gt;&amp;quot;Pettersson&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;        Birthday = &lt;span class="kwrd"&gt;new&lt;/span&gt; DateTime(1940, 05, 12)&lt;/pre&gt;

  &lt;pre class="alt"&gt;    });&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; customers;&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;För att det skall fungera så måste vi även skapa en klass i Models-mappen vid namn Customer.cs och som är modellen vi kommer att använda oss utav. Det är en enkel klass med olika properties för CustomerId, FirstName, LastName och Birthday.&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Customer&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; CustomerId { get; set; }&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; FirstName { get; set; }&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; LastName { get; set; }&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; DateTime Birthday { get; set; }&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Nästa steg är att skapa vyerna för kunderna. Vi skapar en mapp i Views-mappen vid namn Customers. Där skapar vi tre vyer som använder Customer-klassen. Det bör se ut i stil med det här:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/2_4635B972.png"&gt;&lt;img title="2" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="377" alt="2" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/2_thumb_3C06AFB6.png" width="351" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;För att se listningen i menyn så lägger vi slutligen till det här i master-sidan:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;li&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;= Html.ActionLink(&lt;span class="str"&gt;&amp;quot;Customers&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;List&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Customers&amp;quot;&lt;/span&gt;)&lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;li&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Om vi kör sidan nu så kan vi se att vi kan se sidor för listning, detaljer och ändringar.&lt;/p&gt;

&lt;p&gt;Som det ser ut nu så är det inget som skiljer sig från ASP.NET MVC 1, så det vi gör nu är att öppna upp Details.aspx. Här kommer vi att använda oss utav de hårt typade metoderna LabelFor() och EditorFor(). Dessa gör det möjligt att enkelt använda oss utav templates och data annotations för att modifiera utseendet.&lt;/p&gt;

&lt;p&gt;Istället för en label för fältnamnet så kommer vi att använda Html.LabelFor():&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;= Html.LabelFor(c =&amp;gt; c.CustomerId) &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Och för textrutorna så kommer vi att använda Html.EditorFor():&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&amp;lt;%= Html.EditorFor(c =&amp;gt; c.CustomerId) %&amp;gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Ser vi på sidan nu så ser vi ingen skillnad. Det vi vill göra är att istället för CustomerId skriva ut Kund-ID på alla ställen där vi använder LabelFor() för det fältet.&lt;/p&gt;

&lt;p&gt;Det vi gör nu är att vi öppnar upp Customer.cs i Models-mappen. Här ska vi använda DisplayName-attributet för att ändra vilken text som visas.&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;[DisplayName(&lt;span class="str"&gt;&amp;quot;Kund-ID&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; CustomerId { get; set; }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Det som händer nu är att vi istället för ”CustomerId” faktiskt får upp ”Kund-ID” på sidan! Det här gör att vi på ett väldigt enkelt sätt kan anpassa utseendet för de olika fälten i modellen. Värt att notera är dock att vi inte kan använda lokalisering i det här attributet, utan då få vi istället lösa det på ett annat sätt.&lt;/p&gt;

&lt;p&gt;Nästa funktion som vi ska använda är något annat som användes flitigt med Dynamic Data, nämligen UIHint-attributet. Skillnaden från DisplayName är att det kan användas för att skapa anpassade kontroller för olika fält. Flera fält kan använda sig utav samma UIHint-kontroll.&lt;/p&gt;

&lt;p&gt;Som exempel så kommer jag att skapa en MVC View User Control vid namn ”CapitalString.ascx”. Det kontrollen kommer att göra är att köra .ToUpper() på alla strängar som använder denna. Vi lägger denna i en ny mapp under Shared som vi kallar för DisplayTemplates (går även att skapa EditTemplates om man vill göra om fälten som används i Edit-läget).&lt;/p&gt;

&lt;p&gt;Utseendet för denna ser ut som följande:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="asp"&gt;&amp;lt;%@ Control Language=&amp;quot;C#&amp;quot; Inherits=&amp;quot;System.Web.Mvc.ViewUserControl&amp;lt;string&amp;gt;&amp;quot; %&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;= Model.ToUpper() &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Kontrollen förväntar sig här att det som tas emot är av typen string, vilket vi anger i Inherits-attributet. Model i det här fallet är det värdet (eller den mer avancerade typen om vi har angett en sådan).&lt;/p&gt;

&lt;p&gt;För att applicera denna på ett fält (i det här fallet FirstName”) så lägger vi till UIHint-attributet med namnet på kontrollen som parameter på FirstName-propertyn:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;[UIHint(&lt;span class="str"&gt;&amp;quot;CapitalString&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; FirstName { get; set; }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Om vi nu går till en Details-sida så kommer vi se att det står till exempel SVEN istället för Sven.&lt;/p&gt;

&lt;p&gt;Vi kan även skapa templates som gäller för alla instanser av den aktuella typen. Det vi ska göra är att byta ut alla DateTime-fält mot antalet år sedan det aktuella datumet så kan vi skapa en kontroll med namnet DateTime.ascx och lägga i DisplayTemplates-mappen. Då DateTime är en value type och vi bara kan skicka med en reference type till ViewUserControl&amp;lt;T&amp;gt; så måste vi använda den ickegeneriska varianten och sedan typa om modellen till en DateTime.&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="asp"&gt;&amp;lt;%@ Control Language=&amp;quot;C#&amp;quot; Inherits=&amp;quot;System.Web.Mvc.ViewUserControl&amp;quot; %&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;= DateTime.Now.AddYears(-((DateTime)Model).Year).Year&lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Det är inte ett helt klockrent sätt att räkna år på, men får duga för det aktuella syftet.&lt;/p&gt;

&lt;p&gt;Om vi nu går till en Details-sida så ser vi istället för datumet antal år som har gått sedan det.&lt;/p&gt;

&lt;p&gt;Det går med dessa funktioner att skapa delar av sidan som enkelt kan appliceras på ett flertal (eller alla som i DateTime-exemplet) ställen på sidan genom att helt enkelt ändra i en enda fil.&lt;/p&gt;

&lt;p&gt;Det här kan vara väldigt användbart när man skall hantera mycket data på sidan och behöver lista samma sak på flera ställen. På det här viset så slipper man ändra på alla olika ställen, utan anger bara med UIHint vilken template som skall användas.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7215870" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2vkzXo8ej8YYKdTDlnujqkxVg_U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2vkzXo8ej8YYKdTDlnujqkxVg_U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/2vkzXo8ej8YYKdTDlnujqkxVg_U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2vkzXo8ej8YYKdTDlnujqkxVg_U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MikaelSoderstrom/~4/kOdsRy-6J9s" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/ASP.NET+MVC/default.aspx">ASP.NET MVC</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/ASP.NET+MVC+2/default.aspx">ASP.NET MVC 2</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/VS2010/default.aspx">VS2010</category><feedburner:origLink>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/09/24/introduktion-till-asp-net-mvc-2.aspx</feedburner:origLink></item></channel></rss>
