<?xml version="1.0" encoding="utf-8"?><rss version="2.0"><channel><title>Mike Bosch's Blog on .NET</title><link>http://weblogs.asp.net:80/mikebosch/</link><description>Agile enterprise architecture in .NET, SOA, WCF, WS-*, AJAX, MVC, Sharepoint and more...</description><item><title>Blog Moved to MikeBosch.net</title><link>http://weblogs.asp.net:80/mikebosch/moving-my-blog-to-mikebosch-net</link><description>&lt;strong&gt;UPDATE #1 - If you've been following me on Twitter, you may have noticed that I botched the WordPress migration when I tried to import comments.  Not a huge deal but it broke some links to files and images.  In the meantime, MikeBosch.net is redirecting here until I can fix all the broken links.  Thanks!&lt;/strong&gt;
&lt;P&gt;I'm leaving the weblogs.asp.net blogging community to my own personal web space. I appreciate all the exposure I've received through the years here and I hope you'll follow me to the blogs new home. I'll be covering the same topics you've seen here and have already migrated the posts over. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Visit the new blog and let me know what you think: &lt;/STRONG&gt;&lt;A href="http://mikebosch.net/"&gt;&lt;STRONG&gt;http://mikebosch.net&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; &lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Follow me on Twitter: &lt;/STRONG&gt;&lt;A href="http://twitter.com/MichaelBosch" mce_href="http://twitter.com/MichaelBosch"&gt;&lt;STRONG&gt;http://twitter.com/MichaelBosch&lt;/STRONG&gt;&lt;/A&gt; &lt;/P&gt;</description><pubDate>Wed, 04 Aug 2010 13:30:00 GMT</pubDate><guid isPermaLink="true">http://weblogs.asp.net:80/mikebosch/moving-my-blog-to-mikebosch-net</guid><category>Community News</category></item><item><title>Agile, PMO and Air Traffic Controllers in Software Development Methodologies</title><link>http://weblogs.asp.net:80/mikebosch/agile-pmo-and-air-traffic-controllers-in-software-development-methodologies</link><description>&lt;p&gt;I recently read a Gartner research report about the changing space of software development methodologies and the PMO.  It compared the PMO to an air traffic controller coordinating flights (ie projects) - scheduling them, coordinating resources for them etc.  While this might be a valid comparison, I think the changing face of software development is leaning towards taking road trips as oppose to long flights.&lt;/p&gt;
&lt;p&gt;
The air traffic controller analogy is good but if the distance is short, sometimes driving a car is faster.  I think if our aim as software development managers shifts to focus on delivering small chunks of functionality more often, we don't necessarily need all the planning &amp;amp; scheduling that an international flight requires.  Driving to a close destination within 100 miles or so is often faster than the airport parking, luggage check-in, security screening, boarding, possible flight delays, weather conditions etc (not to mention the high upfront cost of a flight).  For short distances, driving a car is often the optimal choice.
 &lt;/p&gt;
&lt;p&gt;
For farther destinations, say from Miami to Seattle, a flight would definitely win over a drive with no stops. However, if we think of a Seattle as being the final destination, but having several stops along the way, it becomes akin to a road trip.  Each stop in a different town adds value to the overall expedition.  Everyone is enjoying the progress of the trip because they're getting value out of each stop along the way.  The car will need refueling (capital) along the way, but its a smaller cost than filling the plane with 50,000 gallons of jet fuel before takeoff. The analogy here is the benefit of high business value from fast, incremental delivery of application features.  &lt;/p&gt;

&lt;p&gt; 
Also, a flight requires coordination from several disparate and highly specialized teams (engineers, pilots, stewards, traffic controllers, etc).  In the car analogy, the team is much more close-knit and cross-functional.  Anyone can drive, a couple know how to drive as well as change a flat, someone knows how to change the oil as well as fix a flat - they don't need to "borrow" someone from another project to change a flat.  Everyone on this cross-functional team is committed to the success of the road trip whereas flight teams work on multiple flights (projects) all the time and need to be coordinated and assigned accordingly.
 &lt;/p&gt;&lt;p&gt;Without a doubt, coordination and management is necessary with any software development project.&amp;nbsp; However, the scale can change dramatically depending on how far you want to look ahead.&amp;nbsp; It also gives us more options to get around detours along the way. &lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
</description><pubDate>Fri, 14 Aug 2009 11:00:00 GMT</pubDate><guid isPermaLink="true">http://weblogs.asp.net:80/mikebosch/agile-pmo-and-air-traffic-controllers-in-software-development-methodologies</guid><category>Agile</category><category>Community News</category></item><item><title>WorkGrabber.com - Sweet ASP.NET MVC 1.0 + jQuery Application</title><link>http://weblogs.asp.net:80/mikebosch/workgrabber_2D00_asp_2D00_mvc_2D00_jquery_2D00_application</link><description>&lt;p&gt;You may have noticed this blog has been awfully quiet in the past couple of months.&amp;nbsp; That's because I've been working on a neat side project with a couple of other developers.&amp;nbsp; Today, we'd like to submit our project to the ASP.NET community to get some feedback. The site is called WorkGrabber.com.&amp;nbsp; You can check it out here:&amp;nbsp; &lt;a href="http://workgrabber.com" title="WorkGrabber - Find Local Contractors" mce_href="http://workgrabber.com"&gt;http://workgrabber.com&lt;/a&gt;&lt;br&gt;&lt;/p&gt;

&lt;p&gt;What we're trying to create with WorkGrabber is something like the eBay of local service contractors.  In an nutshell, when you post a job, you're bringing the entire project directly to contractors in detail.  You can upload photos and videos as well as answer questions and interact with contractors while keeping your information private.&amp;nbsp; You can review bids from local contractors and accept the one that you like the most.&amp;nbsp; You can read more about the features of WorkGrabber on the &lt;a href="http://blog.workgrabber.com" title="WorkGrabber.com Blog" target="_blank" mce_href="http://blog.workgrabber.com"&gt;WorkGrabber blog&lt;/a&gt;. In this post, I want to focus more on the technology we used to create it.&lt;/p&gt;

&lt;p&gt;
We started developing WorkGrabber during the earlier releases of ASP.NET MVC although we were pretty sure we weren't going to release it until the first RTM.  It gave us more time to beta test the site with friends and family before releasing it into the wild.  Here's a breakdown of some of the tools we used.
&lt;/p&gt;

&lt;p&gt;WorkGrabber is built on top of ASP.NET MVC 1.0.  Not a whole lot changed in the past couple releases of MVC so upgrading was fairly simple.  The data access code is developed mostly using LINQ to SQL with a SQL 2005 database.  jQuery is used throughout the site to create some cool visual effects. For example, we used &lt;a href="http://remysharp.com/2007/12/28/jquery-tag-suggestion/" rel="nofollow" target="_blank" mce_href="http://remysharp.com/2007/12/28/jquery-tag-suggestion/"&gt;jQuery Tag Suggestion&lt;/a&gt; plugin to create this neat auto-suggest tagging feature for when you're posting a job.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;img src="https://aspblogs.blob.core.windows.net/media/mikebosch/workgrabber/tags-sample.png" title="tag samples" alt="tag samples" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/workgrabber/tags-sample.png" width="478" height="150"&gt;&lt;/p&gt;

