<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Alkampfer&#039;s Place&#187; Asp.Net MVC</title>
	<atom:link href="http://www.codewrecks.com/blog/index.php/category/net-framework/aspnet-mvc/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.codewrecks.com/blog</link>
	<description>Wrecks of code floating in the sea of Internet By Ricci Gian Maria</description>
	<lastBuildDate>Wed, 08 Feb 2012 17:49:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2</generator>
		<item>
		<title>Decouple controllers and other objects from context in asp.net mvc</title>
		<link>http://www.codewrecks.com/blog/index.php/2009/04/20/decouple-controllers-and-other-objects-from-context-in-aspnet-mvc/</link>
		<comments>http://www.codewrecks.com/blog/index.php/2009/04/20/decouple-controllers-and-other-objects-from-context-in-aspnet-mvc/#comments</comments>
		<pubDate>Mon, 20 Apr 2009 17:35:38 +0000</pubDate>
		<dc:creator>alkampfer</dc:creator>
				<category><![CDATA[Asp.Net MVC]]></category>

		<guid isPermaLink="false">http://www.codewrecks.com/blog/index.php/2009/04/20/decouple-controllers-and-other-objects-from-context-in-aspnet-mvc/</guid>
		<description><![CDATA[When I decided to write down a little class to manage a menu, I created a simple object that reads the menu data in xml, and transform it into a series of MenuItem object. The first thing I wanted to do is writing some test to verify that the logic is ok, but since my [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a target="_blank" href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.codewrecks.com%2Fblog%2Findex.php%2F2009%2F04%2F20%2Fdecouple-controllers-and-other-objects-from-context-in-aspnet-mvc%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.codewrecks.com%2Fblog%2Findex.php%2F2009%2F04%2F20%2Fdecouple-controllers-and-other-objects-from-context-in-aspnet-mvc%2F&amp;source=alkampfer&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>When I decided to write down a little class to manage a <a href="http://www.codewrecks.com/blog/index.php/2009/04/14/build-a-menu-for-aspnet-mvc-site/">menu</a>, I created a simple object that reads the menu data in xml, and transform it into a series of MenuItem object. The first thing I wanted to do is writing some <a title="test" href="http://www.codewrecks.com/blog/index.php/2007/09/03/test/">test</a> to verify that the logic is ok, but since my class uses Url.RouteUrl to build the url from the controller and action strings, <a title="testing" href="http://www.codewrecks.com/blog/index.php/category/programming/testing/">testing</a> becomes difficult, because it does not runs outside iis.</p>
<p>You can surely mock controller context in <a title="asp.net mvc" href="http://www.codewrecks.com/blog/index.php/category/net-framework/aspnet-mvc/">asp.net mvc</a>, and there are a lot of good articles in the net dealing with this, but sometimes I prefer a simpler approach that I used a lot in classic webform <a title="asp.net" href="http://www.codewrecks.com/blog/index.php/category/net-framework/aspnet/">asp.net</a> applications. Since the class that contains the logic to format the menu needs only to access the UrlHelper class, I abstracted it with a simple interface.</p>
<p>
<div class="wlWriterEditableSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:2add559c-884d-4db4-97a7-270932bbc0f7" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">interface</span><span style="color: #000000;"> IUrlHelper
{
   String RouteUrl(RouteValueDictionary values);
   String RouteUrl(Object values);
   String RouteUrl(String routeName, Object values);
}</span></pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
</p>
<p>This simple interface does not even contains all methods of the standard UrlHelper, but it is enough for me, Iâ€™ll add more methods when Iâ€™ll need them. Now my class can declare a dependency to this interface.</p>
<div class="wlWriterEditableSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:1f7c6016-6745-40bc-915b-a7eb32076aa9" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #000000;">   </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> MasterLogic
   {
      </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> IUrlHelper Url { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; }

      </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> MasterLogic(IUrlHelper url)
      {
         Url </span><span style="color: #000000;">=</span><span style="color: #000000;"> url;
      }</span></pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p>then create the real object that will be used in the site. It is a simple wrapper for the real UrlHelper </p>
<div class="wlWriterEditableSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:01e935e2-946c-4743-baed-e0768162a57b" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #000000;">   </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> MvcRouteHelper : IUrlHelper
   {
      </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> UrlHelper Helper { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; }

      </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> MvcRouteHelper(UrlHelper helper)
      {
         Helper </span><span style="color: #000000;">=</span><span style="color: #000000;"> helper;
      }

      </span><span style="color: #0000FF;">#region</span><span style="color: #000000;"> IUrlHelper Members</span><span style="color: #000000;">

      </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> RouteUrl(System.Web.Routing.RouteValueDictionary values)
      {
         </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> Helper.RouteUrl(values);
      }

      </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> String RouteUrl(Object values)
      {
         </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> Helper.RouteUrl(values);
      }

      </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> RouteUrl(</span><span style="color: #0000FF;">string</span><span style="color: #000000;"> routeName, </span><span style="color: #0000FF;">object</span><span style="color: #000000;"> values)
      {
         </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> Helper.RouteUrl(routeName, values);
      }

      </span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">
   }</span></pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p>Now the controller that uses MasterLogic class can create instance with this simple code.</p>
<div class="wlWriterEditableSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:dcd7fd51-ab5d-471a-83a2-5d7d9a518fc7" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #000000;">masterLogic </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> MasterLogic(</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> MvcRouteHelper(Url))</span></pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p>For <a title="testing" href="http://www.codewrecks.com/blog/index.php/category/programming/testing/">testing</a> purpose I created another class that implements the IUrlHelper interface.</p>
<div class="wlWriterEditableSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:3cc7edbf-998c-40e5-bb1d-1fb82005af82" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #0000FF;">private</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> MyTestUrlHelper : IUrlHelper
{

   </span><span style="color: #0000FF;">#region</span><span style="color: #000000;"> IUrlHelper Members</span><span style="color: #000000;">

   </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> RouteUrl(RouteValueDictionary values)
   {
      </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> RouteUrl((IDictionary</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">String, Object</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">)values);
   }

   </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> RouteUrl(</span><span style="color: #0000FF;">object</span><span style="color: #000000;"> values)
   {
      IDictionary</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">String, Object</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> dic </span><span style="color: #000000;">=</span><span style="color: #000000;"> (IDictionary</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">String, Object</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">) values;
      </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">/</span><span style="color: #800000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> dic[</span><span style="color: #800000;">"</span><span style="color: #800000;">controller</span><span style="color: #800000;">"</span><span style="color: #000000;">] </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">/</span><span style="color: #800000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> dic[</span><span style="color: #800000;">"</span><span style="color: #800000;">action</span><span style="color: #800000;">"</span><span style="color: #000000;">];
   }

   </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> RouteUrl(</span><span style="color: #0000FF;">string</span><span style="color: #000000;"> routeName, </span><span style="color: #0000FF;">object</span><span style="color: #000000;"> values)
   {
      </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> RouteUrl(values);
   }

   </span><span style="color: #0000FF;">#endregion</span><span style="color: #000000;">
}</span></pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p>It basically created url with a fixed rule, but the important thing that now I can <a title="test" href="http://www.codewrecks.com/blog/index.php/2007/09/03/test/">test</a> MasterLogic without worrying about someone changing routes, since I can inject my MyTestUrlHelper class into my MasterLogic class, here is a test.</p>
<div class="wlWriterEditableSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:e34dfc2b-b923-41ba-aeeb-8e68ba7b9caf" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #000000;">[Test]
</span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> GrabMenuWithActionUrl()
{
   MasterLogic sut </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> MasterLogic(</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> MyTestUrlHelper());
   List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">MenuItem</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> menu </span><span style="color: #000000;">=</span><span style="color: #000000;"> sut.CreateMenu(</span><span style="color: #800000;">"</span><span style="color: #800000;">SampleFiles\MenuType1.Xml</span><span style="color: #800000;">"</span><span style="color: #000000;">).MenuItems;
   Assert.That(menu, Has.Count(</span><span style="color: #800080;">2</span><span style="color: #000000;">));
   Assert.That(menu[</span><span style="color: #800080;">1</span><span style="color: #000000;">].MenuItems[</span><span style="color: #800080;">0</span><span style="color: #000000;">], Has.Property(</span><span style="color: #800000;">"</span><span style="color: #800000;">Url</span><span style="color: #800000;">"</span><span style="color: #000000;">, </span><span style="color: #800000;">"</span><span style="color: #800000;">/Photo/ManageAlbum</span><span style="color: #800000;">"</span><span style="color: #000000;">));
}</span></pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p>You can complain that this is not mvc style of decoupling logic from the context, mvc has introduced the <a target="_blank" href="http://msdn.microsoft.com/it-it/library/system.web.httpcontextbase.aspx">System.Web.Abstractions</a> namespace for doing this, but I still prefer this â€œold styleâ€ solution, because it works perfectly even for webforms. In classic <a title="asp.net" href="http://www.codewrecks.com/blog/index.php/category/net-framework/aspnet/">asp.net</a> applications when I need to access Session, or querystring or other context related data, I prefer to abstract everything with interfaces, so I can test outside the pipeline of IIS with little problem. The conclusion is that: if you want your classes to be testable, you should abstract every dependency with an interface, and not declare dependency to any concrete class.</p>
<p>alk.</p>
<p>Tags: <a target="_blank" href="http://technorati.com/tag/asp.net mvc" rel="tag">asp.net mvc</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.codewrecks.com/blog/index.php/2009/04/20/decouple-controllers-and-other-objects-from-context-in-aspnet-mvc/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Asp.net Mvc plus jQuery client template engine .. have fun with them</title>
		<link>http://www.codewrecks.com/blog/index.php/2009/04/15/aspnet-mvc-plus-jquery-client-template-engine-have-fun-with-them/</link>
		<comments>http://www.codewrecks.com/blog/index.php/2009/04/15/aspnet-mvc-plus-jquery-client-template-engine-have-fun-with-them/#comments</comments>
		<pubDate>Wed, 15 Apr 2009 17:44:14 +0000</pubDate>
		<dc:creator>alkampfer</dc:creator>
				<category><![CDATA[Asp.Net MVC]]></category>
		<category><![CDATA[JQuery]]></category>

		<guid isPermaLink="false">http://www.codewrecks.com/blog/index.php/2009/04/15/aspnet-mvc-plus-jquery-client-template-engine-have-fun-with-them/</guid>
		<description><![CDATA[jQuery has really a lot of interesting plugins, but the one I like most is a template engine called jtemplates. Basically it consist of a jQuery extension that is capable of rendering html with javascript on client machine. You really have a lot of flexibility on how to specify a template, basically you can embed [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a target="_blank" href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.codewrecks.com%2Fblog%2Findex.php%2F2009%2F04%2F15%2Faspnet-mvc-plus-jquery-client-template-engine-have-fun-with-them%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.codewrecks.com%2Fblog%2Findex.php%2F2009%2F04%2F15%2Faspnet-mvc-plus-jquery-client-template-engine-have-fun-with-them%2F&amp;source=alkampfer&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><a target="_blank" title="jQuery" href="http://www.codewrecks.com/blog/index.php/category/frameworks/jquery/">jQuery</a> has really a lot of interesting plugins, but the one I like most is a template engine called <a href="http://jtemplates.tpython.com/">jtemplates</a>. Basically it consist of a <a target="_blank" title="jQuery" href="http://www.codewrecks.com/blog/index.php/category/frameworks/jquery/">jQuery</a> extension that is capable of rendering html with <a title="javascript" href="http://www.codewrecks.com/blog/index.php/tag/javascript/">javascript</a> on client machine. You really have a lot of flexibility on how to specify a template, basically you can embed it into an <a href="http://jtemplates.tpython.com/example2.html">hidden textarea</a>, the one you see in the above sample is created in this way</p>
<p>
<div class="wlWriterEditableSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:b9d4c7d7-1317-4e93-a6d4-6c671210f673" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #000000;">    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">textarea </span><span style="color: #FF0000;">id</span><span style="color: #0000FF;">="template"</span><span style="color: #FF0000;"> style</span><span style="color: #0000FF;">="display:none"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
        </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">div</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">{$T.name}: {$T.list_id} [{$P.lang.language}]</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">div</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
        </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">table</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
            </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">thead </span><span style="color: #FF0000;">style</span><span style="color: #0000FF;">="font-weight: bold"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">tr</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
                    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">td</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">{$P.lang['name']}</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
                    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">td</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">{$P.lang['mail']}</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">tr</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
            </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">thead</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
            </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">tbody</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
                {#foreach $T.table as record}
                </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">tr</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
                        </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">td</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">{$T.record.name}</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
                        </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">td</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">{$T.record.mail}</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
                </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">tr</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
                {#/for}
            </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">tbody</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
        </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">table</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">textarea</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
</span></pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
</p>
<p>As you can see jtemplates has a simple syntax to render data where $T identify the object that contains data to be rendered. The template engine supports many constructs: foreach, if, and many other ones. To actually render something you need to assign the above template to a div:</p>
<p><div class="wlWriterEditableSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:bc606ecc-0405-4920-bf07-b4bdec08d7be" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #000000;">$(</span><span style="color: #000000;">"</span><span style="color: #000000;">.jTemplatesTest</span><span style="color: #000000;">"</span><span style="color: #000000;">).setTemplateElement(</span><span style="color: #000000;">"</span><span style="color: #000000;">template</span><span style="color: #000000;">"</span><span style="color: #000000;">);
</span></pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
</p>
<p>Assigning a template is just a matter of selecting a wrapped-set and then assign the template passing the id of the textarea that contains the template. Now the div has a template assigned, to render something you need only to fire the template engine passing it the object that contains data to be rendered. It is accomplished with the function processTemplate(data). The data is a simple <a title="javascript" href="http://www.codewrecks.com/blog/index.php/tag/javascript/">javascript</a> object that will be substituted to the $T object inside the template. </p>
<p>This is not the only way to set a template, the other one is using setTemplateURL and processTemplateURL that actually gets the template from an URL and render it with a json object returned from the url passed to processTemplateURL. If this sounds you interesting, think to <a title="asp.net mvc" href="http://www.codewrecks.com/blog/index.php/category/net-framework/aspnet-mvc/">asp.net mvc</a>, where you can create a controller that manages templates, and other controllers that returns data with JsonResult. If you structure the site in this way, you can maximize <a title="performance" href="http://www.codewrecks.com/blog/index.php/tag/performance/">performance</a> passing only json data with the server. You only need to render the page with empty divs, assign template to the div, and finally gets data to be rendered from the server.</p>
<p>Actually Iâ€™m experimenting with the PhotoAlbum application I did for the jQuery workshop of our usergroup DotNetMarche, as soon as possible Iâ€™ll begin to post some concrete code that works with client-side rendering, showing you pratical example that uses this technique.</p>
<p>alk.</p>
<p>Tags: <a target="_blank" href="http://technorati.com/tag/jQuery" rel="tag">jQuery</a> <a target="_blank" href="http://technorati.com/tag/jtemplates" rel="tag">jtemplates</a> <a target="_blank" href="http://technorati.com/tag/Asp.net MVC" rel="tag">Asp.net MVC</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.codewrecks.com/blog/index.php/2009/04/15/aspnet-mvc-plus-jquery-client-template-engine-have-fun-with-them/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Build a menu for asp.net mvc site</title>
		<link>http://www.codewrecks.com/blog/index.php/2009/04/14/build-a-menu-for-aspnet-mvc-site/</link>
		<comments>http://www.codewrecks.com/blog/index.php/2009/04/14/build-a-menu-for-aspnet-mvc-site/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 15:01:24 +0000</pubDate>
		<dc:creator>alkampfer</dc:creator>
				<category><![CDATA[Asp.Net MVC]]></category>

		<guid isPermaLink="false">http://www.codewrecks.com/blog/index.php/2009/04/14/build-a-menu-for-aspnet-mvc-site/</guid>
		<description><![CDATA[I have a little site with mixed webform and mvc pages, and I need a simple way to create a main menu. Since asp.net mvc have the concept of controllers and action I like to express my menu with a simple xml file like this. &#60;?xml version="1.0" encoding="utf-8" ?&#62; &#60;menu&#62; &#60;submenu text="administration"&#62; &#60;url url="/Login.aspx" text="Login [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a target="_blank" href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.codewrecks.com%2Fblog%2Findex.php%2F2009%2F04%2F14%2Fbuild-a-menu-for-aspnet-mvc-site%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.codewrecks.com%2Fblog%2Findex.php%2F2009%2F04%2F14%2Fbuild-a-menu-for-aspnet-mvc-site%2F&amp;source=alkampfer&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>I have a little site with mixed webform and mvc pages, and I need a simple way to create a main menu. Since <a title="asp.net mvc" href="http://www.codewrecks.com/blog/index.php/category/net-framework/aspnet-mvc/">asp.net mvc</a> have the concept of controllers and action I like to express my menu with a simple xml file like this.</p>
<div class="wlWriterEditableSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:8c4a4f59-35c0-4a9f-8e04-deb1fe806c86" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #0000FF;">&lt;?</span><span style="color: #FF00FF;">xml version="1.0" encoding="utf-8" </span><span style="color: #0000FF;">?&gt;</span><span style="color: #000000;">
</span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">menu</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
   </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">submenu </span><span style="color: #FF0000;">text</span><span style="color: #0000FF;">="administration"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">url </span><span style="color: #FF0000;">url</span><span style="color: #0000FF;">="/Login.aspx"</span><span style="color: #FF0000;"> text</span><span style="color: #0000FF;">="Login Page"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">url </span><span style="color: #FF0000;">url</span><span style="color: #0000FF;">="/CreateUser.aspx"</span><span style="color: #FF0000;"> text</span><span style="color: #0000FF;">="Registration Page"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
   </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">submenu</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
   </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">submenu </span><span style="color: #FF0000;">text</span><span style="color: #0000FF;">="Web Forms"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">url </span><span style="color: #FF0000;">url</span><span style="color: #0000FF;">="/Photo/PhotoAlbumManager.aspx"</span><span style="color: #FF0000;"> text</span><span style="color: #0000FF;">="Album manager"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">url </span><span style="color: #FF0000;">url</span><span style="color: #0000FF;">="/Photo/AlbumSearch.aspx"</span><span style="color: #FF0000;"> text</span><span style="color: #0000FF;">="Album Search"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">url </span><span style="color: #FF0000;">url</span><span style="color: #0000FF;">="/Photo/AlbumSearchPr.aspx"</span><span style="color: #FF0000;"> text</span><span style="color: #0000FF;">="Album Search Pr"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
   </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">submenu</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
   </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">submenu </span><span style="color: #FF0000;">text</span><span style="color: #0000FF;">="MvcSite"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">action </span><span style="color: #FF0000;">controller</span><span style="color: #0000FF;">="PhotoManager"</span><span style="color: #FF0000;"> action</span><span style="color: #0000FF;">="ManageAlbum"</span><span style="color: #FF0000;"> text</span><span style="color: #0000FF;">="Album Manager"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
   </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">submenu</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">menu</span><span style="color: #0000FF;">&gt;</span></pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p>This xml has a really simple structure, it have root node called menu, then a set of submenu and finally url node or action node, i use url node for classic <a title="asp.net" href="http://www.codewrecks.com/blog/index.php/category/net-framework/aspnet/">asp.net</a> pages, and action node for <a title="asp.net" href="http://www.codewrecks.com/blog/index.php/category/net-framework/aspnet/">asp.net</a> mvp pages. I like the Idea of Action Node, because it is more mvc like than express a simple route. Moreover If we change routing structure I need not to change a single line of the menu, because links are expressed in forms of Controller and action. </p>
<p>The first thing to do is creating a model capable of parsing this file and building a list of object that can be used from the view engine. I decided to create a couple of classes to represent a menu in memory</p>
<p><a href="http://www.codewrecks.com/blog/wp-content/uploads/2009/04/image3.png"><img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="484" alt="image" src="http://www.codewrecks.com/blog/wp-content/uploads/2009/04/image-thumb3.png" width="451" border="0" /></a> </p>
<p>The MasterModel classes has the responsibility to create data for the master page. In this version it has only the CreateMenu function that can be used to parse the xml files with the menu and create a root menuitem class. The MenuItem has a method called Render that is capable to render an anchor link with the corresponding page. The good part is that the real url is created with the UrlHelper class</p>
<div class="wlWriterEditableSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:07c5cd77-2895-4910-b93b-6f3db207cdef" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #000000;">         </span><span style="color: #0000FF;">else</span><span style="color: #000000;"> </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (element.Name </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">action</span><span style="color: #800000;">"</span><span style="color: #000000;">)
            </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> MenuLink(
               element.Attribute(</span><span style="color: #800000;">"</span><span style="color: #800000;">text</span><span style="color: #800000;">"</span><span style="color: #000000;">).Value,
               Url.RouteUrl(</span><span style="color: #800000;">"</span><span style="color: #800000;">Default</span><span style="color: #800000;">"</span><span style="color: #000000;">, </span><span style="color: #0000FF;">new</span><span style="color: #000000;">
               {
                  controller </span><span style="color: #000000;">=</span><span style="color: #000000;"> element.Attribute(</span><span style="color: #800000;">"</span><span style="color: #800000;">controller</span><span style="color: #800000;">"</span><span style="color: #000000;">).Value,
                  action </span><span style="color: #000000;">=</span><span style="color: #000000;">  element.Attribute(</span><span style="color: #800000;">"</span><span style="color: #800000;">action</span><span style="color: #800000;">"</span><span style="color: #000000;">).Value,
               }));</span></pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p>Since Iâ€™m doing partial rendering, I do not want each action in the controller to render the menu, so I create a base controller with this property</p>
<div class="wlWriterEditableSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:f6a20f80-e885-4bb1-926b-10661dac3e2b" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #000000;">      </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> MenuItem RootMenu
      {
         </span><span style="color: #0000FF;">get</span><span style="color: #000000;"> { </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> rootMenu </span><span style="color: #000000;">??</span><span style="color: #000000;"> (rootMenu </span><span style="color: #000000;">=</span><span style="color: #000000;"> MasterModel.CreateMenu(Path.Combine(Global.PhysicalPath,</span><span style="color: #800000;">"</span><span style="color: #800000;">WebMvcSitemap.Xml</span><span style="color: #800000;">"</span><span style="color: #000000;">))); }
      }
      </span><span style="color: #0000FF;">private</span><span style="color: #000000;"> MenuItem rootMenu;</span></pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p>As you can see, only when I access the MenuItem object the menu gets reconstructed. In this version there is no cache, so the file is read each time the menu needs to be rendered, but it is good enough for now. When I call an action that needs to render the whole page I simply access the RootMenu property to create and pass to the view menudata</p>
<div class="wlWriterEditableSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:90b3ee76-a7a6-4d93-a17d-07e8a05b6a7a" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #0000FF;">public</span><span style="color: #000000;"> ActionResult ManageAlbum(Guid</span><span style="color: #000000;">?</span><span style="color: #000000;"> id, Int32</span><span style="color: #000000;">?</span><span style="color: #000000;"> pageid, Int32</span><span style="color: #000000;">?</span><span style="color: #000000;"> pagesize)
{
   AlbumManager model </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> AlbumManager();
   model.MainMenu </span><span style="color: #000000;">=</span><span style="color: #000000;"> RootMenu;</span></pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p>With the above code I reconstruct the menu and passed to the view in the MainMenu property. When I call an action that needs only to render partial part of the page, I simply avoid to set the MainMenu property, and the menu gets not reconstructed, since the view needs to do partial rendering it has no master page and so it does not access the menu part. Finally I created a simple view that is able to render the menu as a series of nested &lt;ul&gt; tags and called it in the master page.</p>
<p>Code is contained in photoalbum project (Subversion address: <a target="_blank" title="http://dotnetmarcheproject.googlecode.com/svn/trunk/src/Projects/DotNetMarche.PhotoAlbum" href="http://dotnetmarcheproject.googlecode.com/svn/trunk/src/Projects/DotNetMarche.PhotoAlbum">http://dotnetmarcheproject.googlecode.com/svn/trunk/src/Projects/DotNetMarche.PhotoAlbum</a>)</p>
<p>alk.</p>
</p>
<p>Tags: <a target="_blank" href="http://technorati.com/tag/Asp.Net MVC" rel="tag">Asp.Net MVC</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.codewrecks.com/blog/index.php/2009/04/14/build-a-menu-for-aspnet-mvc-site/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Choosing the ritgh route when you generate link in asp.net mvc.</title>
		<link>http://www.codewrecks.com/blog/index.php/2009/04/05/choosing-the-ritgh-route-when-you-generate-link-in-aspnet-mvc/</link>
		<comments>http://www.codewrecks.com/blog/index.php/2009/04/05/choosing-the-ritgh-route-when-you-generate-link-in-aspnet-mvc/#comments</comments>
		<pubDate>Sun, 05 Apr 2009 17:00:35 +0000</pubDate>
		<dc:creator>alkampfer</dc:creator>
				<category><![CDATA[Asp.Net MVC]]></category>

		<guid isPermaLink="false">http://www.codewrecks.com/blog/index.php/2009/04/05/choosing-the-ritgh-route-when-you-generate-link-in-aspnet-mvc/</guid>
		<description><![CDATA[Iâ€™m moving my first steps on asp.net mvc, and in my test project I added a route after the default one in this way. RouteTable.Routes.MapRoute( "Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = "" } ); RouteTable.Routes.MapRoute( "PagedController", "{controller}/{action}/{pageid}/{id}", new { controller = "Home", action = "Index", pageid = 0, id [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a target="_blank" href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.codewrecks.com%2Fblog%2Findex.php%2F2009%2F04%2F05%2Fchoosing-the-ritgh-route-when-you-generate-link-in-aspnet-mvc%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.codewrecks.com%2Fblog%2Findex.php%2F2009%2F04%2F05%2Fchoosing-the-ritgh-route-when-you-generate-link-in-aspnet-mvc%2F&amp;source=alkampfer&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Iâ€™m moving my first steps on <a title="asp.net mvc" href="http://www.codewrecks.com/blog/index.php/category/net-framework/aspnet-mvc/">asp.net mvc</a>, and in my <a title="test" href="http://www.codewrecks.com/blog/index.php/2007/09/03/test/">test</a> project I added a route after the default one in this way.</p>
<div class="wlWriterEditableSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:89fac0aa-5ab7-4b22-8a6f-91752e281a55" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre style="background-color:#FFFFFF;overflow: auto;"><span style="color: #000000;"> RouteTable.Routes.MapRoute(
               </span><span style="color: #800000;">"</span><span style="color: #800000;">Default</span><span style="color: #800000;">"</span><span style="color: #000000;">,
               </span><span style="color: #800000;">"</span><span style="color: #800000;">{controller}/{action}/{id}</span><span style="color: #800000;">"</span><span style="color: #000000;">,
               </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> { controller </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Home</span><span style="color: #800000;">"</span><span style="color: #000000;">, action </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Index</span><span style="color: #800000;">"</span><span style="color: #000000;">, id </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">""</span><span style="color: #000000;"> }
             );
            RouteTable.Routes.MapRoute(
                </span><span style="color: #800000;">"</span><span style="color: #800000;">PagedController</span><span style="color: #800000;">"</span><span style="color: #000000;">,
                </span><span style="color: #800000;">"</span><span style="color: #800000;">{controller}/{action}/{pageid}/{id}</span><span style="color: #800000;">"</span><span style="color: #000000;">,
                </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> { controller </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Home</span><span style="color: #800000;">"</span><span style="color: #000000;">, action </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Index</span><span style="color: #800000;">"</span><span style="color: #000000;">, pageid </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">, id </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">""</span><span style="color: #000000;"> }
              );</span></pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p>As you can see the second route is used when the controller need the concept of current page, it is very close to the default one, but it has another parameter called pageid. Now I generate a link to the paged controller with the following code.</p>
<p><div class="wlWriterEditableSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:3dbd41a9-0bff-41d8-9108-f7a6018d6b03" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #000000;">Html.ActionLink(
    </span><span style="color: #800000;">"</span><span style="color: #800000;">Edit</span><span style="color: #800000;">"</span><span style="color: #000000;">,
    </span><span style="color: #800000;">"</span><span style="color: #800000;">ManageAlbum</span><span style="color: #800000;">"</span><span style="color: #000000;">,
    </span><span style="color: #800000;">"</span><span style="color: #800000;">PhotoManager</span><span style="color: #800000;">"</span><span style="color: #000000;">,
    </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> { pageid </span><span style="color: #000000;">=</span><span style="color: #000000;"> ViewData.Model.CurrentPage, id </span><span style="color: #000000;">=</span><span style="color: #000000;"> Guid.Empty},
    </span><span style="color: #0000FF;">null</span><span style="color: #000000;">)</span></pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
</p>
<p>But generated link is <a target="_blank" title="http://localhost:13164/PhotoManager/ManageAlbum/00000000-0000-0000-0000-000000000000?pageid=0" href="http://localhost:13164/PhotoManager/ManageAlbum/00000000-0000-0000-0000-000000000000?pageid=0">PhotoManager/ManageAlbum/00000000-0000-0000-0000-000000000000?pageid=0</a> that is wrong. The page id was put in querystring and not in the path as I want. The problem is derived from the order of routes, because the ActionLink function scans route from the first to the last. Since the first route match with the parameter the ActionLink method decides to use the â€œDefaultâ€ route, appending the pageid parameter to the querystring.</p>
<p>If you need to manually choose the route you need to generate your link you can use a different method of the Html helper object.</p>
<div class="wlWriterEditableSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:2a65532a-3b78-491e-80fe-ccc672d2179e" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #000000;">Html.RouteLink(
    </span><span style="color: #800000;">"</span><span style="color: #800000;">Edit</span><span style="color: #800000;">"</span><span style="color: #000000;">,
    </span><span style="color: #800000;">"</span><span style="color: #800000;">PagedController</span><span style="color: #800000;">"</span><span style="color: #000000;">,
    </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> {
        controller</span><span style="color: #000000;">=</span><span style="color: #000000;">  </span><span style="color: #800000;">"</span><span style="color: #800000;">ManageAlbum</span><span style="color: #800000;">"</span><span style="color: #000000;">,
        action </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">PhotoManager</span><span style="color: #800000;">"</span><span style="color: #000000;">,
        pageid </span><span style="color: #000000;">=</span><span style="color: #000000;"> ViewData.Model.CurrentPage,
        id </span><span style="color: #000000;">=</span><span style="color: #000000;"> Guid.Empty},
    </span><span style="color: #0000FF;">null</span><span style="color: #000000;">)</span></pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p>As you can see with the RouteLink() method you can choose exactly the route you want to use, and generate desidered link <a target="_blank" title="http://localhost:13164/ManageAlbum/PhotoManager/0/00000000-0000-0000-0000-000000000000" href="http://localhost:13164/ManageAlbum/PhotoManager/0/00000000-0000-0000-0000-000000000000">/ManageAlbum/PhotoManager/0/00000000-0000-0000-0000-000000000000</a>.</p>
<p>alk.</p>
<p>Tags: <a target="_blank" href="http://technorati.com/tag/Asp.net MVC" rel="tag">Asp.net MVC</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.codewrecks.com/blog/index.php/2009/04/05/choosing-the-ritgh-route-when-you-generate-link-in-aspnet-mvc/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Could not load type &#8216;System.Web.Mvc.ViewPage&lt;..&lt;&gt;&#8217;</title>
		<link>http://www.codewrecks.com/blog/index.php/2009/04/05/could-not-load-type-systemwebmvcviewpage/</link>
		<comments>http://www.codewrecks.com/blog/index.php/2009/04/05/could-not-load-type-systemwebmvcviewpage/#comments</comments>
		<pubDate>Sun, 05 Apr 2009 11:54:05 +0000</pubDate>
		<dc:creator>alkampfer</dc:creator>
				<category><![CDATA[Asp.Net MVC]]></category>

		<guid isPermaLink="false">http://www.codewrecks.com/blog/index.php/2009/04/05/could-not-load-type-systemwebmvcviewpage/</guid>
		<description><![CDATA[First of all thanks to Andrea Balducci that gave me this solution. I have a asp.net application where I enabled Asp.Net mvc following a link in the web. Everything works well until I try to use Strongly Typed View. When I try to have a page that inherits from ViewPage&#60;T&#62; where T is one of [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a target="_blank" href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.codewrecks.com%2Fblog%2Findex.php%2F2009%2F04%2F05%2Fcould-not-load-type-systemwebmvcviewpage%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.codewrecks.com%2Fblog%2Findex.php%2F2009%2F04%2F05%2Fcould-not-load-type-systemwebmvcviewpage%2F&amp;source=alkampfer&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>First of all thanks to <a target="_blank" href="http://dotnetmarche.org/blogs/andreabalducci/">Andrea Balducci</a> that gave me this solution. I have a <a title="asp.net" href="http://www.codewrecks.com/blog/index.php/category/net-framework/aspnet/">asp.net</a> application where I enabled <a title="Asp.Net mvc" href="http://www.codewrecks.com/blog/index.php/category/net-framework/aspnet-mvc/">Asp.Net mvc</a> following a link in the web. Everything works well until I try to use Strongly Typed View. When I try to have a page that inherits from ViewPage&lt;T&gt; where T is one of my model the system gave me an error of type</p>
<blockquote><p>Could not load type &#8216;System.Web.Mvc.ViewPage&lt;â€¦&gt;</p>
</blockquote>
<p>In a <a target="_blank" title="asp.net" href="http://www.codewrecks.com/blog/index.php/category/net-framework/aspnet/">asp.net</a> site created with the wizard everything works ok. I check both web.config to be sure that actually I did not forgot anything, then I stumble across <a href="http://blog.benhall.me.uk/2009/01/aspnet-mvc-rc1-removing-code-behind.html">this post</a>. Basically I need to modify Page directive of my web config in this way</p>
<div class="wlWriterEditableSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:536c73eb-2561-4f58-9e5c-3fbb413b34fa" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre style="background-color:#FFFFFF;overflow: auto;"><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">pages
     </span><span style="color: #FF0000;">pageParserFilterType</span><span style="color: #0000FF;">="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"</span><span style="color: #FF0000;">
     pageBaseType</span><span style="color: #0000FF;">="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"</span><span style="color: #FF0000;">
     userControlBaseType</span><span style="color: #0000FF;">="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
</span></pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p>I really do not understand why the site created with the <a title="asp.net" href="http://www.codewrecks.com/blog/index.php/tag/aspnet/">asp.net</a> wizard works because it does not have this directive, then Andrea told me to chek the View directory, because it has a dedicated web.config. Here is the solution. The view directory must contains a web.config like this</p>
<div class="wlWriterEditableSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:0da63929-1ca1-47d6-b049-88f827a9829c" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre style="background-color:#FFFFFF;overflow: auto;"><span style="color: #0000FF;">&lt;?</span><span style="color: #FF00FF;">xml version="1.0"</span><span style="color: #0000FF;">?&gt;</span><span style="color: #000000;">
</span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">configuration</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
   </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">system.web</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">httpHandlers</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
         </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add </span><span style="color: #FF0000;">path</span><span style="color: #0000FF;">="*"</span><span style="color: #FF0000;"> verb</span><span style="color: #0000FF;">="*"</span><span style="color: #FF0000;">
             type</span><span style="color: #0000FF;">="System.Web.HttpNotFoundHandler"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">httpHandlers</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">

      </span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">
        Enabling request validation in view pages would cause validation to occur
        after the input has already been processed by the controller. By default
        MVC performs request validation before a controller processes the input.
        To change this behavior apply the ValidateInputAttribute to a
        controller or action.
    </span><span style="color: #008000;">--&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">pages
          </span><span style="color: #FF0000;">validateRequest</span><span style="color: #0000FF;">="false"</span><span style="color: #FF0000;">
          pageParserFilterType</span><span style="color: #0000FF;">="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"</span><span style="color: #FF0000;">
          pageBaseType</span><span style="color: #0000FF;">="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"</span><span style="color: #FF0000;">
          userControlBaseType</span><span style="color: #0000FF;">="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
         </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">controls</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
            </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add </span><span style="color: #FF0000;">assembly</span><span style="color: #0000FF;">="System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"</span><span style="color: #FF0000;"> namespace</span><span style="color: #0000FF;">="System.Web.Mvc"</span><span style="color: #FF0000;"> tagPrefix</span><span style="color: #0000FF;">="mvc"</span><span style="color: #FF0000;"> </span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
         </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">controls</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">pages</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
   </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">system.web</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">

   </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">system.webServer</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">validation </span><span style="color: #FF0000;">validateIntegratedModeConfiguration</span><span style="color: #0000FF;">="false"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">handlers</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
         </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">remove </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="BlockViewHandler"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
         </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add </span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="BlockViewHandler"</span><span style="color: #FF0000;"> path</span><span style="color: #0000FF;">="*"</span><span style="color: #FF0000;"> verb</span><span style="color: #0000FF;">="*"</span><span style="color: #FF0000;"> preCondition</span><span style="color: #0000FF;">="integratedMode"</span><span style="color: #FF0000;"> type</span><span style="color: #0000FF;">="System.Web.HttpNotFoundHandler"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;">
      </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">handlers</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
   </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">system.webServer</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">configuration</span><span style="color: #0000FF;">&gt;</span></pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p>Thanks again to Andrea for the solution.</p>
<p>alk.</p>
<p>Tags: <a target="_blank" href="http://technorati.com/tag/ASP.NET Mvc" rel="tag">ASP.NET Mvc</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.codewrecks.com/blog/index.php/2009/04/05/could-not-load-type-systemwebmvcviewpage/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>