&lt;p&gt;Throughout WorkGrabber, we use the &lt;a href="http://famspam.com/facebox" target="_blank" mce_href="http://famspam.com/facebox" rel="nofollow"&gt;jQuery Facebox plugin &lt;/a&gt;to create really cool modal windows.&amp;nbsp; The modal windows themselves are ViewUserControls which are rendered back to the client.&amp;nbsp; Here's an example: &lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;img src="https://aspblogs.blob.core.windows.net/media/mikebosch/workgrabber/facebox-sample.png" title="facebox sample" alt="facebox sample" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/workgrabber/facebox-sample.png" width="451" height="280"&gt;&lt;br&gt;&lt;/p&gt;

&lt;p&gt;The majority of images are hosted by &lt;a href="http://imageshack.us/" target="_blank" mce_href="http://imageshack.us/" rel="nofollow"&gt;ImageShack &lt;/a&gt;and the galleries use the &lt;a href="http://leandrovieira.com/projects/jquery/lightbox/" rel="nofollow" target="_blank" mce_href="http://leandrovieira.com/projects/jquery/lightbox/"&gt;jQuery lightBox plugin&lt;/a&gt; to create a really neat modal effect.&amp;nbsp; So much is built into this jQuery plugins that they really make client side development a blast.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;img src="https://aspblogs.blob.core.windows.net/media/mikebosch/workgrabber/gallery-sample.png" title="photo gallery" alt="photo gallery" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/workgrabber/gallery-sample.png" width="500" height="363"&gt;&lt;/p&gt;

&lt;p&gt;I plan to post more about the internals of WorkGrabber in later posts.&amp;nbsp; I'd love to hear some of your feedback.&amp;nbsp; If you have a project on your "honey-do" list that you keep putting off, try posting it on WorkGrabber to get some free local contractor bids. &lt;/p&gt;

&lt;p&gt;Try posting a job and let me know what you think in the comments here.&lt;br&gt;&lt;/p&gt;
</description><pubDate>Tue, 07 Apr 2009 15:30:00 GMT</pubDate><guid isPermaLink="true">http://weblogs.asp.net:80/mikebosch/workgrabber_2D00_asp_2D00_mvc_2D00_jquery_2D00_application</guid><category>ASP.NET</category><category>jQuery</category><category>MVC</category></item><item><title>Announcing ASP.NET MVC 1.0 Final Release - Download Available</title><link>http://weblogs.asp.net:80/mikebosch/announcing-asp-net-mvc-1-0-final-release-download-available</link><description>&lt;P&gt;ASP.NET MVC 1.0 is finally out.&amp;nbsp; Download it now!&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyID=53289097-73ce-43bf-b6a6-35e00103cb4b&amp;amp;displaylang=en" mce_href="http://www.microsoft.com/downloads/details.aspx?FamilyID=53289097-73ce-43bf-b6a6-35e00103cb4b&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=53289097-73ce-43bf-b6a6-35e00103cb4b&amp;amp;displaylang=en&lt;/A&gt;&lt;/P&gt;</description><pubDate>Wed, 18 Mar 2009 15:02:00 GMT</pubDate><guid isPermaLink="true">http://weblogs.asp.net:80/mikebosch/announcing-asp-net-mvc-1-0-final-release-download-available</guid><category>ASP.NET</category><category>MVC</category></item><item><title>Updating MvcPager to work with ASP.NET MVC RC 1 (refresh)</title><link>http://weblogs.asp.net:80/mikebosch/updating-mvcpager-to-work-with-asp-net-mvc-rc-1-refresh</link><description>&lt;p&gt;At first glance, upgrading to the RC1 was quite a debacle.  First of all, any link that I created using the much more performant Html.RouteLink (instead of Html.ActionLink) just stopped working.  It turns out there was a regression bug in the RC that caused this.  The ASP.NET MVC team quickly released a refresh which fixed the problem.  

&lt;/p&gt;&lt;p&gt;The next problem came when I noticed &lt;a href="http://stephenwalther.com/blog/archive/2008/09/18/asp-net-mvc-tip-44-create-a-pager-html-helper.aspx" mce_href="http://stephenwalther.com/blog/archive/2008/09/18/asp-net-mvc-tip-44-create-a-pager-html-helper.aspx"&gt;Stephen Walther's paging helper&lt;/a&gt; stopped working.  It would throw a null reference exception whenever I used the Html.Pager() helper method.  The issue was a breaking change in the RC1 with the location the RequestContext.  

&lt;/p&gt;&lt;p&gt;To fix the issue, you can download the solution from Stephen's site.  Open up the solution and change all the references to the latest ASP.NET MVC assemblies.  When you compile the main project, you'll find an error in the PagerBuilder.cs class at line 165.  All you have to do is update this line to:   &lt;/p&gt;&lt;p&gt;var urlHelper = new UrlHelper(_helper.ViewContext.RequestContext);
&lt;/p&gt;&lt;p&gt;
Compile the project and replace the assembly in your ASP.NET MVC project.  I'm sure Stephen will update the project eventually so you could just download the latest version.&lt;/p&gt;&lt;p&gt;Hope this helps! &lt;br&gt;&lt;/p&gt;</description><pubDate>Sun, 01 Feb 2009 16:18:00 GMT</pubDate><guid isPermaLink="true">http://weblogs.asp.net:80/mikebosch/updating-mvcpager-to-work-with-asp-net-mvc-rc-1-refresh</guid><category>ASP.NET</category><category>MVC</category></item><item><title>Hierarchical Treeview with ASP.NET MVC &amp; jQuery</title><link>http://weblogs.asp.net:80/mikebosch/hierarchical-treeview-with-asp-net-mvc-jquery</link><description>&lt;p&gt;First of all, an apology for being so quiet over the past few weeks.&amp;nbsp; I've been putting my blogging aside for a while to chase some pet projects I'm working on.&amp;nbsp; More on that later.&lt;br&gt;&lt;br&gt;I did, however, run into a particular situation that I thought would be of interest to anyone adopting ASP.NET MVC and looking for some goodies from jQuery.&amp;nbsp; Many of you have no doubt started testing the waters with jQuery since it was announced that Microsoft will be shipping the next version of .NET with it included.&amp;nbsp; If you haven't used jQuery yet, prepare to fall in love! &amp;nbsp;&lt;br&gt;&lt;br&gt;In this post, I'm going to cover a simple way to build a deep, hierarchical and feature-rich tree structure with only one line of jQuery script.&amp;nbsp; jQuery has a huge library of plugins covering all sorts of functionality.&amp;nbsp; For this, we'll be using a neat plugin from &lt;cite&gt;&lt;/cite&gt;for treeviews.&amp;nbsp; Here's what you need:&lt;br&gt;&lt;a href="http://jquery.com/" target="_blank" mce_href="http://jquery.com/"&gt;jQuery&lt;/a&gt;&lt;br&gt;&lt;a href="http://plugins.jquery.com/project/treeview" target="_blank" mce_href="http://plugins.jquery.com/project/treeview"&gt;jQuery Treeview Plugin&lt;/a&gt;&lt;br&gt;&lt;br&gt;This structure will consist of a category/sub-category relationship that is able to support n-levels of sub-categories with no changes.&amp;nbsp; To demonstrate, let's look at the SQL table that supports the structure.&lt;br&gt;&lt;img src="https://aspblogs.blob.core.windows.net/media/mikebosch/treeview/category_rows.jpg" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/treeview/category_rows.jpg" width="351" height="239"&gt;&lt;br&gt;Notice the rows with ParentCategoryID set to NULL are the parent categories.&amp;nbsp; Each row with a ParentCategoryID is a sub-category and relates to it's parent category.&amp;nbsp; The numbers show the level in outline view.&lt;br&gt;&lt;br&gt;The jQuery Treeview plug-in requires the resulting HTML to be in a particular unordered list (&amp;lt;ul&amp;gt;) element to parse the tree correctly.&amp;nbsp; Since we don't know how many levels to expect, we are going to call the MVC user control that renders each node recursively.&amp;nbsp; This control accepts a single Category item.&amp;nbsp; &lt;/p&gt;&lt;p&gt;&lt;img src="https://aspblogs.blob.core.windows.net/media/mikebosch/treeview/control_html.jpg" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/treeview/control_html.jpg" width="600" height="201"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;We render the name of that category and then check if it has any categories associated with it.&amp;nbsp; If it does, we recursively render the control again.&lt;br&gt;&lt;/p&gt;&lt;p&gt;In the controller, we are simply passing in the categories where the ParentCategoryID == null.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;img src="https://aspblogs.blob.core.windows.net/media/mikebosch/treeview/controller.jpg" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/treeview/controller.jpg" width="557" height="141"&gt;&lt;/p&gt;&lt;p&gt;On the host view (Index.aspx), we create the root unordered list with an ID of "treeview" and pass in an array of the Parent categories (categories where the ParentCategoryID == null) from the controller.&amp;nbsp; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;img src="https://aspblogs.blob.core.windows.net/media/mikebosch/treeview/control_nojquery.jpg" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/treeview/control_nojquery.jpg" width="544" height="89"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Here's a look at the output &lt;i&gt;&lt;b&gt;WITHOUT &lt;/b&gt;&lt;/i&gt;the jQuery magic.&lt;/p&gt;&lt;p&gt;&lt;img src="https://aspblogs.blob.core.windows.net/media/mikebosch/treeview/output_display_no_jquery.jpg" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/treeview/output_display_no_jquery.jpg" width="388" height="351"&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;Now all we have to do is add the libraries we're going to use and hook up the Treeview plugin.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;img src="https://aspblogs.blob.core.windows.net/media/mikebosch/treeview/head.jpg" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/treeview/head.jpg" width="486" height="163"&gt;&lt;br&gt;&lt;i&gt;&lt;b&gt;Note:&lt;/b&gt;&amp;nbsp; I always use the jQuery script from the Google API's.&amp;nbsp; By referencing it from Google's server, you get to ride along their CDN, compression, etc. capabilities.&amp;nbsp; As an added bonus, if your user has already visited a site that referenced the same library, the jQuery library would be cached on their browser so they don't take the hit of having to download it again.&amp;nbsp; Sweet!&lt;/i&gt;&lt;br&gt;&lt;br&gt;In our jQuery script, we just get the ul's element ID and call the plugin's treeview() method with no options.&amp;nbsp; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;img src="https://aspblogs.blob.core.windows.net/media/mikebosch/treeview/page_html.jpg" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/treeview/page_html.jpg" width="565" height="243"&gt;&lt;/p&gt;&lt;p&gt;When we refresh the page, we see jQuery has done its magic and now we have collapsable, rich tree view. &lt;/p&gt;&lt;p&gt;&lt;img src="https://aspblogs.blob.core.windows.net/media/mikebosch/treeview/output_treeview_display.jpg" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/treeview/output_treeview_display.jpg" width="186" height="293"&gt;&lt;/p&gt;&lt;p&gt;There's a ton &lt;a href="http://docs.jquery.com/Plugins/Treeview/treeview#overview" target="_blank" mce_href="http://docs.jquery.com/Plugins/Treeview/treeview#overview"&gt;more options&lt;/a&gt; in the Treeview plugin that you can check out for yourself, including async loading with ajax, and tons of customizations.&amp;nbsp; ASP.NET MVC and jQuery - a match made in heaven!&lt;/p&gt;&lt;p&gt;Hope this helps! &lt;br&gt;&lt;/p&gt;</description><pubDate>Tue, 25 Nov 2008 21:20:00 GMT</pubDate><guid isPermaLink="true">http://weblogs.asp.net:80/mikebosch/hierarchical-treeview-with-asp-net-mvc-jquery</guid><category>ASP.NET</category><category>jQuery</category><category>MVC</category></item><item><title>RESTFul Ruby on Rails Resource for ASP.NET MVC ideas</title><link>http://weblogs.asp.net:80/mikebosch/restful-ruby-on-rails-resource-for-asp-net-mvc-ideas</link><description>
&lt;p&gt;I've been feverishly adapting and experimenting with the ASP.NET MVC Framework since the very first CTP.&amp;nbsp; I must admit, it keeps getting better with every release.&amp;nbsp; This past week was the official BETA release and I'm loving it.&lt;br&gt;&lt;br&gt;It has been a challenge for developers new to the concepts of MVC to find reference samples to help architect MVC web applications.&amp;nbsp; For this, I've suggested to look towards more mature MVC frameworks such as Ruby on Rails for common patterns in MVC applications.&amp;nbsp; RoR is not difficult to read and you'll certainly be able to follow the program logic.&amp;nbsp; I've HIGHLY recommend you take a look at &lt;a href="http://www.b-simple.de/download/restful_rails_en.pdf" rel="nofollow" target="_blank" mce_href="http://www.b-simple.de/download/restful_rails_en.pdf"&gt;this white paper exploring RESTFul Rails&lt;/a&gt; and then see how you can apply it to ASP.NET MVC.&lt;br&gt;&lt;/p&gt;
</description><pubDate>Tue, 21 Oct 2008 02:49:00 GMT</pubDate><guid isPermaLink="true">http://weblogs.asp.net:80/mikebosch/restful-ruby-on-rails-resource-for-asp-net-mvc-ideas</guid><category>ASP.NET</category><category>MVC</category></item><item><title>GiftListr Beta - ASP.NET MVC Facebook Application</title><link>http://weblogs.asp.net:80/mikebosch/giftlistr-asp-net-mvc-facebook-application</link><description>&lt;p&gt;&lt;b&gt;UPDATE:&amp;nbsp; Installation of .NET 3.5 SP 1 on my web hosting completely killed this app!&amp;nbsp; I'm currently going through the process of upgrading it but it will be down for a while.&amp;nbsp;&lt;/b&gt; &lt;br&gt;&lt;/p&gt;&lt;p&gt;I am officially announcing the beta release of the &lt;a href="http://apps.facebook.com/giftlistr" target="_blank" mce_href="http://apps.facebook.com/giftlistr"&gt;GiftListr for Facebook application&lt;/a&gt;. &amp;nbsp;&lt;br&gt;&lt;br&gt;&lt;a href="http://apps.facebook.com/giftlistr" target="_blank" mce_href="http://apps.facebook.com/giftlistr"&gt;GiftListr&lt;/a&gt; is the only truly universal gift registry allowing you to add products from &lt;b&gt;&lt;i&gt;ANY &lt;/i&gt;&lt;/b&gt;website without limitations.&amp;nbsp; Just browse stores the way you usually do when you shop online.&amp;nbsp; Once you find the item you want, simply copy-and-paste the url into the &lt;a href="http://apps.facebook.com/giftlistr" target="_blank" mce_href="http://apps.facebook.com/giftlistr"&gt;GiftListr&lt;/a&gt; application.&amp;nbsp; &lt;a href="http://apps.facebook.com/giftlistr" target="_blank" mce_href="http://apps.facebook.com/giftlistr"&gt;GiftListr&lt;/a&gt; will then download all the product information and product images available.&amp;nbsp; You can add notes to each item and share you gift list with friends.&lt;br&gt;&lt;br&gt;The application is built entirely on ASP.NET MVC and makes extensive use of the &lt;a href="http://jquery.com/" target="_blank" mce_href="http://jquery.com/"&gt;jQuery&lt;/a&gt; library.&amp;nbsp; It also uses the &lt;a href="http://www.codeplex.com/FacebookToolkit" target="_blank" mce_href="http://www.codeplex.com/FacebookToolkit"&gt;Facebook Developer Toolkit&lt;/a&gt; available on CodePlex.&amp;nbsp; I would love to hear some feedback from the ASP.NET community.&amp;nbsp; Let me know what you think.&amp;nbsp; Any features you'd like to see?&amp;nbsp; Would you be willing to contribute to it if I add it to CodePlex as a community project?&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://aspblogs.blob.core.windows.net/media/mikebosch/Media/giftlistr.gif" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/Media/giftlistr.gif" width="364" height="396"&gt;&lt;/p&gt;</description><pubDate>Tue, 05 Aug 2008 15:26:00 GMT</pubDate><guid isPermaLink="true">http://weblogs.asp.net:80/mikebosch/giftlistr-asp-net-mvc-facebook-application</guid><category>ASP.NET</category></item><item><title>Part II - Fluent Filters, IQueryable and Linq To Sql for Easy Data Access </title><link>http://weblogs.asp.net:80/mikebosch/part-ii-fluid-filters-iqueryable-and-linq-to-sql-for-easy-data-access</link><description>&lt;p&gt;I decided to write a second part to &lt;a href="/mikebosch/archive/2008/07/31/iqueryable-linq-to-sql-and-fluid-filters-for-data-access.aspx" class="" target="_blank" mce_href="/mikebosch/archive/2008/07/31/iqueryable-linq-to-sql-and-fluid-filters-for-data-access.aspx"&gt;my previous post&lt;/a&gt; on extending the IQueryable interface to create a really neat and organized data access layer with Linq To Sql.&amp;nbsp; The cool thing about this practice is that it nicely separates individual filters for integration testing and then lets you combine them to form much more complex queries.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;I added a new filter, CreatedBefore, which simply filters on the created date of the blog.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;&lt;img src="https://aspblogs.blob.core.windows.net/media/mikebosch/fluid_filters/fluidfilters2_03.png" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/fluid_filters/fluidfilters2_03.png"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I&amp;nbsp;can now use this by itself or daisy-chain it with the other filters I've created.&amp;nbsp; The resulting T-SQL is below.&amp;nbsp; Note the new CreateDate filter's effect on it.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://aspblogs.blob.core.windows.net/media/mikebosch/fluid_filters/fluidfilters2_00.png" style="width: 584px; height: 97px;" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/fluid_filters/fluidfilters2_00.png" width="584" height="97"&gt;&lt;/p&gt;
&lt;p&gt;Linq to Sql gets even cooler!&amp;nbsp; Let's say a Blog had associated Posts (a standard one-to-many, parent-child relationship).&amp;nbsp; This would result in a entity model similar to the one below.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img src="https://aspblogs.blob.core.windows.net/media/mikebosch/fluid_filters/fluidfilters2_04.png" style="width: 478px; height: 208px;" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/fluid_filters/fluidfilters2_04.png" width="478" height="208"&gt;&lt;/p&gt;
&lt;p&gt;Using the same filters I already created for the Blog entity and combining it with the DataLoadOptions property of the data context, I can now get not just the filtered Blog entities, but their associated Posts in just one trip to the database!&amp;nbsp; Nice!&amp;nbsp; &lt;/p&gt;
&lt;p&gt;&lt;img src="https://aspblogs.blob.core.windows.net/media/mikebosch/fluid_filters/fluidfilters2_01.png" style="width: 431px; height: 231px;" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/fluid_filters/fluidfilters2_01.png" width="431" height="231"&gt;&lt;/p&gt;
&lt;p&gt;I've blogged about how to use the DataLoadOptions in a &lt;a href="/mikebosch/archive/2007/12/26/how-to-sort-a-linq-to-sql-entity-at-the-parent-and-child-levels.aspx" class="" target="_blank" mce_href="/mikebosch/archive/2007/12/26/how-to-sort-a-linq-to-sql-entity-at-the-parent-and-child-levels.aspx"&gt;previous post&lt;/a&gt;.&amp;nbsp; Setting this as usual gives you the immediate result you're looking for.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;&lt;img src="https://aspblogs.blob.core.windows.net/media/mikebosch/fluid_filters/fluidfilters2_02.png" style="width: 602px; height: 164px;" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/fluid_filters/fluidfilters2_02.png" width="602" height="164"&gt;&lt;/p&gt;
&lt;p&gt;The generated T-SQL statements start to get a little uglier, but I'll take the Pepsi challenge when it comes to some custom SQL a developer might have written for this same functionality.&lt;/p&gt;
&lt;p&gt;Hope this helps!&lt;/p&gt;</description><pubDate>Fri, 01 Aug 2008 12:00:00 GMT</pubDate><guid isPermaLink="true">http://weblogs.asp.net:80/mikebosch/part-ii-fluid-filters-iqueryable-and-linq-to-sql-for-easy-data-access</guid><category>ASP.NET</category><category>LINQ</category></item><item><title>Fluent Filters, IQueryable and Linq To Sql for Easy Data Access </title><link>http://weblogs.asp.net:80/mikebosch/iqueryable-linq-to-sql-and-fluid-filters-for-data-access</link><description>&lt;p&gt;Inspired by Rob Conery's great work on his MVC Storefront screencasts, I decided to look into his &lt;a href="http://blog.wekeroad.com/mvc-storefront/mvcstore-part-3/" class="" mce_href="http://blog.wekeroad.com/mvc-storefront/mvcstore-part-3/"&gt;Pipes and Filters implementation&lt;/a&gt; and attempt to create my own.&amp;nbsp; Although there was a lot of critical commentary on some of the design decisions, I found myself very intrigued by this fluent interface implementation.&amp;nbsp; I haven't referenced back to the specific code samples so if it differs significantly, please keep in mind that this was certainly inspired by it.&lt;/p&gt;
&lt;p&gt;A very nice feature of Linq to Sql is that it delays query execution until you start enumerating over the collection.&amp;nbsp; This lets the developer build complex queries programatically and make only one call to the database.&amp;nbsp; Linq to Sql is smart enough to derive the resulting T-SQL to produce your result set.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;For this scenario, let's assume we want to select blogs that &lt;i&gt;&lt;b&gt;are tagged with&lt;/b&gt;&lt;/i&gt; specific tags and the &lt;b&gt;&lt;i&gt;blog name starts with&lt;/i&gt;&lt;/b&gt; a certain string.&amp;nbsp; Below we can see a simple entity model that shows the relationships among the Blog, BlogTag and tag tables.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;&lt;img src="https://aspblogs.blob.core.windows.net/media/mikebosch/fluid_filters/fluidfilters_04.png" style="width: 449px; height: 301px;" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/fluid_filters/fluidfilters_04.png" width="449" height="301"&gt;&lt;/p&gt;
&lt;p&gt;Let's&amp;nbsp;keep the domain-specific language for our extension method names.&amp;nbsp; I'll create two extension methods: "AreTaggedWith" and "BlogNameStartsWith".&amp;nbsp; The former will accept a string array of tags and the latter will accept a string parameter.&amp;nbsp; Both of these methods extend the IQueryable&amp;lt;Blog&amp;gt; interface and return the same.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;&lt;img src="https://aspblogs.blob.core.windows.net/media/mikebosch/fluid_filters/fluidfilters_03.png" style="width: 707px; height: 185px;" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/fluid_filters/fluidfilters_03.png" width="707" height="185"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;We can then "daisy-chain" these all together to create are linq query before actually enumerating (and therefore executing) the final query.&amp;nbsp; This will produce a nice looking, fluent interface for our data access layer.&lt;/p&gt;
&lt;p mce_keep="true"&gt;&lt;img src="https://aspblogs.blob.core.windows.net/media/mikebosch/fluid_filters/fluidfilters_5.png" style="width: 570px; height: 235px;" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/fluid_filters/fluidfilters_5.png" width="570" height="235"&gt;&lt;/p&gt;
&lt;p&gt;Using SQL Server Profiler, we can take a look at the query that Linq to Sql actually generated and how it is executed with input parameters and all.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img src="https://aspblogs.blob.core.windows.net/media/mikebosch/fluid_filters/fluidfilters_02.png" style="width: 586px; height: 104px;" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/fluid_filters/fluidfilters_02.png" width="586" height="104"&gt;&lt;/p&gt;
&lt;p&gt;Looking at the query above, I'd love to hear your thoughts on whether this is the most tuned query for this scenario.&amp;nbsp; Did Linq to Sql did a good job generating the query?&lt;/p&gt;</description><pubDate>Thu, 31 Jul 2008 13:00:00 GMT</pubDate><guid isPermaLink="true">http://weblogs.asp.net:80/mikebosch/iqueryable-linq-to-sql-and-fluid-filters-for-data-access</guid><category>.NET</category><category>LINQ</category></item><item><title>Using mbUnit's RowTest Attribute in a TDD Scenario</title><link>http://weblogs.asp.net:80/mikebosch/using-mbunit-s-rowtest-attribute-in-a-tdd-scenario</link><description>&lt;P&gt;Part of a project I'm working on requires users to tag certain items.&amp;nbsp; These tags are subscribed to by other systems and are also used to provide some neat auto-complete features for other inputs throughout the site.&amp;nbsp; Since new tags can be added by a user, I want to make sure that when the tag is added, the capitalization is in &lt;B&gt;T&lt;/B&gt;itle &lt;B&gt;C&lt;/B&gt;ase.&amp;nbsp; Here's a quick demonstration of how to use mbUnit's RowTest feature to allow you to test more scenarios with less code.&amp;nbsp; First, lets take a standard, single scenario test:&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;IMG src="https://aspblogs.blob.core.windows.net/media/mikebosch/mbunit_tdd/rowtest_000.png" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/mbunit_tdd/rowtest_000.png"&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;As you can see above, I am setting an expectation on my repository that when it is called, it will insert&amp;nbsp;the original input as a properly formatted string.&amp;nbsp; The formatting will be implemented within my service class.&amp;nbsp; Running this yielded a filed test - RED (good!).&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Now let's implement this feature:&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;IMG src="https://aspblogs.blob.core.windows.net/media/mikebosch/mbunit_tdd/rowtest_002.png" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/mbunit_tdd/rowtest_002.png"&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;I decided to create a string extension method which uses the little known ToTitleCase method of the TextInfo class.&amp;nbsp; This method accepts a string and returns it as a title-cased string.&amp;nbsp; Also note how we can split the dot-notation across lines making it much cleaner.&amp;nbsp; Below is the actual service call which will format the string and call my IRepository method:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;IMG src="https://aspblogs.blob.core.windows.net/media/mikebosch/mbunit_tdd/rowtest_003.png" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/mbunit_tdd/rowtest_003.png"&gt;&lt;/P&gt;
&lt;P&gt;After implementing this, I went back to the test and ran it.&amp;nbsp; Success!&lt;BR&gt;&lt;BR&gt;At this point, something occurred to me.&amp;nbsp; The tag name "test tag" is easy to verify.&amp;nbsp; However, how will this implementation handle capitalization rules?&amp;nbsp; For example, if I enter "LCD Repair" as a tag, it should NOT format it to "Lcd Repair".&amp;nbsp; This is where the RowTest feature shines.&amp;nbsp; Instead of writing a new test for each of these scenarios, I just converted my "Test" attribute to "RowTest" and changed the method signature.&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;IMG src="https://aspblogs.blob.core.windows.net/media/mikebosch/mbunit_tdd/rowtest_001.png" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/mbunit_tdd/rowtest_001.png"&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;As we can see, the method signature matches the individual Row parameters.&amp;nbsp; When we run this test again, it executes the test once for each row.&amp;nbsp; When you actually look at the test runner, it shows up as 3 individual tests so each row can fail independently.&lt;/P&gt;
&lt;P&gt;Hope this helps! &lt;/P&gt;</description><pubDate>Wed, 30 Jul 2008 14:00:00 GMT</pubDate><guid isPermaLink="true">http://weblogs.asp.net:80/mikebosch/using-mbunit-s-rowtest-attribute-in-a-tdd-scenario</guid><category>.NET</category><category>TDD</category></item><item><title>ASP.NET MVC Hosting Recommendation (if you're on a budget)</title><link>http://weblogs.asp.net:80/mikebosch/asp-net-hosting-recommendation-if-you-re-on-a-budget</link><description>&lt;p mce_keep="true"&gt;If you are looking for ASP.NET hosting, I HIGHLY recommend you check out &lt;a href="http://www.dailyrazor.com/affiliate/idevaffiliate.php?id=2404" mce_href="http://www.dailyrazor.com/affiliate/idevaffiliate.php?id=2404"&gt;DailyRazor.com&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;
&lt;p mce_keep="true"&gt;I wouldn't usually write up about a hosting company unless I really liked what they were offering.&amp;nbsp; I think they have the best deal out there for ASP.NET hosting.&amp;nbsp; I recommended them to a friend who was looking to host his site and he was extremely grateful.&amp;nbsp;&amp;nbsp;I&amp;nbsp;figured the rest of the ASP.NET community might appreciate it as well.&amp;nbsp; I'm actually hosting a few websites with them using the ASP.NET MVC Framework and have no complaints.&amp;nbsp; I am especially impressed with their technical support.&amp;nbsp; They respond quickly and solve issues with very little "back and forth".&lt;/p&gt;
&lt;p mce_keep="true"&gt;They also have this "quadruple promotion" that lets you upgrade any plan (starting from 5.95/month) to quadruple the features you get.&amp;nbsp; The cheapest package of 5.95/month gets you 8 websites and 8 MSSQL 2005 databases.&amp;nbsp; This is the best deal I've found on hosting.&amp;nbsp; I think you also get 15% off of your order.&amp;nbsp; If you're looking for hosting, I highly recommend these guys. Make sure you ask about the "quadruple promotion" if you don't see an add for it.&amp;nbsp; Check them out:&amp;nbsp; &lt;a href="http://www.dailyrazor.com/affiliate/idevaffiliate.php?id=2404" mce_href="http://www.dailyrazor.com/affiliate/idevaffiliate.php?id=2404"&gt;http://www.dailyrazor.com&lt;/a&gt;.&lt;br&gt;&lt;/p&gt;
&lt;p mce_keep="true"&gt;&amp;nbsp;&lt;/p&gt;</description><pubDate>Tue, 22 Jul 2008 17:44:00 GMT</pubDate><guid isPermaLink="true">http://weblogs.asp.net:80/mikebosch/asp-net-hosting-recommendation-if-you-re-on-a-budget</guid><category>Community News</category></item><item><title>ASP.NET Hosting Recommendation (if you're on a budget)</title><link>http://weblogs.asp.net:80/mikebosch/probably-one-of-the-best-economical-asp-net-website-hosting</link><description>&lt;p mce_keep="true"&gt;If you are looking for ASP.NET hosting, I HIGHLY recommend you check out &lt;a href="http://www.dailyrazor.com/affiliate/idevaffiliate.php?id=2404" mce_href="http://www.dailyrazor.com/affiliate/idevaffiliate.php?id=2404"&gt;DailyRazor.com&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;
&lt;p mce_keep="true"&gt;I wouldn't usually write up about a hosting company unless I really liked what they were offering.&amp;nbsp; I think they have the best deal out there for ASP.NET hosting.&amp;nbsp; I recommended them to a friend who was looking to host his site and he was extremely grateful.&amp;nbsp;&amp;nbsp;I&amp;nbsp;figured the rest of the ASP.NET community might appreciate it as well.&amp;nbsp; I'm actually hosting a few websites with them using the ASP.NET MVC Framework and have no complaints.&amp;nbsp; I am especially impressed with their technical support.&amp;nbsp; They respond quickly and solve issues with very little "back and forth".&lt;/p&gt;
&lt;p mce_keep="true"&gt;They also have this "quadruple promotion" that lets you upgrade any plan (starting from 5.95/month) to quadruple the features you get.&amp;nbsp; The cheapest package of 5.95/month gets you 8 websites and 8 MSSQL 2005 databases.&amp;nbsp; This is the best deal I've found on hosting.&amp;nbsp; I think you also get 15% off of your order.&amp;nbsp; If you're looking for hosting, I highly recommend these guys. Make sure you ask about the "quadruple promotion" if you don't see an add for it.&amp;nbsp; Check them out:&amp;nbsp; &lt;a href="http://www.dailyrazor.com/affiliate/idevaffiliate.php?id=2404" mce_href="http://www.dailyrazor.com/affiliate/idevaffiliate.php?id=2404"&gt;http://www.dailyrazor.com&lt;/a&gt;.&lt;br&gt;&lt;/p&gt;</description><pubDate>Tue, 22 Jul 2008 13:49:00 GMT</pubDate><guid isPermaLink="true">http://weblogs.asp.net:80/mikebosch/probably-one-of-the-best-economical-asp-net-website-hosting</guid><category>Community News</category></item><item><title>Debugging Running Processes in Visual Studio</title><link>http://weblogs.asp.net:80/mikebosch/debugging-running-processes-in-visual-studio</link><description>&lt;P&gt;I recently was overhearing the conversation a colleague of mine was having about debugging a large Win Forms application.&amp;nbsp; It seems he was jumping through some major hoops to be able to debug the application.&amp;nbsp; Without getting too much into the architecture of the solution, it was instantiating other applications through a messaging system backend to communicate between apps.&amp;nbsp; In order to debug it, the team was using some code workarounds to kill processes, muddle around with new threads and processes, create a new process in debug which then impersonates some other process etc.&amp;nbsp; At least that’s what I think was happening.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;This kind of debugging situation can be solved easily by using the "Attach to Process" debug functionality in Visual Studio.&amp;nbsp; I was surprised that the team didn't know about this feature so I wanted to post a quick "How-To" on using it so others can benefit from it.&lt;/P&gt;
&lt;P&gt;A couple of prerequisites must exist in order to attach to a running process.&lt;BR&gt;(1) The source must match the running application&lt;BR&gt;(2) The running application must have been compiled in debug mode&lt;/P&gt;
&lt;P&gt;It's fairly simple.&amp;nbsp; When you open up the source in Visual Studio, just navigate to the Debug menu and you'll find a menu item "Attach to Process".&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;IMG style="WIDTH: 264px; HEIGHT: 272px" height=272 src="https://aspblogs.blob.core.windows.net/media/mikebosch/Media/attachtoprocess01.png" width=264 mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/Media/attachtoprocess01.png"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;When you select this, you will be presented with a window that shows all your running processes.&amp;nbsp; Simply click on the process you want to attach to and you're done.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;IMG src="https://aspblogs.blob.core.windows.net/media/mikebosch/Media/attachtoprocess02.png" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/Media/attachtoprocess02.png"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If you're debugging a web application and using IIS to debug, you can even attach to the ASP.NET worker process "aspnet_wp.exe".&amp;nbsp; This will allow you to break on external requests to your web app.&amp;nbsp; If you're using the ASP.NET development server, you'll also find this on the list of processes you can attach to.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Hope this helps.&lt;BR&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;</description><pubDate>Fri, 20 Jun 2008 12:30:00 GMT</pubDate><guid isPermaLink="true">http://weblogs.asp.net:80/mikebosch/debugging-running-processes-in-visual-studio</guid><category>.NET</category></item><item><title>A "Friday the Thirteenths" Solution</title><link>http://weblogs.asp.net:80/mikebosch/a-quot-friday-the-thirteenths-quot-solution</link><description>&lt;P mce_keep="true"&gt;There was a recent post on&amp;nbsp;&lt;A class="" href="http://forum.lessthandot.com/viewtopic.php?f=102&amp;amp;t=1608" mce_href="http://forum.lessthandot.com/viewtopic.php?f=102&amp;amp;t=1608"&gt;LessThanDot&lt;/A&gt; to create a small application to find all the "Friday the 13th's" occuring&amp;nbsp;in a range of dates.&amp;nbsp; Here is my simple solution to the challenge.&amp;nbsp; I also made it flexible enought to find any occurrence of a day / day of week combination within that range.&amp;nbsp; It runs surprisingly quick even when looking over the next 500 years.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;IMG src="https://aspblogs.blob.core.windows.net/media/mikebosch/Media/friday.png" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/Media/friday.png"&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;Also, if you like my color scheme, I've made it available for download &lt;A class="" href="https://aspblogs.blob.core.windows.net/media/mikebosch/Media/MikeBoschVS2008.zip" mce_href="https://aspblogs.blob.core.windows.net/media/mikebosch/Media/MikeBoschVS2008.zip"&gt;here&lt;/A&gt;.&lt;/P&gt;</description><pubDate>Mon, 09 Jun 2008 16:26:00 GMT</pubDate><guid isPermaLink="true">http://weblogs.asp.net:80/mikebosch/a-quot-friday-the-thirteenths-quot-solution</guid><category>.NET</category></item><item><title>Showcase of "Live" ASP.NET MVC Sites</title><link>http://weblogs.asp.net:80/mikebosch/gallery-of-live-asp-net-mvc-sites</link><description>&lt;P&gt;It looks like people are starting to deploy sites based on the ASP.NET MVC Framework already.&amp;nbsp; I've been trying to collect some examples and here's what I got so far.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A title="find local contractors" href="http://workgrabber.com/" target=_blank mce_href="http://workgrabber.com/"&gt;WorkGrabber.com - Find Local Contractors&lt;/A&gt; - Nice site for finding local contractors and getting quotes / bids for your projects&lt;/LI&gt;
&lt;LI&gt;&lt;A title="Hottest iPhone App" href="http://www.bumbunnies.com/" target=_blank mce_href="http://www.bumbunnies.com/"&gt;BumBunnies.com&lt;/A&gt; - Apparently, this is the website for the popular iPhone sexy gallery application.&amp;nbsp; &lt;B&gt;WARNING!!! MIGHT NOT BE SAFE FOR WORK.&lt;/B&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://kigg.dotnetslackers.com/" target=_blank rel=nofollow mce_href="http://kigg.dotnetslackers.com/"&gt;Kigg&lt;/A&gt; - Kigg is a Digg like application developed with ASP.NET MVC&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://www.rowtube.net/" target=_blank rel=nofollow mce_href="http://www.rowtube.net/"&gt;RowTube.net&lt;/A&gt; - RowTube is a place to view the latest rowing videos.&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://shinyzhu.com/" target=_blank rel=nofollow mce_href="http://shinyzhu.com/"&gt;Shinyzhu.com&lt;/A&gt; - ShinyPortal is a mini portal created by ASP.NET MVC Preview 2.&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://yonkly.com/timeline" target=_blank rel=nofollow mce_href="http://yonkly.com/timeline"&gt;Yonkly.com&lt;/A&gt; - Twitter clone done in ASP.NET MVC.&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://www.jobtree.com.au/Home.mvc/Index" target=_blank rel=nofollow mce_href="http://www.jobtree.com.au/Home.mvc/Index"&gt;Jobtree.com.au&lt;/A&gt; - Looks like some sort of job site done in ASP.NET MVC.&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://www.aboutjasonjung.com/" target=_blank rel=nofollow mce_href="http://www.aboutjasonjung.com/"&gt;AboutJasonJung.com&lt;/A&gt; - Small personal blog site of Jason Jung&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://mytpi.navin.biz/" target=_blank rel=nofollow mce_href="http://mytpi.navin.biz/"&gt;MyTPI.com&lt;/A&gt; - Site about golf health and fitness&lt;/LI&gt;
&lt;LI&gt;&lt;A title="Free Adult Classifieds" href="http://www.flingmix.com/" target=_blank mce_href="http://www.flingmix.com/"&gt;FlingMix.com&lt;/A&gt; - FlingMix.com is a craigslist-like dating / adult personals site built using ASP.NET MVC.&amp;nbsp; &lt;B&gt;WARNING!!! MIGHT NOT BE SAFE FOR WORK.&lt;/B&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://www.lizzabethbrown.com/" target=_blank rel=nofollow mce_href="http://www.lizzabethbrown.com/"&gt;LizzabethBrown.com&lt;/A&gt; - Real estate site.&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://www.newperceptionstech.com/" target=_blank rel=nofollow mce_href="http://www.newperceptionstech.com/"&gt;NewPerceptionsTech.com&lt;/A&gt; - New Perceptions Technology is a custom software solutions provider specializing in website development&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://getrocketship.com/" target=_blank rel=nofollow mce_href="http://getrocketship.com/"&gt;GetRocketShip.com&lt;/A&gt; - Hosted website CMS service for small businesses using MVC&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;If you have a site that you're developing using the ASP.NET MVC Framework, please let me know about it so I can include it here.&amp;nbsp;&lt;/P&gt;
&lt;SCRIPT type=text/javascript&gt;&lt;!--
google_ad_client = "pub-8343591294693797";
/* 468x60, created 5/22/08 */
google_ad_slot = "3204471724";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/SCRIPT&gt;

&lt;SCRIPT src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript&gt;
&lt;/SCRIPT&gt;</description><pubDate>Mon, 05 May 2008 12:00:00 GMT</pubDate><guid isPermaLink="true">http://weblogs.asp.net:80/mikebosch/gallery-of-live-asp-net-mvc-sites</guid><category>ASP.NET</category><category>MVC</category></item><item><title>Real World Website Architectures</title><link>http://weblogs.asp.net:80/mikebosch/real_2D00_world_2D00_website_2D00_architectures</link><description>


&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;&lt;span style=""&gt;Have you ever wondered how major sites are logically and physically built?&amp;nbsp; Not as some high level with shaded boxes but at real platform level details.
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;I’ve been
looking for a site like this for a while.&lt;span style=""&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;No theory here, just real details about the servers, platforms, db’s,
caching, apache mods etc. that the “big boys” use – Facebook, Digg,
YouTube, craigslist, MySpace, Wikipedia, PlentyOfFish, Amazon and more...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;&lt;a href="http://highscalability.com/links/weblink/24" mce_href="http://highscalability.com/links/weblink/24" rel="nofollow"&gt;&lt;span style=""&gt;http://highscalability.com&lt;/span&gt;&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

</description><pubDate>Wed, 23 Apr 2008 13:49:00 GMT</pubDate><guid isPermaLink="true">http://weblogs.asp.net:80/mikebosch/real_2D00_world_2D00_website_2D00_architectures</guid><category>Community News</category></item><item><title>Using the ComponentController in ASP.NET MVC CTP 2</title><link>http://weblogs.asp.net:80/mikebosch/using-the-componentcontroller-in-asp-net-mvc</link><description>
&lt;p&gt;ASP.NET MVC CTP 2 shipped with a new controller class which you may have missed.&amp;nbsp; Community feedback begged for a better way to handle component pages that don't rely on the main page's view data.&amp;nbsp; A classic example might be a stock ticker.&amp;nbsp; We would want a reusable component that you can place in other pages.&lt;br&gt;&lt;br&gt;The &lt;i&gt;ComponentController &lt;/i&gt;allows you to call a controller action from within the page itself.&amp;nbsp; It's use is very similar to the regular controller.&amp;nbsp; You basically create a new class the inherits &lt;i&gt;ComponentController&lt;/i&gt;.&amp;nbsp; Then you create public methods as the actions of the controller.&amp;nbsp; Within the action method, you can implement whatever logic you need the component to perform.&amp;nbsp; You finally call &lt;i&gt;RenderView &lt;/i&gt;to render the view just like the regular controllers. &amp;nbsp;&lt;br&gt;&lt;br&gt;It's important to note that the &lt;i&gt;ComponentController &lt;/i&gt;doesn't look in the same places as the regular controller when finding the views.&amp;nbsp; On this CTP, all component views need to reside in the right directory for the &lt;i&gt;RenderView &lt;/i&gt;method to find it.&amp;nbsp; The convention is &lt;i&gt;Components/[ComponentControllerName]/Views/[ViewName]&lt;/i&gt; directory.&amp;nbsp; In this case, the name of my controller is &lt;b&gt;&lt;i&gt;MyComponentController &lt;/i&gt;&lt;/b&gt;and the view name is &lt;b&gt;&lt;i&gt;CustomerOrderView&lt;/i&gt;&lt;/b&gt;&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;img src="https://aspblogs.blob.core.windows.net/media/mikebosch/Media/cc_02.png" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/Media/cc_02.png" height="216" width="234"&gt;&lt;br&gt;&lt;/p&gt;

&lt;p&gt;I'm not a big fan of forcing convention this since I may want to put my components wherever I please, but I digress.&amp;nbsp; Let's look at the controller.&lt;br&gt;&lt;br&gt;&lt;img src="https://aspblogs.blob.core.windows.net/media/mikebosch/Media/cc_01.png" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/Media/cc_01.png"&gt;&lt;br&gt;This very simple controller has a single action named &lt;i&gt;ShowCustomerOrders&lt;/i&gt;.&amp;nbsp; This method calls my order repository and returns a list of orders for a customer.&amp;nbsp; I will be able to use this on any view where I need a quick summary of the customer orders.&amp;nbsp; It accepts a &lt;i&gt;CustomerID &lt;/i&gt;and renders a view named &lt;i&gt;CustomerOrderView&lt;/i&gt;.&lt;br&gt;&lt;br&gt;From within the page, I'm using the lambda notion to make the call to this controller.&amp;nbsp; The Html helper has a method called "&lt;i&gt;RenderComponent&lt;/i&gt;".&amp;nbsp; I specify my component controller and the action it should call.&amp;nbsp; In this case we are passing the customer ID "1".&amp;nbsp;&amp;nbsp; This can be easily replaced with some of the view's &lt;i&gt;ViewData &lt;/i&gt;properties.&lt;br&gt;&lt;br&gt;&lt;img src="https://aspblogs.blob.core.windows.net/media/mikebosch/Media/cc_03.png" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/Media/cc_03.png" height="101" width="677"&gt;&lt;br&gt;&lt;/p&gt;

&lt;p&gt;Taking a look at the view that my component will render, we see it is a simple list using a strongly-typed &lt;i&gt;CustomerOrder[]&lt;/i&gt; as the &lt;i&gt;ViewData&lt;/i&gt;.&lt;br&gt;&lt;br&gt;&lt;img src="https://aspblogs.blob.core.windows.net/media/mikebosch/Media/cc_04.png" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/Media/cc_04.png"&gt;&lt;br&gt;&lt;/p&gt;

&lt;p&gt;That's all there is to it.&amp;nbsp; When we run the page, our customer orders show up where I placed the call to the &lt;i&gt;RenderComponent &lt;/i&gt;method. &amp;nbsp;&lt;br&gt;&lt;br&gt;Hope this helps!&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;i&gt;UPDATE&lt;/i&gt;&lt;/b&gt;:&amp;nbsp; I uploaded the source code for the example.&amp;nbsp; Download it &lt;a href="https://aspblogs.blob.core.windows.net/media/mikebosch/files/component-controller-example.zip" class="" mce_href="https://aspblogs.blob.core.windows.net/media/mikebosch/files/component-controller-example.zip"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-8343591294693797";
/* 468x60, created 5/22/08 */
google_ad_slot = "3204471724";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/script&gt;
&lt;script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"&gt;
&lt;/script&gt;
</description><pubDate>Mon, 10 Mar 2008 16:45:00 GMT</pubDate><guid isPermaLink="true">http://weblogs.asp.net:80/mikebosch/using-the-componentcontroller-in-asp-net-mvc</guid><category>ASP.NET</category><category>MVC</category></item><item><title>ASP.NET MVC Tip # 7 - Using a CAPTCHA with MVC</title><link>http://weblogs.asp.net:80/mikebosch/asp-net-mvc-tip-7-using-a-captcha-with-mvc</link><description>&lt;P mce_keep="true"&gt;&lt;STRONG&gt;Problem:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;You need a CAPTCHA to use when submitting forms in MVC&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;Solution:&lt;/STRONG&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;For this I will defer to an excellent explanation:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;A href="http://www.coderjournal.com/2008/03/aspnet-mvc-captcha/"&gt;http://www.coderjournal.com/2008/03/aspnet-mvc-captcha/&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;</description><pubDate>Fri, 07 Mar 2008 17:17:00 GMT</pubDate><guid isPermaLink="true">http://weblogs.asp.net:80/mikebosch/asp-net-mvc-tip-7-using-a-captcha-with-mvc</guid><category>ASP.NET</category><category>MVC</category></item><item><title>ASP.NET MVC Tip #6 - Code Snippets for Quickly Testing Routes</title><link>http://weblogs.asp.net:80/mikebosch/asp-net-mvc-code-snippets-for-quickly-testing-routes</link><description>
&lt;p&gt;&lt;b&gt;Scenario:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;You want to write some tests for your route configuration, but you &lt;i&gt;hate&lt;/i&gt; typing... &lt;/p&gt;
&lt;p&gt;&lt;b&gt;Solution:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;We can create some VS Code Snippets to generate most of the tests for you.&amp;nbsp; While messing around with &lt;a href="http://www.codeplex.com/Kigg" target="_blank" rel="nofollow" mce_href="http://www.codeplex.com/Kigg"&gt;Kigg&lt;/a&gt;, I got the idea to create some snippets to make writing the route tests a little simpler.&amp;nbsp; These snippets assume you are using &lt;b&gt;MbUnit &lt;/b&gt;and &lt;b&gt;Rhino Mocks&lt;/b&gt;.&amp;nbsp; You also need to have your references and imports set up correctly.&amp;nbsp; With these snippets you can create a full route test fixture with just two commands:&lt;/p&gt;
&lt;p&gt;mvcrtestfix - generate the test fixture class for your routes&lt;br&gt;&lt;/p&gt;
&lt;p&gt;mvcrtest - generate the test for a specific route&lt;/p&gt;
&lt;p&gt;The route test will generate code to check for the correct controller and action.&amp;nbsp; You can add additional asserts to check that values were passed in.&amp;nbsp; You can download a zip file with both snippets &lt;a href="https://aspblogs.blob.core.windows.net/media/mikebosch/files/MvcRouteTestingSnippets.zip" mce_href="https://aspblogs.blob.core.windows.net/media/mikebosch/files/MvcRouteTestingSnippets.zip"&gt;here&lt;/a&gt;.&amp;nbsp; Then just import them from VS Code Snippet Manager menu item and you'll have access to it in your IDE shortcuts.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://aspblogs.blob.core.windows.net/media/mikebosch/Media/mvc_tip_6.png" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/Media/mvc_tip_6.png"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;And here's some of the code it will generate for you with placeholders for you to edit.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://aspblogs.blob.core.windows.net/media/mikebosch/Media/mvc_tip_6_2.png" mce_src="https://aspblogs.blob.core.windows.net/media/mikebosch/Media/mvc_tip_6_2.png"&gt; &lt;br&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Hope this helps....&amp;nbsp;&lt;/p&gt;
</description><pubDate>Thu, 21 Feb 2008 12:00:00 GMT</pubDate><guid isPermaLink="true">http://weblogs.asp.net:80/mikebosch/asp-net-mvc-code-snippets-for-quickly-testing-routes</guid><category>ASP.NET</category><category>MVC</category></item></channel></rss>