<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.platinumbay.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Platinum Bay</title><link>http://www.platinumbay.com/blogs/</link><description>Peace, Love, Team System, and Community</description><dc:language>en-US</dc:language><generator>CommunityServer 2007 SP2 (Build: 20611.960)</generator><item><title>What is Community?</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/12/24/what-is-community.aspx</link><pubDate>Thu, 24 Dec 2009 11:00:00 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:912</guid><dc:creator>Steve</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;I’ve travelled the world and the seven seas… ok, ok, just North America, but since September of 2007 I’ve had the opportunity to visit nearly 100 community events from user group meetings, code camps, micro-conferences to major tradeshows such as Tech-Ed and PDC. During my travels I’ve been able to talk one on one with numerous user group leaders and influentials and there are widely varying views as to what community is. A lot of community leaders base their metrics on how many butts in a seat they were able to achieve at their latest meeting. I’m here to tell you my friends that this is not community. Not in the slightest. It’s an association, a club.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;True community is what happens outside of organized events.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Here are a couple thoughts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;How much time do you spend mentoring other developers?&lt;/strong&gt; &lt;a href="http://twitter.com/jeriley" target="_blank"&gt;Jesse Riley&lt;/a&gt; has a &lt;a href="http://blog.rileytech.net/post/2009/07/22/Mentorship-from-the-mentored-side.aspx" target="_blank"&gt;great post&lt;/a&gt; spawned by a &lt;a href="http://twitter.com/jimholmes" target="_blank"&gt;Jim Holmes&lt;/a&gt; talk on this. I’d recommend seeing Jim’s talk if you ever have the opportunity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do you invite your attendees out for food and/or adult beverages after each event?&lt;/strong&gt; This is a great way to not only build relationships, but to find motivated up-and-coming influentials and community leaders. Less than 10% of your attendees will regularly come out afterwards, but those that do tend to have the spark and can be mentored into strong community leaders themselves&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Is your Microsoft Developer Evangelist organizing all the events?&lt;/strong&gt; Some of the best Developer Evangelists I’ve met rarely organize events themselves, rather they support those that are already organizing events. If folks in your local community aren’t organizing events however, that’s a great opportunity to step up and be a leader.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do you make yourself available?&lt;/strong&gt; I make it a habit to freely share my personal contact info, and unless I’m overdue on a deadline (hypothetically speaking of course), I try to make myself available. For the record:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Phone: (610) 883-7667&lt;/li&gt;
&lt;li&gt;Email and Live Messenger: steve [at] platinumbay [dot] com&lt;/li&gt;
&lt;li&gt;Twitter: &lt;a href="http://twitter.com/SteveAndrews" target="_blank"&gt;SteveAndrews&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;
&lt;p&gt;To me, community is not about a place to hang my hat and pat&amp;nbsp;myself on the back. It’s a place where I can both learn and teach, mentor and be mentored, and build meaningful and lasting relationships with my peers. I’d encourage you to do the same.&lt;/p&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=912" width="1" height="1"&gt;</description><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Community/default.aspx">Community</category></item><item><title>Tips for Releasing Sample Code</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/12/23/tips-for-releasing-sample-code.aspx</link><pubDate>Wed, 23 Dec 2009 22:24:00 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:941</guid><dc:creator>Steve</dc:creator><slash:comments>4</slash:comments><description>&lt;p&gt;When I’m learning a new technology, I’ll frequently download code samples that help me better understand the concepts. Often though I find myself frustrated by having to deal with formatting and extraneous information before even looking at the code. To that end I have some rules for releasing sample code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Format Every Document &lt;br /&gt;&lt;/strong&gt;The keyboard shortcut for this is Ctrl+K+D. Nothing is more frustrating than looking at unformatted code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Code Order &lt;br /&gt;&lt;/strong&gt;Code&amp;nbsp;should be ordered in the following structure from top to bottom: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;events&lt;/li&gt;
&lt;li&gt;fields and automatic properties&lt;/li&gt;
&lt;li&gt;constructors&lt;/li&gt;
&lt;li&gt;abstract methods&lt;/li&gt;
&lt;li&gt;methods&lt;/li&gt;
&lt;li&gt;abstract properties&lt;/li&gt;
&lt;li&gt;properties&lt;/li&gt;
&lt;li&gt;subclasses&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Code Statements &lt;br /&gt;&lt;/strong&gt;Include a blank line before return statements and before and after decision blocks (including using, if, switch, while). In C#, opening and closing brackets&amp;nbsp;should be on their own line.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Remove Excess Blank Lines &lt;br /&gt;&lt;/strong&gt;There&amp;nbsp;should never be more than one consecutive blank line between any lines of code. With consecutive closing brackets as well as #endregion notations in C#, there should be no blank lines between them. There&amp;nbsp;should also be no blank lines between fields or at the beginning or end of method or property bodies.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Separate Code&lt;/strong&gt; &lt;br /&gt;There&amp;nbsp;should be one blank link between properties and methods to allow the user to see logical breaks in the code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Code Files&lt;/strong&gt; &lt;br /&gt;There&amp;nbsp;should only be one class, interface or enumeration per file.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;XML Comments &lt;br /&gt;&lt;/strong&gt;Always remove unnecessary XML comments from your code files. For example, this XML comment should be removed:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:gray;"&gt;/// &amp;lt;param name=&amp;quot;param&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;&lt;strong&gt;Import Namespace Placement &lt;br /&gt;&lt;/strong&gt;Import (C#) or using (VB) directives should be placed above the namespace. Also use the &lt;em&gt;Organize Usings &amp;gt; Remove and Sort&lt;/em&gt; refactoring built-in to Visual Studio 2008 and Visual Studio 2010 to remove any unnecessary directives. This also helps to make the directives more readable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wrapping Lines &lt;br /&gt;&lt;/strong&gt;Don’t manually wrap long lines of code. Visual Studio has a feature to allow a user to wrap long lines if they so choose.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Properties &lt;br /&gt;&lt;/strong&gt;Use automatic properties in .NET 3.0 code and above whenever possible.&lt;/p&gt;
&lt;p&gt;These are a few of the rules. I’ll try to keep the list updated as I run across more frustrations.&lt;/p&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=941" width="1" height="1"&gt;</description></item><item><title>Visual Studio Code Formatting</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/12/20/visual-studio-code-formatting.aspx</link><pubDate>Sun, 20 Dec 2009 11:39:13 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:933</guid><dc:creator>Steve</dc:creator><slash:comments>6</slash:comments><description>&lt;p&gt;Working on a website in Visual Studio I found myself annoyed again by the extra spaces around &lt;font face="Courier New"&gt;&amp;lt;script /&amp;gt;&lt;/font&gt; tags when I type Ctrl+K+D (Format Code). It turns out however that this is easy to change. As with most Visual Studio customizations, the answer lies in Tools &amp;gt; Options.&lt;/p&gt;  &lt;p&gt;Under Tools &amp;gt; Options &amp;gt; Text Editor &amp;gt; Html &amp;gt; Format, click the ‘Tag Specific Options…’ button. Under ‘Client HTML Tags’ find ‘script’. Finally, under ‘Line breaks’, change the default value from “2 Before opening, within, and 2 after closing” to “Before and After”, like the Rush song.&lt;/p&gt;  &lt;p&gt;This isn’t specific to HTML though, most of the languages under Text Editor support formatting options. Another change I typically make is for CSS to use the Compact rules.&lt;/p&gt;  &lt;p&gt;Happy Formatting!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.platinumbay.com/blogs/dotneticated/1220200962949_31E6FE18.png"&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="12-20-2009 6-29-49" border="0" alt="12-20-2009 6-29-49" src="http://www.platinumbay.com/blogs/dotneticated/1220200962949_thumb_6E1F9D35.png" width="644" height="448" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=933" width="1" height="1"&gt;</description></item><item><title>Help Rebuild New Orleans At Tech·Ed NOLA</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/12/14/help-rebuild-new-orleans-at-tech-183-ed-nola.aspx</link><pubDate>Tue, 15 Dec 2009 03:29:00 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:927</guid><dc:creator>Steve</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Just announced, &lt;a href="http://northamerica.msteched.com/default.aspx" target="_blank"&gt;registration is now open&lt;/a&gt; for Microsoft Tech·Ed 2010, June 7-10, in New Orleans, Louisiana. Tech·Ed isn’t the only reason you should come to New Orleans though.&lt;/p&gt;
&lt;p&gt;It has been four years since Hurricane Katrina devastated the gulf coast as the worst civil disaster in American history. It is estimated that 400,000 jobs were lost and 275,000 homes were destroyed, ten times as many as any other natural disaster in US history. The total cost is estimated at $100 billion in damages making Katrina&amp;nbsp;the most costly hurricane in US history. Up to 15 million people were affected by Hurricane Katrina, and New Orleans itself is still struggling to rebuild and&amp;nbsp;one of the biggest needs is for new housing.&lt;/p&gt;
&lt;p&gt;I&amp;#39;d like to help, so I have arranged for a volunteer group to work with Habitat for Humanity to help rebuild New Orleans on Saturday June 5th, 2010, the Saturday before Tech·Ed. This is your opportunity to help an area that still has immense need, as well as to network with fellow geeks and eat more shrimp and oyster poboys! You should try the fried alligator too.&lt;/p&gt;
&lt;p&gt;If you would like to volunteer to help rebuild New Orleans on Saturday, June 5th, 2010, please visit: &lt;a title="http://geekgive.org/geekgive/Project/techednola2010" href="http://geekgive.org/project/techednola2010"&gt;http://geekgive.org/project/techednola2010&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For more information about working with Habitat for Humanity, please read the &lt;a href="http://www.habitat-nola.org/files/1_FAQ.doc"&gt;FAQ&lt;/a&gt; (Microsoft Word) and &lt;a href="http://www.habitat-nola.org/files/NOAHH_Safety_Manual.doc"&gt;Safety Guidelines&lt;/a&gt; (Microsoft Word).&lt;/p&gt;
&lt;p&gt;I am also looking for sponsors to help with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hotel Discounts&lt;/li&gt;
&lt;li&gt;Transportation&lt;/li&gt;
&lt;li&gt;Breakfast&lt;/li&gt;
&lt;li&gt;Lunch&lt;/li&gt;
&lt;li&gt;Water&lt;/li&gt;
&lt;li&gt;After-Party&lt;/li&gt;
&lt;li&gt;$50 suggested donation to Habitat for Humanity per person to help cover work gloves and other costs&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;If you can help sponsor this volunteer event, please contact me at steve [at] platinumbay [dot] com.&lt;/p&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=927" width="1" height="1"&gt;</description><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Tech+Ed/default.aspx">Tech Ed</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Volunteering/default.aspx">Volunteering</category></item><item><title>Serialization Generics</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/12/07/serialization-generics.aspx</link><pubDate>Mon, 07 Dec 2009 11:05:00 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:922</guid><dc:creator>Steve</dc:creator><slash:comments>3</slash:comments><description>&lt;p&gt;I really dislike writing the same code over and over again. For my current project, this involves serialization and I ended up creating the following generic class to handle Xml serialization and thought it might be useful to someone else.&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;using &lt;/span&gt;System.Xml.Serialization;

&lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;SerializationHelper&lt;/span&gt;&amp;lt;T&amp;gt; &lt;span style="color:blue;"&gt;where &lt;/span&gt;T : &lt;span style="color:blue;"&gt;class
&lt;/span&gt;{
    &lt;span style="color:blue;"&gt;public string &lt;/span&gt;SerializeXml(T o)
    {
        &lt;span style="color:blue;"&gt;var &lt;/span&gt;serializer = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;XmlSerializer&lt;/span&gt;(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(T));

        &lt;span style="color:blue;"&gt;var &lt;/span&gt;sb = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;StringBuilder&lt;/span&gt;();
        &lt;span style="color:blue;"&gt;using &lt;/span&gt;(&lt;span style="color:blue;"&gt;var &lt;/span&gt;tw = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;StringWriter&lt;/span&gt;(sb))
        {
            serializer.Serialize(tw, o);
        }

        &lt;span style="color:blue;"&gt;return &lt;/span&gt;sb.ToString();
    }

    &lt;span style="color:blue;"&gt;public &lt;/span&gt;T DeserializeXml(&lt;span style="color:blue;"&gt;string &lt;/span&gt;text)
    {
        &lt;span style="color:blue;"&gt;var &lt;/span&gt;serializer = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;XmlSerializer&lt;/span&gt;(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(T));

        &lt;span style="color:blue;"&gt;using &lt;/span&gt;(&lt;span style="color:blue;"&gt;var &lt;/span&gt;tr = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;StringReader&lt;/span&gt;(text))
        {
            &lt;span style="color:blue;"&gt;return &lt;/span&gt;(T)serializer.Deserialize(tr);
        }
    }
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=922" width="1" height="1"&gt;</description><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/development/default.aspx">development</category></item><item><title>UX Fail</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/11/30/ux-fail.aspx</link><pubDate>Mon, 30 Nov 2009 10:23:00 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:914</guid><dc:creator>Steve</dc:creator><slash:comments>3</slash:comments><description>&lt;p&gt;I’ve been developing software for over ten years now. In those ten years software technology has grown by enormous leaps and bounds. User experience however has not. I’d argue that user experience has hardly improved at all, and I grow more and more frustrated at the wasted potential as indicated by these tweets from yesterday:&lt;/p&gt;
&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ok, ok, I love technology too, but mostly for it&amp;#39;s potential. I haven&amp;#39;t seen it live up to that yet.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;If I had to do it over, I&amp;#39;d be a loud and vocal critic of bad user experience. To that end, I registered uxfail.org.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;At the end of the day, most software *is* nothing more than user experience.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I bought the domain name UXFail.org and set up BlogEngine.NET to rant, vent, and hopefully help people improve the user experience of their software solutions. Visit the site, read the posts, and feel free to submit your own fails from the battlefield.&lt;/p&gt;
&lt;h2 align="center"&gt;&lt;a href="http://uxfail.org/"&gt;http://uxfail.org&lt;/a&gt;&lt;/h2&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=914" width="1" height="1"&gt;</description><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/UXFail/default.aspx">UXFail</category></item><item><title>Shotokan Development</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/11/28/shotokan-development.aspx</link><pubDate>Sun, 29 Nov 2009 01:07:00 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:909</guid><dc:creator>Steve</dc:creator><slash:comments>6</slash:comments><description>&lt;p&gt;&lt;em&gt;Note: There is still so much more I want to say on this topic, but that will have to wait for another post as I further distill my thoughts.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;At the end of my three week stint in Redmond, WA in October and November&amp;nbsp;I was thrilled to be able to support &lt;a href="http://twitter.com/saraford" target="_blank"&gt;Sara Ford&lt;/a&gt; as she tested for her second dan (second degree black belt) in Shotokan karate. Apart from being a cold and rainy night in Bellevue, it was a utterly humbling experience. The strength, speed, focus, and control of all those who tested for 1st, 2nd, and 3rd degree black belts was amazing. More so, what I experienced that evening has really started to change the way I think about software development and community in general.&lt;/p&gt;
&lt;p&gt;As an aside, Sara alone was so completely focused and exhibited such speed and control that I think my eyeballs melted and are just now recovering. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dojos and Schools of Thought&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;“A &lt;b&gt;dojo&lt;/b&gt; (道場, &lt;i&gt;dōjō&lt;/i&gt;) is a Japanese term which literally means &amp;quot;place of the way&amp;quot;. Initially, dojos were adjunct to temples. The term can refer to a formal training place for any of the Japanese &lt;i&gt;do&lt;/i&gt; arts but typically it is considered the formal gathering place for students of any Japanese martial arts style to conduct training, examinations and other related encounters.” – &lt;a href="http://en.wikipedia.org/wiki/Dojo" target="_blank"&gt;Wikipedia&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Each dojo is unique, both taking practice and methodology from those before them, and molding in their own style and techniques. More importantly though, no dojo is inherently wrong. There are no ‘my camp is better than your camp’ mantras. In the software developer community however, I find people taking sides on any number of issues: databases, version control, testing, design patterns, and even hardware. Similarly, such arguments often fail to take into account all the variables and environmental issues that must be considered to make a decision. This has long troubled me as I tend to be very pragmatic. Sure, I nag the heck out of folks on Twitter about Team Foundation Server and MSTest, but at the end of the day if they’re using a tool and TFS doesn’t solve any pain points they have with that tool then there is absolutely no reason to change. There is no one right answer. There can’t be. Life isn’t that simple.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Philosophies and Mindsets&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;quot;The ultimate aim of Karate lies not in victory or defeat, but in the perfection of the character of the participant.&amp;quot; - Gichin Funakoshi (1868–1957)&lt;/p&gt;
&lt;p&gt;In each Shotokan dojo, the precepts are displayed on a wall somewhere. These precepts typically include seeking perfection of character, being faithful, endeavoring to excel, and respecting others.&lt;/p&gt;
&lt;p&gt;Similarly, I believe that the goal of practicing software development should not be producing software, but rather to continually improve and subsequently solve real business needs. The real value of software is not technical. The real value of software is to improve someone’s life. Whether that involves automating a manual accounting system, building an e-commerce website to provide online revenue, or any other countless systems that software developers build. The philosophy of software development should also not just be about the technology. It should also encompass the attitude and character of the developer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Senseis and Teachers&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;From Japanese 先生 &lt;i&gt;sensei&lt;/i&gt;, literally &amp;quot;one who lived before&amp;quot; - &lt;a href="http://en.wiktionary.org/wiki/sensei" target="_blank"&gt;Wiktionary&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In Shotokan, the term Sensei is reserved for those who have achieved fourth dan or higher. Once achieving the sensei status, students are expected to start teaching others. It does not however mean the end of direct learning; senseis continue to be taught by those their senior. Teaching others is to be taught in return; I have been privileged to learn far more by teaching than by simply being taught.&lt;/p&gt;
&lt;p&gt;During the exam, I was immediately hit square in the face by the attitudes of the senseis: learning is never complete and the goal of any good teacher is to help the student improve. During the course of the exam, students were called out periodically for not having demonstrated a particular technique correctly. Many times they were made to re-do the technique solo with instruction from the senseis. Instead of ridiculing or degrading the student however, it was recognized as an important time to provide instruction to help the student become more proficient, and it was done in a loving and fatherly manner with the aim of helping the student improve, not improving the sensei’s position. In fact, it might even be considered shameful to dojo sensei in front of the guest seventh and ninth degree black belts who administered the exam. Nevertheless, the student’s success is their success.&lt;/p&gt;
&lt;p&gt;Unfortunately, I am seeing the opposite in software development. Mistakes or misunderstandings often seem to be used as opportunities to devalue someone and make them feel worthless, especially in non-physical environments such as Twitter and blogs. The underlying reasons for this lies in Relational Dynamics and the Lifeboat Syndrome (think high school), but that’s another topic entirely. At the end of the day though, anyone who attempts to teach or instruct without a real desire to help the student improve is not worthy the title sensei.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exams and Measurement&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The exams were broken up into three parts: Kihon, Kata, and Kumite. Kihon, the basics, involves demonstrating individual techniques such as kicks, punches, sweeps, strikes, blocks, and throws. Kata, or forms, is a sequence of choreographed movements sometimes up to ten minutes long that demonstrate Kihon as well as stepping, twisting, turning, dropping to the ground, and jumping. Kata is the practical application of Kihon; understanding perfection via repetition. Kumite, or fighting, is the practical application of Kihon with a real opponent through non-scripted sparring.&lt;/p&gt;
&lt;p&gt;In software technology, our current methods of evaluating an individual’s proficiency in a particular technology has been largely limited to Kihon. Do you know what framework class to use to send mail and the appropriate properties to set? What is the precision of a decimal? And yes, I’ve been asked both questions. The problem with solely using Kihon to test someone’s ability is that no matter how any particular test may be structured, it comes down to nothing more than rote memorization. Anyone can memorize the .NET framework’s namespaces and classes and answer multiple choice questions, but said individual may not have a clue as to how to use them appropriately or use multiple Kihons together in a Kata to form a more perfect solution.&lt;/p&gt;
&lt;p&gt;We as an industry need to find ways to more thoroughly evaluate an individual’s proficiency in a particular technology area or multiple technology areas. This means formulating ways to test individuals at a Kata and Kumite level. Some industries have worked to address this by adopted the idea of apprenticeship or internship.&amp;nbsp; During such a period, an individual works hands-on with a sensei who not only can evaluate the person’s Kihon, but also their Kata: reasoning, decision making, thought process, practical application, and can provide guidance to help the person improve. Finally, we need to test at the Kumite level before someone can be called a master at any particular level. Microsoft provides some of this in the form of the Masters exams, hands-on Q&amp;amp;A with other recognized masters. But we need a way to provide Kata and Kumite level evaluation at every level of a person’s career, not just the architect level.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Belts and Expertise&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;While the belt system varies somewhat by school, there are 6 levels of colored belts in Shotokan as a student approaches dan, the black belt. There are also ten levels of black belt. One amazing tidbit I learned about belts is that one has to wait 3-5 years before advancing to the next belt level. This could mean 50 or 60 years before reaching tenth dan, a lifetime of dedication. As Sara pointed out to me, “Karate is a way of life,” even if it means missing a Saint’s game.&lt;/p&gt;
&lt;p&gt;Our industry has tried to establish levels of expertise, typically using job titles such as Junior, Mid-Level, Senior, Architect. However, these title can be rather arbitrary as typically no real measure of proficiency has been evaluated other than a simple Kihon interview. As was mentioned above, we need a way to more thoroughly evaluate an individuals proficiency beyond rote memorization. This may include pair programming as part of the interview process (Kata), complex situational analysis for an optimal solution (Kumite), and test-driven technical skills analysis (Kihon/Kata).&lt;/p&gt;
&lt;p&gt;[Similarly, many companies fall victim to the mentality that hiring a team of yellow belt (junior) developers will have the same result as one second degree black belt (senior or architect) developer. This is just simply not the case.]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Shotokan Development&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So what would Shotokan development look like? Hypothetically:&lt;/p&gt;
&lt;p&gt;First, there would be dojos: schools of similar thought, each one able to reach the same goals though maybe through differing techniques and technology.&lt;/p&gt;
&lt;p&gt;Second, there would be senseis who are the proven masters of their domain who would teach, encourage, and instruct their students, always in a positive manner towards the betterment of the student.&lt;/p&gt;
&lt;p&gt;Finally, there would be belts: skills, techniques and attitudes demonstrated using Kihon, Kata and Kumite to earn the next level.&lt;/p&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=909" width="1" height="1"&gt;</description><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/development/default.aspx">development</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Community/default.aspx">Community</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/shotokan/default.aspx">shotokan</category></item><item><title>NotAtPDC is back!</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/11/16/notatpdc-is-back.aspx</link><pubDate>Mon, 16 Nov 2009 06:55:30 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:901</guid><dc:creator>Steve</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;It’s official, we’re back again this year. As you may recall, a bunch of tweeps got together last year to organize an online-only co-conference with PDC. The results and reaction where outstanding, and we’ve decided to do it again.&lt;/p&gt;  &lt;p&gt;Keep an eye on the website (&lt;a href="http://www.NotAtPDC.com"&gt;http://www.NotAtPDC.com&lt;/a&gt;) as well as the Twitter account (&lt;a href="http://twitter.com/notatpdc" target="_blank"&gt;@NotAtPDC&lt;/a&gt;) for details and info.&lt;/p&gt;  &lt;p&gt;Want to present? &lt;a href="http://www.notatpdc.com/Schedule/Propose" target="_blank"&gt;Sign up&lt;/a&gt; on the site with your session info.&lt;/p&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=901" width="1" height="1"&gt;</description></item><item><title>Team Build Property Reference Guide</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/10/11/team-build-property-reference-guide.aspx</link><pubDate>Mon, 12 Oct 2009 02:46:00 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:892</guid><dc:creator>Steve</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;&lt;a href="http://www.platinumbay.com/blogs/postimages/TeamBuildProperty_130F6/TeamBuildPropertyTargetReference.png"&gt;&lt;img src="http://www.platinumbay.com/blogs/postimages/TeamBuildProperty_130F6/TeamBuildPropertyTargetReference_thumb.png" title="TeamBuildPropertyTargetReference" style="border:0px none;margin:0px 0px 0px 20px;display:inline;" alt="TeamBuildPropertyTargetReference" align="right" border="0" height="451" width="192" /&gt;&lt;/a&gt;I’ve been working quite a bit with Team Build lately, and overriding properties is a method of customization I’ve found quite useful in certain scenarios. Along the way, I found Aaron Hallberg’s excellent &lt;a href="http://blogs.msdn.com/aaronhallberg/archive/2008/02/12/team-build-2008-property-reference.aspx" title="Team Build 2008 Property Reference by Aaron Hallberg" target="_blank"&gt;Team Build 2008 Property Reference&lt;/a&gt; blog post, but it didn’t show me where the properties were referenced. In fact, there isn’t an easy way to determine where any particular Property is being used or set other than reading through the 1,500 lines in the Microsoft.TeamFoundation.Build.targets file. I decided to spend a few hours, read through the file myself, and compile a chart of each Property, what Target it is referenced by, and how it is referenced.&lt;/p&gt;  &lt;p&gt;Hopefully the chart is self-explanatory, but here’s some tips:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Target names are along the horizontal axis&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Base represents the root of the Targets file where global Properties are set&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Property names are along the vertical axis&lt;/li&gt;    &lt;li&gt;Legend&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Set: The Property is Set inside the Target. In the case of &lt;/li&gt;      &lt;li&gt;Used: The Property is used inside the Target&lt;/li&gt;      &lt;li&gt;Condition: The Target or a contained Task references the Property in a condition&lt;/li&gt;      &lt;li&gt;Error If Exists: Team Build will throw an exception if the Property is set, or not set, under the right conditions&lt;/li&gt;      &lt;li&gt;Null Error: Team Build will throw an exception if the Property is null&lt;/li&gt;      &lt;li&gt;Depends On: The target has a DependsOn for the Property. The Property contains a semi-colon delimited list of Target names&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;I do not claim the chart to be 100% without error, so verify before you use it. Please send any updates or corrections to me.&lt;/p&gt;  &lt;p&gt; As a side note, if you are working with Team Build, Aaron Hallberg’s &lt;a href="http://blogs.msdn.com/aaronhallberg" title="MSDN - Aaron Hallberg" target="_blank"&gt;blog&lt;/a&gt; is choked full of Team Build goodness.&lt;/p&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=892" width="1" height="1"&gt;</description><enclosure url="http://www.platinumbay.com/blogs/dotneticated/attachment/892.ashx" length="27893" type="application/vnd.openxmlformats-officedocument.spre" /><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/TFS/default.aspx">TFS</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Team+Foundation/default.aspx">Team Foundation</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Team+Build/default.aspx">Team Build</category></item><item><title>Neat Visual Studio Test Options</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/09/25/neat-visual-studio-test-options.aspx</link><pubDate>Fri, 25 Sep 2009 04:17:50 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:881</guid><dc:creator>Steve</dc:creator><slash:comments>3</slash:comments><description>&lt;p&gt;Digging around in Tools &amp;gt; Options today to find the answer to an inquiry I received, I found some stuff I didn’t know existed. If you work with Visual Studio Test Projects, you will want to know about these options. The Test Tools options are found in Tools &amp;gt; Options &amp;gt; Test Tools.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Test Execution Options&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The original question I received was from someone asking how to reduce the number of test results that Visual Studio kept around after test runs. The answer lies in the Test Execution options under Test Result Management. There is an option there labeled “Limit number of old Test Results to.” By default, this value is set to 25. While 25 may be an ideal setting if you are running a multitude of test runs and want to compare results, for most of us this is overkill. Personally I set it to three, and that tells Visual Studio to clean up results older than three runs.&lt;/p&gt;  &lt;p&gt;Also take note of the checkbox below it labeled “Double-clicking a Failed or Inconclusive unit test result displays the point of failure in the test.” When you double-click on a failed or inconclusive unit test result, you will no longer be taken to a test result report. Rather, you will be taken to the line of code that failed in the test.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.platinumbay.com/blogs/postimages/VisualStudioTestOptions_11FB7/image.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="367" alt="image" src="http://www.platinumbay.com/blogs/postimages/VisualStudioTestOptions_11FB7/image_thumb.png" width="640" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Test Project Options&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I have always been frustrated when test projects were created with the “About Test Projects” introduction file and the Manual Test. The next step after creation for me was always to delete these items. In digging around today, I discovered that what files are created with test projects is configurable. Under the Test Project node, you will find a two side-by-side list boxes at the bottom of the settings pane. The left side allows you to select a language-specific test project, and the right side contains checkboxes allowing you to specify which files are included by default.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.platinumbay.com/blogs/postimages/VisualStudioTestOptions_11FB7/image_3.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="367" alt="image" src="http://www.platinumbay.com/blogs/postimages/VisualStudioTestOptions_11FB7/image_thumb_3.png" width="640" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I’m sure you will find these tips as useful as I have, I know they’ll be making their way into my Visual Studio Tips and Tricks talk.&lt;/p&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=881" width="1" height="1"&gt;</description><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Tips/default.aspx">Tips</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Visual+Studio+2008/default.aspx">Visual Studio 2008</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/MSTest/default.aspx">MSTest</category></item><item><title>jQuery and MVC: JSON Form Submission</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/08/31/jquery-and-mvc-json-form-submission.aspx</link><pubDate>Tue, 01 Sep 2009 02:33:00 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:865</guid><dc:creator>Steve</dc:creator><slash:comments>8</slash:comments><description>&lt;p&gt;In my last two posts (&lt;a href="http://www.platinumbay.com/blogs/dotneticated/archive/2009/08/28/jquery-and-mvc-json.aspx" target="_blank"&gt;jQuery and MVC: JSON&lt;/a&gt; and &lt;a href="http://www.platinumbay.com/blogs/dotneticated/archive/2009/08/29/favorite-image-icons-with-jquery-and-mvc.aspx" target="_blank"&gt;Favorite Image Icons with jQuery and MVC&lt;/a&gt;) I covered some basics of jQuery’s AJAX functionality to improve user experience. One of the scenarios which may not seem particularly asynchronous friendly is form submission. Fortunately, jQuery provides for asynchronous post, and in JSON format too.&lt;/p&gt;  &lt;p&gt;The complete code to perform this is:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;$(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;#39;form&amp;#39;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;).submit(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;function&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;(e) {&lt;br /&gt;    e.preventDefault();&lt;br /&gt;    $.post($(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;this&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;).attr(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;action&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;), $(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;this&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;).serialize(), &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;function&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;(json) {&lt;br /&gt;        &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:green;"&gt;// handle response&lt;br /&gt;    &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;}, &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;json&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;);&lt;br /&gt;});&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;First, get a jQuery reference to the form element and add a submit event handler:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;$(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;#39;form&amp;#39;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;).submit(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;function&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;(e) {&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Next, we need to cancel the form’s default behavior by using the &lt;font face="courier new,courier"&gt;preventDefault &lt;/font&gt;function:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;e.preventDefault();&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Next, and this is the cool part, we call the post method in jQuery. The post method takes four arguments: url, data, callback, and type. The first three should be familiar from the previous blog posts, but the last one is new. The type parameter specifies the type of data and accepts &amp;quot;xml&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;script&amp;quot;, &amp;quot;json&amp;quot;, &amp;quot;jsonp&amp;quot;, or &amp;quot;text&amp;quot;. The example above is using JSON.

&lt;p&gt;Rather than hard coding the url, it can be retrieved from the form element itself:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;$(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;this&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;).attr(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;action&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;)&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;And rather than manually pulling form fields into the data object, as the form may change, we can call jQuery’s &lt;font face="courier new,courier"&gt;serialize &lt;/font&gt;function on the form itself:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;$(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;this&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;).serialize()&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Finally, we can tie it all together with an MVC action. This example uses the Employee entity from the Northwind database. Since the identifier on the Employee entity is EmployeeID and not ID, &lt;font face="courier new,courier"&gt;id &lt;/font&gt;needs to be specified as an action parameter in order to retrieve the correct employee from the database.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;[&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;AcceptVerbs&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;HttpVerbs&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;.Post)]&lt;br /&gt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;public &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;JsonResult &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;Edit(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;int &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;id, &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;Employee &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;employee)&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:green;"&gt;// do work&lt;br /&gt;    &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;return new &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;JsonResult &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;{ Data = &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;new &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;{ Success = &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;true &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;} };&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;One common scenario for this functionality is to provide asynchronous searching within a page. Even asynchronous form submits are possible with jQuery, making your arsenal that much more powerful.&lt;/p&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=865" width="1" height="1"&gt;</description><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/jQuery/default.aspx">jQuery</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/MVC/default.aspx">MVC</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/JSON/default.aspx">JSON</category></item><item><title>Favorite Image Icons with jQuery and MVC</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/08/29/favorite-image-icons-with-jquery-and-mvc.aspx</link><pubDate>Sun, 30 Aug 2009 00:01:00 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:855</guid><dc:creator>Steve</dc:creator><slash:comments>6</slash:comments><description>&lt;p&gt;User experience, that’s the name of the game these days. Green screens and console applications are (hopefully) becoming a thing of the past. In the web world, this means a more fluid and asynchronous experience. In my &lt;a href="http://www.platinumbay.com/blogs/dotneticated/archive/2009/08/28/jquery-and-mvc-json.aspx" target="_blank"&gt;last post&lt;/a&gt;, I gave a quick introduction to using jQuery and MVC to perform asynchronous requests to the browser. In this post, I will expand on that topic and show how to build a favorite image icon.&lt;/p&gt;  &lt;p&gt;The concept is pretty simple. For example, in the Twitter web UI, an empty star image appears on the right side of a tweet if you mouse over it.If the star is clicked, the icon changes to a flashing dot, and then to a yellow star indicating that the tweet has been favorited. It’s a neat, asynchronous effect, and it’s fairly simple to achieve.&lt;/p&gt;  &lt;p&gt;First, we need three images. Here are the images that Twitter uses:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.platinumbay.com/blogs/postimages/FavoriteImageIconswithjQueryandMVC_F909/icon_throbber.gif"&gt;&lt;img src="http://www.platinumbay.com/blogs/postimages/FavoriteImageIconswithjQueryandMVC_F909/icon_throbber_thumb.gif" title="" style="border:0px none;display:inline;" alt="" width="16" border="0" height="16" /&gt;&lt;/a&gt; &lt;a href="http://www.platinumbay.com/blogs/postimages/FavoriteImageIconswithjQueryandMVC_F909/icon_star_empty.gif"&gt;&lt;img src="http://www.platinumbay.com/blogs/postimages/FavoriteImageIconswithjQueryandMVC_F909/icon_star_empty_thumb.gif" title="" style="border:0px none;display:inline;" alt="" width="16" border="0" height="16" /&gt;&lt;/a&gt; &lt;a href="http://www.platinumbay.com/blogs/postimages/FavoriteImageIconswithjQueryandMVC_F909/icon_star_full.gif"&gt;&lt;img src="http://www.platinumbay.com/blogs/postimages/FavoriteImageIconswithjQueryandMVC_F909/icon_star_full_thumb.gif" title="" style="border:0px none;display:inline;" alt="" width="16" border="0" height="16" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Next, a CSS style is defined for the off, on, and loading states. The purpose of each style is to allow style switching to not only change the picture, but also to allow the state to be determined through the style class assigned.&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;.favimgoff&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;, &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;.favimgon&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;, &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;.imgload&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt; &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;{ &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:red;"&gt;width&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;: &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;16px&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;; &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:red;"&gt;height&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;: &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;16px&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;; &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:red;"&gt;border&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;: &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;0px&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;; &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:red;"&gt;background-repeat&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;: &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;no-repeat&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;; &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;.favimgoff &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;{ &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:red;"&gt;background-image&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;: &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;url(images/icon_star_empty.gif)&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;; }&lt;br /&gt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;.favimgon &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;{ &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:red;"&gt;background-image&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;: &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;url(images/icon_star_full.gif)&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;; }&lt;br /&gt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;.imgload &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;{ &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:red;"&gt;background-image&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;: &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;url(images/icon_throbber.gif)&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;; }&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;On the MVC side, an action is needed to handle the server processing.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;public &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;JsonResult &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;SetOrRemoveUserFavorite(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;int &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;favoriteId)&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;JsonResult &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;result = &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;new &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;JsonResult&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;();&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:green;"&gt;// do work here, and set SetOn to the proper state&lt;br /&gt;    &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;result.Data = &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;new &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;{ Success = &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;true&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;, SetOn = &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;true &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;};&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;return &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;result;&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Next, on the client side, add an image tag with the class attribute and id set. The image is set to a one pixel transparent gif otherwise certain browsers may not render the background image.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;img &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:red;"&gt;class&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;=&amp;quot;favimgoff&amp;quot; &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:red;"&gt;src&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;= Url.Content(&amp;quot;~/Content/images/spacer.gif&amp;quot;)&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;&amp;quot; &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:red;"&gt;id&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;=&amp;quot;1&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Finally, jQuery on the client side takes care of the tying it all together:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;$(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;#39;.favimgoff, .favimgon&amp;#39;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;).click(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;function&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;() {&lt;br /&gt;    &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;var &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;$favimg = $(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;this&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;);&lt;br /&gt;    &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;if &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;($favimg.attr(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;#39;class&amp;#39;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;) != &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;#39;imgload&amp;#39;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;) {&lt;br /&gt;        $favimg.removeClass().addClass(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;#39;imgload&amp;#39;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;);&lt;br /&gt;        $.getJSON(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;#39;&amp;lt;%= Url.Action(&amp;quot;SetOrRemoveUserFavorite&amp;quot;, &amp;quot;Services&amp;quot;) %&amp;gt;&amp;#39;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;, {&lt;br /&gt;            favoriteId: $favimg.attr(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;)&lt;br /&gt;        }, &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;function&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;(json) {&lt;br /&gt;            &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;if &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;(json.Success) {&lt;br /&gt;                &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;if &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;(json.SetOn) {&lt;br /&gt;                    $favimg.removeClass().addClass(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;#39;favimgon&amp;#39;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;);&lt;br /&gt;                } &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;else &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;{&lt;br /&gt;                    $favimg.removeClass().addClass(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;#39;favimgoff&amp;#39;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;else &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;{&lt;br /&gt;                alert(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;#39;Favorite could not be set. Please refresh the page and try again.&amp;#39;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;);&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;    }&lt;br /&gt;});&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Let’s step through the jQuery script. First, define the click event handler for both classes, and get a reference to the image clicked:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;$(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;#39;.favimgoff, .favimgon&amp;#39;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;).click(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;function&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;() {&lt;br /&gt;    &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;var &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;$favimg = $(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;this&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;);&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Next, to avoid any duplicate action taken while the process is run, make sure the image isn’t in the loading state. This is necessary because jQuery will still have an event reference to the original image even when the class changes from the original two classes of on or off.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;if &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;($favimg.attr(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;#39;class&amp;#39;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;) != &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;#39;imgload&amp;#39;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;) {&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Next, remove any existing class and add the loading class so the user gets feedback that their action is being processed:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;$favimg.removeClass().addClass(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;#39;imgload&amp;#39;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;);&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Then, make a server call to the action defined, and pass the id of the item as a parameter to the action:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;$.getJSON(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;#39;&amp;lt;%= Url.Action(&amp;quot;SetOrRemoveUserFavorite&amp;quot;, &amp;quot;Services&amp;quot;) %&amp;gt;&amp;#39;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;, {&lt;br /&gt;    favoriteId: $favimg.attr(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;)&lt;br /&gt;}, &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;function&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;(json) {&lt;br /&gt;    &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;if &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;(json.Success) {&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Finally, based on the &lt;font face="courier new,courier"&gt;SetOn &lt;/font&gt;value returned from the server call, remove the loading class and set the appropriate class:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;if &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;(json.SetOn) {&lt;br /&gt;    $favimg.removeClass().addClass(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;#39;favimgon&amp;#39;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;);&lt;br /&gt;} &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;else &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;{&lt;br /&gt;    $favimg.removeClass().addClass(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;#39;favimgoff&amp;#39;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;);&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;If by chance the server call fails and &lt;font face="courier new,courier"&gt;Success &lt;/font&gt;is false, alert the user:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;alert(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;#39;Favorite could not be set. Please refresh the page and try again.&amp;#39;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;);&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;That’s it. Utilizing the baked-in goodness of jQuery and ASP.NET MVC, providing a rich, asynchronous user experience doesn’t have to be complex.&lt;/p&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=855" width="1" height="1"&gt;</description><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/jQuery/default.aspx">jQuery</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/MVC/default.aspx">MVC</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/JSON/default.aspx">JSON</category></item><item><title>jQuery and MVC: JSON</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/08/28/jquery-and-mvc-json.aspx</link><pubDate>Fri, 28 Aug 2009 23:09:00 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:852</guid><dc:creator>Steve</dc:creator><slash:comments>4</slash:comments><description>&lt;p&gt;I strongly dislike synchronous browser requests: the request has to be sent to the server, server action is performed, a server response is received, and the page is re-rendered which usually involves reloading images, style sheets, JavaScript files, etc. It takes time, sends an awful lot of traffic across the wire, and it doesn’t provide for the best user experience. In some scenarios this makes sense, but in most cases I find it to be an annoyance.&lt;/p&gt;  &lt;p&gt;Enter jQuery to the rescue. jQuery is the most exciting innovation to happen to JavaScript since, well, maybe JavaScript itself. One of the jQuery features I enjoy the most is the AJAX functionality which allows jQuery to talk to the server asynchronously, or behind the scenes.&lt;/p&gt;  &lt;p&gt;I personally like to use the JSON (JavaScript Object Notion) format, which is lighter-weight than XML. Using jQuery, a JSON GET request is written as:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;$.getJSON(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;#39;[url]&amp;#39;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;, { [parameters] }, &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;function&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;(json) {&lt;br /&gt;    &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:green;"&gt;// callback function code&lt;br /&gt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;});&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Let’s say I want to perform an asynchronous search in my web page for people names without having to reload the page. In MVC, I need an action to handle the request:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;public class &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;SearchController &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;: &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;Controller&lt;br /&gt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;string&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;[] peopleNames = &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;new&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;[] { &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;Bob&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;, &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;Steve&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;, &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;Joe&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;, &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;Frank&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;, &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;Lou&amp;quot; &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;};&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;public &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;JsonResult &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;Search(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;string &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;q)&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;var &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;results = peopleNames.Where(n =&amp;gt; n.Contains(q));&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;if &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;(results.Count() &amp;gt; 0)&lt;br /&gt;            &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;return new &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;JsonResult&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt; { Data = &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;new &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;{ Success = &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;true&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;, Results = results } };&lt;br /&gt;        &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;else&lt;br /&gt;            return new &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;JsonResult&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt; { Data = &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;new &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;{ Success = &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;false &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;} };&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;The first thing to notice is the built-in &lt;font face="courier new,courier"&gt;JsonResult &lt;/font&gt;type on the Search action. MVC understands and is able to handle JSON data. Simply return a &lt;font face="courier new,courier"&gt;JsonResult &lt;/font&gt;object and populate the &lt;font face="courier new,courier"&gt;Data &lt;/font&gt;property with the data to be returned. The serialization of that data is handled under the covers.&lt;/p&gt;

&lt;p&gt;Back in the MVC View, call &lt;font face="courier new,courier"&gt;getJSON &lt;/font&gt;to make a request to the action and handle the response:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;$.getJSON(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;#39;&amp;lt;%= Url.Action(&amp;quot;Search&amp;quot;, &amp;quot;Search&amp;quot;) %&amp;gt;&amp;#39;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;, { q: $(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;#39;input#search&amp;#39;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;) }, &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;function&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;(json) {&lt;br /&gt;    &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;if &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;(json.Success) {&lt;br /&gt;        &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:green;"&gt;// results found&lt;br /&gt;    &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;}&lt;br /&gt;    &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;else &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;{&lt;br /&gt;        &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:green;"&gt;// nothing found&lt;br /&gt;    &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;}&lt;br /&gt;});&lt;/span&gt;&lt;/pre&gt;
Note that &lt;font face="courier new,courier"&gt;Url.Action&lt;/font&gt; is used to get the virtual url. &lt;font face="courier new,courier"&gt;Url.Action&lt;/font&gt; and &lt;font face="courier new,courier"&gt;Url.Content&lt;/font&gt; are great ways to handle relative paths. Next, the search query is passed from an input field with an ID of search. And finally, the callback is handled. jQuery handles the deserialization under the covers, and the values can be handled as simple properties.

&lt;p&gt;The introduction of ASP.NET MVC and jQuery make asynchronous calls very quick and easy, and help to provide the end user with a better experience. In future posts, we’ll look at more specific examples of utilizing jQuery and MVC to provide a better user experience.&lt;/p&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=852" width="1" height="1"&gt;</description><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/jQuery/default.aspx">jQuery</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/MVC/default.aspx">MVC</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/JSON/default.aspx">JSON</category></item><item><title>Reflection-Based Performance Analysis</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/08/28/reflection-based-performance-analysis.aspx</link><pubDate>Fri, 28 Aug 2009 08:51:04 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:847</guid><dc:creator>Steve</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;Back in 2007, I took some SharePoint training from Todd Bleaker (MVP, owner of MindSharp, and SharePoint guru). At one point he posed a question about the performance of the following methods:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="background:#fefefe;color:blue;"&gt;public string &lt;/span&gt;&lt;span style="background:#fefefe;"&gt;OptionOne()
{
    &lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;string &lt;/span&gt;&lt;span style="background:#fefefe;"&gt;str = &lt;/span&gt;&lt;span style="background:#fefefe;color:#a31515;"&gt;&amp;quot;Hello World&amp;quot;&lt;/span&gt;&lt;span style="background:#fefefe;"&gt;;
    &lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;return &lt;/span&gt;&lt;span style="background:#fefefe;"&gt;str;
}

&lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;public string &lt;/span&gt;&lt;span style="background:#fefefe;"&gt;OptionTwo()
{
    &lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;string &lt;/span&gt;&lt;span style="background:#fefefe;"&gt;str;
    str = &lt;/span&gt;&lt;span style="background:#fefefe;color:#a31515;"&gt;&amp;quot;Hello World&amp;quot;&lt;/span&gt;&lt;span style="background:#fefefe;"&gt;;
    &lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;return &lt;/span&gt;&lt;span style="background:#fefefe;"&gt;str;
}

&lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;public string &lt;/span&gt;&lt;span style="background:#fefefe;"&gt;OptionThree()
{
    &lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;string &lt;/span&gt;&lt;span style="background:#fefefe;"&gt;str = &lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;null&lt;/span&gt;&lt;span style="background:#fefefe;"&gt;;
    str = &lt;/span&gt;&lt;span style="background:#fefefe;color:#a31515;"&gt;&amp;quot;Hello World&amp;quot;&lt;/span&gt;&lt;span style="background:#fefefe;"&gt;;
    &lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;return &lt;/span&gt;&lt;span style="background:#fefefe;"&gt;str;
}

&lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;public string &lt;/span&gt;&lt;span style="background:#fefefe;"&gt;OptionFour()
{
    &lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;return &lt;/span&gt;&lt;span style="background:#fefefe;color:#a31515;"&gt;&amp;quot;Hello World&amp;quot;&lt;/span&gt;&lt;span style="background:#fefefe;"&gt;;
}&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;I took the challenge and wrote the above methods. Then to evaluate the probable performance I compiled the code and opened the resulting assembly in Reflector. Here is the Reflector output:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="background:#fefefe;color:blue;"&gt;public string &lt;/span&gt;&lt;span style="background:#fefefe;"&gt;OptionOne()
{
    &lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;return &lt;/span&gt;&lt;span style="background:#fefefe;color:#a31515;"&gt;&amp;quot;Hello World&amp;quot;&lt;/span&gt;&lt;span style="background:#fefefe;"&gt;;
}

&lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;public string &lt;/span&gt;&lt;span style="background:#fefefe;"&gt;OptionTwo()
{
    &lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;return &lt;/span&gt;&lt;span style="background:#fefefe;color:#a31515;"&gt;&amp;quot;Hello World&amp;quot;&lt;/span&gt;&lt;span style="background:#fefefe;"&gt;;
}

&lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;public string &lt;/span&gt;&lt;span style="background:#fefefe;"&gt;OptionThree()
{
    &lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;return &lt;/span&gt;&lt;span style="background:#fefefe;color:#a31515;"&gt;&amp;quot;Hello World&amp;quot;&lt;/span&gt;&lt;span style="background:#fefefe;"&gt;;
}

&lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;public string &lt;/span&gt;&lt;span style="background:#fefefe;"&gt;OptionFour()
{
    &lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;return &lt;/span&gt;&lt;span style="background:#fefefe;color:#a31515;"&gt;&amp;quot;Hello World&amp;quot;&lt;/span&gt;&lt;span style="background:#fefefe;"&gt;;
}&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;You may notice that all the methods appear the same. What happened? Compiler optimization? To find out I checked the IL, shown below:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="background:#fefefe;"&gt;.method public hidebysig instance string OptionOne() cil managed
{
    .maxstack 1
    .locals init (
        [0] string str,
        [1] string CS$1$0000)
    L_0000: nop 
    L_0001: ldstr &amp;quot;Hello World&amp;quot;
    L_0006: stloc.0 
    L_0007: ldloc.0 
    L_0008: stloc.1 
    L_0009: br.s L_000b
    L_000b: ldloc.1 
    L_000c: ret 
}

.method public hidebysig instance string OptionTwo() cil managed
{
    .maxstack 1
    .locals init (
        [0] string str,
        [1] string CS$1$0000)
    L_0000: nop 
    L_0001: ldstr &amp;quot;Hello World&amp;quot;
    L_0006: stloc.0 
    L_0007: ldloc.0 
    L_0008: stloc.1 
    L_0009: br.s L_000b
    L_000b: ldloc.1 
    L_000c: ret 
}

.method public hidebysig instance string OptionThree() cil managed
{
    .maxstack 1
    .locals init (
        [0] string str,
        [1] string CS$1$0000)
    L_0000: nop 
    L_0001: ldnull 
    L_0002: stloc.0 
    L_0003: ldstr &amp;quot;Hello World&amp;quot;
    L_0008: stloc.0 
    L_0009: ldloc.0 
    L_000a: stloc.1 
    L_000b: br.s L_000d
    L_000d: ldloc.1 
    L_000e: ret 
}

.method public hidebysig instance string OptionFour() cil managed
{
    .maxstack 1
    .locals init (
        [0] string CS$1$0000)
    L_0000: nop 
    L_0001: ldstr &amp;quot;Hello World&amp;quot;
    L_0006: stloc.0 
    L_0007: br.s L_0009
    L_0009: ldloc.0 
    L_000a: ret 
}&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;What is really happening is that Reflector is making a best guess optimization as to what the original code looked like. We can clearly see in the IL that OptionFour is probably the most performant, and OptionThree is probably the least. This is because OptionThree is loading a null and storing it in local 1, then loading the string and storing it in the same location, making the first load unnecessary.&lt;/p&gt;

&lt;p&gt;Reflector can be a great tool to use for analyzing possible performance, as well as debugging assemblies. If you don’t have it, download it today: &lt;a href="http://www.red-gate.com/products/reflector/"&gt;www.red-gate.com/products/reflector/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=847" width="1" height="1"&gt;</description><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Reflector/default.aspx">Reflector</category></item><item><title>Running T4 Templates with MSBuild</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/08/28/running-t4-templates-with-msbuild.aspx</link><pubDate>Fri, 28 Aug 2009 07:55:00 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:846</guid><dc:creator>Steve</dc:creator><slash:comments>6</slash:comments><description>&lt;p&gt;If you haven’t explored T4 yet, you’re missing one of Visual Studio’s best, and best kept, secrets. T4, which stands for Text Templating Transformation Toolkit, is code generation built right into Visual Studio 2008. It is also available in Visual Studio 2005 if you install the Visual Studio SDK. It is a great feature that I use quite frequently to automate repetitive tasks.&lt;/p&gt;  &lt;p&gt;T4 template execution only occurs though when the template file is open in the editor and saved. In other words, template execution does not occur when you type &lt;font face="courier new,courier"&gt;Ctrl+B&lt;/font&gt; to build the project. There are scenarios however where execution of the templates at every build is the desired behavior.&lt;/p&gt;  &lt;p&gt;I did find several custom MSBuild tasks to perform this behavior, but I wanted to avoid additional assembly references. Instead, the following custom MSBuild target was created to address this.&lt;/p&gt;  &lt;p&gt;First and foremost, a .targets file is created in the MSBuild directory (%systemdrive%:\Windows\Microsoft.NET\Framework\v3.5):&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;xml &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:red;"&gt;version&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;=&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;1.0&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot; &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:red;"&gt;encoding&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;=&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;utf-8&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;?&amp;gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;Project &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;=&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;http://schemas.microsoft.com/developer/msbuild/2003&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;Target &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:red;"&gt;Name&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;=&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;ExecuteT4Templates&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;&amp;gt;&lt;br /&gt;        &amp;lt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;ItemGroup&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;&amp;gt;&lt;br /&gt;            &amp;lt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;T4Templates &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:red;"&gt;Include&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;=&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;.\**\*.tt&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot; &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;/&amp;gt;&lt;br /&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;ItemGroup&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;Exec&lt;br /&gt;            &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:red;"&gt;WorkingDirectory&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;=&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;C:\Program Files\Common Files\microsoft shared\TextTemplating\1.2\&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;&lt;br /&gt;            &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:red;"&gt;Command&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;=&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;TextTransform &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:red;"&gt;&amp;amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;%(T4Templates.FullPath)&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:red;"&gt;&amp;amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot; &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;/&amp;gt;&lt;br /&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;Target&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;Project&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;There are a couple important things to note. First, a custom target is created, and an item group is added to the target. In the item group, we create a new item called T4Templates that will recurse the project and hold information for each text template that is found. Finally, an execute task is added which calls &lt;font face="courier new,courier"&gt;TextTransform.exe&lt;/font&gt; for each file found.&lt;/p&gt;

&lt;p&gt;Once the targets file is create, the project file is edited to import the new targets file using &lt;font face="courier new,courier"&gt;Import&lt;/font&gt;. I put it above the first &lt;font face="courier new,courier"&gt;PropertyGroup&lt;/font&gt; node so it’s visible when future maintenance is performed, but it can be placed anywhere within the root &lt;font face="courier new,courier"&gt;Project&lt;/font&gt; node:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;Import &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:red;"&gt;Project&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;=&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;$(MSBuildToolsPath)\T4Execution.targets&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot; &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Finally, the &lt;font face="courier new,courier"&gt;DefaultTargets&lt;/font&gt; attribute in the Project node is modified to include the ExecuteT4Templates target: Note: This change is required for any project where this behavior is desired.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:red;"&gt;DefaultTargets&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;=&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;ExecuteT4Templates;Build&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;&lt;/span&gt;&lt;/pre&gt;
Now whenever the project is built (&lt;font face="courier new,courier"&gt;Ctrl+B&lt;/font&gt;), template execution occurs. To be fair, there are several issues with the above approach, including:

&lt;ul&gt;
  &lt;li&gt;Template execution does not occur when Debug (&lt;font face="courier new,courier"&gt;F5&lt;/font&gt;) is triggered unless a project file or property has changed.&lt;/li&gt;

  &lt;li&gt;There is no built-in way to get the number of items in an &lt;font face="courier new,courier"&gt;ItemGroup&lt;/font&gt; to use conditional execution.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How important is this functionality in your projects? How would you do it differently?&lt;/p&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=846" width="1" height="1"&gt;</description><enclosure url="http://www.platinumbay.com/blogs/dotneticated/attachment/846.ashx" length="3958" type="application/x-zip-compressed" /><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Visual+Studio+SDK/default.aspx">Visual Studio SDK</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/MSBuild/default.aspx">MSBuild</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Visual+Studio+2008/default.aspx">Visual Studio 2008</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/T4/default.aspx">T4</category></item><item><title>Pop Quiz: .NET Integers, Unit Testing, and Boundary Checking</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/08/26/pop-quiz-net-integers-unit-testing-and-boundary-checking.aspx</link><pubDate>Thu, 27 Aug 2009 00:10:40 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:838</guid><dc:creator>Steve</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;I ask this question in a bunch of my talks, mostly because most folks aren’t aware of this. What is the bug in the following method?&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="background:#fefefe;color:blue;"&gt;public int &lt;/span&gt;&lt;span style="background:#fefefe;"&gt;Add(&lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;int &lt;/span&gt;&lt;span style="background:#fefefe;"&gt;num1, &lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;int &lt;/span&gt;&lt;span style="background:#fefefe;"&gt;num2)
{
    &lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;return &lt;/span&gt;&lt;span style="background:#fefefe;"&gt;num1 + num2;
}&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Do you see it? In a simple unit test, the method appears to work as expected:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="background:#fefefe;"&gt;[&lt;/span&gt;&lt;span style="background:#fefefe;color:#2b91af;"&gt;TestMethod&lt;/span&gt;&lt;span style="background:#fefefe;"&gt;()]
&lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;public void &lt;/span&gt;&lt;span style="background:#fefefe;"&gt;AddTest()
{
    &lt;/span&gt;&lt;span style="background:#fefefe;color:#2b91af;"&gt;MathHelper &lt;/span&gt;&lt;span style="background:#fefefe;"&gt;target = &lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;new &lt;/span&gt;&lt;span style="background:#fefefe;color:#2b91af;"&gt;MathHelper&lt;/span&gt;&lt;span style="background:#fefefe;"&gt;();
    &lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;int &lt;/span&gt;&lt;span style="background:#fefefe;"&gt;num1 = 16;
    &lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;int &lt;/span&gt;&lt;span style="background:#fefefe;"&gt;num2 = 16;
    &lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;int &lt;/span&gt;&lt;span style="background:#fefefe;"&gt;expected = 32;
    &lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;int &lt;/span&gt;&lt;span style="background:#fefefe;"&gt;actual = target.Add(num1, num2);
    &lt;/span&gt;&lt;span style="background:#fefefe;color:#2b91af;"&gt;Assert&lt;/span&gt;&lt;span style="background:#fefefe;"&gt;.AreEqual(expected, actual);&lt;/span&gt;&lt;span style="background:#fefefe;"&gt; &lt;/span&gt;&lt;span style="background:#fefefe;color:green;"&gt;// PASS&lt;/span&gt;&lt;span style="background:#fefefe;"&gt;
}&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;However, what if we pass in a different set of parameters, say int.MaxValue?&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="background:#fefefe;"&gt;[&lt;/span&gt;&lt;span style="background:#fefefe;color:#2b91af;"&gt;TestMethod&lt;/span&gt;&lt;span style="background:#fefefe;"&gt;()]
&lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;public void &lt;/span&gt;&lt;span style="background:#fefefe;"&gt;AddMaxTest()
{
    &lt;/span&gt;&lt;span style="background:#fefefe;color:#2b91af;"&gt;MathHelper &lt;/span&gt;&lt;span style="background:#fefefe;"&gt;target = &lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;new &lt;/span&gt;&lt;span style="background:#fefefe;color:#2b91af;"&gt;MathHelper&lt;/span&gt;&lt;span style="background:#fefefe;"&gt;();
    &lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;int &lt;/span&gt;&lt;span style="background:#fefefe;"&gt;num1 = &lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;int&lt;/span&gt;&lt;span style="background:#fefefe;"&gt;.MaxValue;
    &lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;int &lt;/span&gt;&lt;span style="background:#fefefe;"&gt;num2 = &lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;int&lt;/span&gt;&lt;span style="background:#fefefe;"&gt;.MaxValue;
    &lt;/span&gt;&lt;span style="background:#fefefe;color:blue;"&gt;int &lt;/span&gt;&lt;span style="background:#fefefe;"&gt;result = target.Add(num1, num2);

    &lt;/span&gt;&lt;span style="background:#fefefe;color:#2b91af;"&gt;Assert&lt;/span&gt;&lt;span style="background:#fefefe;"&gt;.Fail(&lt;/span&gt;&lt;span style="background:#fefefe;color:#a31515;"&gt;&amp;quot;Expected an overflow exception. Received: &amp;quot; &lt;/span&gt;&lt;span style="background:#fefefe;"&gt;+ result);
}&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Any guesses on the outcome of this test? In actuality, no exception is thrown. The test fails with the output: “Assert.Fail failed. Expected an overflow exception. Received: -2”. The output from the fail assert is “-2”. What!? Is it a bug in the .NET framework? What’s going on?&lt;/p&gt;

&lt;p&gt;The answer lies in that I am passing in a signed int. In a signed int, the top bit is flag bit indicating positive or negative, leaving the other 31 bits to indicate the numeric value. When doing binary math that overflows the 31 bits, the 32nd bit is switched as though it is unsigned. In this case a positive becomes a negative and the result becomes –2. Let’s hope the system isn’t trying to deposit $100 into an account with $2,147,483,647.&lt;/p&gt;

&lt;p&gt;But what does this mean to the original method? How do we handle this scenario? The point of this experiment isn’t to demonstrate a potential issue with the .NET framework. Rather, I’d like you to take notice of the first unit test. The test does evaluate the method for proper functioning, 100% code coverage would be achieved on the Add method, and yet the issue at hand is not found. And to this I would like to make an important point:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code Coverage is a misleading metric.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In order to properly test your code, it is important to not only make sure you test as much as possible, but to ensure you also perform boundary checking. If the max values weren’t tested, it might not have been found that the code could erase $2,147,483,749 from some pour soul’s bank account. Well, he’d be poor after the fact. Are here is my second point:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Boundary check everything.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To help solve this problem, there is a neat tool from Microsoft Research called Pex. From the Pex website:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Right from the Visual Studio code editor, &lt;strong&gt;Pex&lt;/strong&gt; finds interesting input-output values of your methods, which you can save as a small test suite with high code coverage. Pex performs a systematic analysis, hunting for boundary conditions, exceptions and assertion failures, which you can debug right away. Pex enables Parameterized Unit Testing, an extension of Unit Testing that reduces test maintenance costs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What I would really love to see someday is a combination of existing code coverage in Visual Studio Team System with parameter boundary checking in Pex to give a truer sense of test coverage. Maybe for Dev11?&lt;/p&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=838" width="1" height="1"&gt;</description><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Testing/default.aspx">Testing</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Unit+Tests/default.aspx">Unit Tests</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/PEX/default.aspx">PEX</category></item><item><title>LINQ: Porting jQuery’s Each</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/08/26/linq-porting-jquery-s-each.aspx</link><pubDate>Wed, 26 Aug 2009 23:26:00 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:837</guid><dc:creator>Steve</dc:creator><slash:comments>3</slash:comments><description>&lt;p&gt;As some astute readers pointed out, this functionality does in fact exist in LINQ. The name isn’t terribly obvious however: Aggregate. I was able to update the original tests to use the Aggregate method. The main difference is that a non-generic IEnumerable does not contain this functionality. For that type I had to use:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;.OfType&amp;lt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;gt;()&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;The updated test methods are here:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;IEnumerable&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;string&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;gt; collection = &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;new&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;[] { &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;Hello&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;, &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;World&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;, &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;!&amp;quot; &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;};&lt;br /&gt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;string &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;result = collection.Aggregate((str1, str2) =&amp;gt; (str1 + &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;+ str2).Trim());&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;pre class="code"&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;IEnumerable&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;int&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;gt; collection = &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;new&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;[] { 1, 2, 3, 4, 5 };&lt;br /&gt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;int &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;result = collection.Aggregate((num1, num2) =&amp;gt; num1 + num2);&lt;/span&gt;&lt;/pre&gt;

&lt;pre class="code"&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;IEnumerable &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;collection = &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;new&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;[] { &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;Hello&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;, &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;World&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;, &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;!&amp;quot; &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;};&lt;br /&gt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;string &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;result = collection.OfType&amp;lt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;string&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;gt;().Aggregate((&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;string &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;str1, &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;string &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;str2) =&amp;gt; (str1 + &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;+ str2).Trim());&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;pre class="code"&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;var &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;collection = &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;new &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;List&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;string&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;gt; { &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;Hello&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;, &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;World&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;, &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;!&amp;quot; &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;};&lt;br /&gt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;string &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;result = collection.Aggregate((str1, str2) =&amp;gt; (str1 + &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;+ str2).Trim());&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;I love learning new stuff, thanks to Steve Gilham and Jordan Terrell for their comments below.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;strike&gt;I really like the Each function in jQuery, and I find myself wanting to use it in LINQ. Since it doesn’t exist I decided to write one. Here goes:&lt;/strike&gt;&lt;/p&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;pre class="code"&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;&lt;strike&gt;using &lt;/strike&gt;&lt;/span&gt;&lt;strike&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;System;&lt;br /&gt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;using &lt;/span&gt;&lt;/strike&gt;&lt;strike&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;System.Linq;&lt;br /&gt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;using &lt;/span&gt;&lt;/strike&gt;&lt;strike&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;System.Collections;&lt;br /&gt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;using &lt;/span&gt;&lt;/strike&gt;&lt;strike&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;public static class &lt;/span&gt;&lt;/strike&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&lt;strike&gt;ExtensionMethods&lt;br /&gt;&lt;/strike&gt;&lt;/span&gt;&lt;strike&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;public static &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;TType Each&amp;lt;TType&amp;gt;(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;this &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;IEnumerable&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;lt;TType&amp;gt; collection, &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;Func&lt;/span&gt;&lt;/strike&gt;&lt;strike&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;lt;TType, TType, TType&amp;gt; func)&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;var &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;result = &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;default&lt;/span&gt;&lt;/strike&gt;&lt;strike&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;(TType);&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;foreach &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;var &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;queryable &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;in &lt;/span&gt;&lt;/strike&gt;&lt;strike&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;collection)&lt;br /&gt;            result = func(result, queryable);&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;return &lt;/span&gt;&lt;/strike&gt;&lt;strike&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;result;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;public static &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;TType Each&amp;lt;TType&amp;gt;(&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;this &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;IEnumerable &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;collection, &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;Func&lt;/span&gt;&lt;/strike&gt;&lt;strike&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;lt;TType, TType, TType&amp;gt; func)&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;return &lt;/span&gt;&lt;/strike&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&lt;strike&gt;collection.OfType&amp;lt;TType&amp;gt;().Each(func);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/strike&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;&lt;strike&gt;You can then call these extension methods using any IEnumerable type, such as List, Collection, etc. I’m utilizing lambdas to define inline methods, though a delegate to an existing method could be passed in as well.&lt;/strike&gt;&lt;/p&gt;

&lt;pre class="code"&gt;&lt;strike&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;IEnumerable&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;string&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;gt; collection = &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;new&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;[] { &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;Hello&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;, &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;World&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;, &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;!&amp;quot; &lt;/span&gt;&lt;/strike&gt;&lt;strike&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;};&lt;br /&gt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;string &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;result = collection.Each((str1, str2) =&amp;gt; (str1 + &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;+ str2).Trim());&lt;/span&gt;&lt;/strike&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;pre class="code"&gt;&lt;strike&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;IEnumerable&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;int&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;gt; collection = &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;new&lt;/span&gt;&lt;/strike&gt;&lt;strike&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;[] { 1, 2, 3, 4, 5 };&lt;br /&gt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;int &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;result = collection.Each((num1, num2) =&amp;gt; num1 + num2);&lt;/span&gt;&lt;/strike&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;pre class="code"&gt;&lt;strike&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;IEnumerable &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;collection = &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;new&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;[] { &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;Hello&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;, &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;World&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;, &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;!&amp;quot; &lt;/span&gt;&lt;/strike&gt;&lt;strike&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;};&lt;br /&gt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;string &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;result = collection.Each((&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;string &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;str1, &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;string &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;str2) =&amp;gt; (str1 + &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;+ str2).Trim());&lt;/span&gt;&lt;/strike&gt;&lt;/pre&gt;

&lt;pre class="code"&gt;&lt;strike&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;var &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;collection = &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;new &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;List&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;string&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;gt; { &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;Hello&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;, &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;World&amp;quot;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;, &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot;!&amp;quot; &lt;/span&gt;&lt;/strike&gt;&lt;strike&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;};&lt;br /&gt;&lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:blue;"&gt;string &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;result = collection.Each((str1, str2) =&amp;gt; (str1 + &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;&lt;span style="-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;"&gt;+ str2).Trim());&lt;/span&gt;&lt;/strike&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;&lt;strike&gt;What do you think? Would you do it differently?&lt;/strike&gt;&lt;/p&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=837" width="1" height="1"&gt;</description><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/jQuery/default.aspx">jQuery</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>Static Page Checking in ASP.NET MVC</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/08/21/static-page-checking-in-asp-net-mvc.aspx</link><pubDate>Fri, 21 Aug 2009 18:35:00 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:828</guid><dc:creator>Steve</dc:creator><slash:comments>9</slash:comments><description>&lt;p&gt;If you have built an ASP.NET web forms site of any substance, you have undoubtedly been bitten when code in the web form becomes outdated due to code change. It’s easy to see when the page is open in Visual Studio, as the code has red squiggles and the error shows up in the Error List tool window. As soon as the page is closed however, that error disappears. Even running a build will be successful. For some of my sites, which have over 150 pages, this can be very annoying to say the least.&lt;/p&gt;
  
&lt;p&gt;ASP.NET MVC has a neat hidden feature to solve this problem. The MVC team was most likely were stung by the same issue more than once. This feature is static page checking during compilation. Unfortunately, instead of being an option in the Properties window for the project (future release idea?), it is in the *.*proj xml file itself. To enable this feature:&lt;/p&gt;
  
&lt;ol&gt;   
&lt;li&gt;Right-click on the Project node in the Solution Explorer tool window&lt;/li&gt;
    
&lt;li&gt;Choose “Unload Project” - Note: If your project is under version control, you will be prompted to do a check-in. Simply click “Continue” to ignore the check-in request.&lt;/li&gt;
    
&lt;li&gt;Right-click the Project node again&lt;/li&gt;
    
&lt;li&gt;Choose “Edit *.*proj&amp;quot;, and the project file will now open in Visual Studio with color coding and IntelliSense&lt;/li&gt;
    
&lt;li&gt;In the first &lt;font face="courier new,courier"&gt;PropertyGroup &lt;/font&gt;node, there is a new node named &lt;font face="courier new,courier"&gt;MvcBuildViews&lt;/font&gt;&lt;/li&gt;
    
&lt;li&gt;By default this is set to &lt;font face="courier new,courier"&gt;false&lt;/font&gt;. Simply change the value to &lt;font face="courier new,courier"&gt;true&lt;/font&gt;&lt;/li&gt;
    
&lt;li&gt;Right-click the Project node and choose “Reload Project”&lt;/li&gt;
    
&lt;li&gt;If prompted that the file is already open, click yes to close the xml view.&lt;/li&gt;
    
&lt;li&gt;Build your project&lt;/li&gt;
 &lt;/ol&gt;
  
&lt;p&gt;You will notice that builds take longer than they did prior to this change. This is because under the covers, MSBuild is now making an additional call to aspnet_compiler in the AfterBuild MSBuild target:&lt;/p&gt;
  
&lt;p&gt;&lt;font face="courier new,courier"&gt;C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_compiler.exe -v temp -p &amp;quot;[physical path]&amp;quot;&lt;/font&gt;&lt;/p&gt;
  
&lt;p&gt;To avoid this delay in day-to-day development, you may choose to copy the &lt;font face="courier new,courier"&gt;MvcBuildViews &lt;/font&gt;node into the build-specific &lt;font face="courier new,courier"&gt;PropertyGroup &lt;/font&gt;nodes, and set it to &lt;font face="courier new,courier"&gt;false&lt;/font&gt; for Debug and &lt;font face="courier new,courier"&gt;true &lt;/font&gt;for Release.&lt;/p&gt;&lt;p&gt;Update: &lt;a href="http://twitter.com/jglozano" target="_blank"&gt;@jglozano&lt;/a&gt; points out that this only works with the default WebForms View Engine.&lt;br /&gt;&lt;/p&gt;
  
&lt;p&gt;Hope this helps&lt;/p&gt;
&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=828" width="1" height="1"&gt;</description><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/MVC/default.aspx">MVC</category></item><item><title>Community Radio Episode Two</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/06/19/community-radio-episode-two.aspx</link><pubDate>Fri, 19 Jun 2009 08:38:00 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:808</guid><dc:creator>Steve</dc:creator><slash:comments>5</slash:comments><description>&lt;p&gt;I’m proud to announce that episode two of Community Radio has been published to &lt;a href="http://live.ineta.org/audio"&gt;http://live.ineta.org/audio&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In this episode, Steve talks with Heather Kostes, Emily Freet, and Nicole Moser about their roles at Microsoft, the MVP program, MVP benefits, becoming an MVP, karaoke, and more. Narrated by &lt;a href="http://twitter.com/JohnBlumenauer" target="_blank"&gt;John Blumenauer&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;As always, your feedback is greatly appreciated.&lt;/p&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=808" width="1" height="1"&gt;</description><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/MVP/default.aspx">MVP</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Community+Radio/default.aspx">Community Radio</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/INETA+Live/default.aspx">INETA Live</category></item><item><title>European Union Says No to Free Dessert</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/06/14/europe-says-no-to-free-dessert.aspx</link><pubDate>Sun, 14 Jun 2009 22:42:00 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:799</guid><dc:creator>Steve</dc:creator><slash:comments>3</slash:comments><description>&lt;p&gt;As reported all over the web this week, Microsoft has decided to ship Windows 7 in Europe without Internet Explorer. For a long time, the EU has been complaining that Microsoft has been using their dominant position to hawk IE on unsuspecting computer users.&lt;/p&gt;  &lt;p&gt;Horseradish!&lt;/p&gt;  &lt;p&gt;Let’s bring this discussion back across the pond for a second, and look at new home construction. The Department of Justice had a quarrel with Microsoft awhile back over a similar matter. Of course, if they were really going after monopolies they would go after the micro-monopolies of new home builders for charging egregious fees for options. Take for instance the elegant and simple recessed light. The last time I bought a new house the builder wanted $125 for every single one I added. A quick trip to Home Depot confirmed that the hardware costs less than $10, and wiring was equally inexpensive. I wanted to put their lights out.&lt;/p&gt;  &lt;p&gt;And what about the auto industry that forces you to choose from their tires, or their radios, or their floormats. Shouldn’t they be spanked? And what about government in general? Shouldn’t I be able to choose a DMV that offers better service if I want to? I think my four year old nephew could do that, and I’d gladly pay him instead.&lt;/p&gt;  &lt;p&gt;But let’s take a step back for a second and remember that there is a major difference between these comparisons and Internet Explorer. Internet Explorer is free. Free as in no charge. Free as in ‘No sir, you can keep your money’. You buy the operating system, and you get a free browser. Restaurants do the same thing; buy a meal, get a free dessert. Is the European Union really that uptight to complain about getting their dessert for free? And a dessert that can easily be replaced by downloading another browser? Maybe they don&amp;#39;t like free things and will soon consider an air tax.&lt;/p&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=799" width="1" height="1"&gt;</description><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Personal+_1320_+Off+Topic/default.aspx">Personal – Off Topic</category></item><item><title>Community Radio Episode One</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/06/12/community-radio-episode-one.aspx</link><pubDate>Fri, 12 Jun 2009 06:45:13 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:793</guid><dc:creator>Steve</dc:creator><slash:comments>4</slash:comments><description>&lt;p&gt;I’m proud to announce that the inaugural episode of Community Radio has been published: &lt;a href="http://live.ineta.org/audio"&gt;http://live.ineta.org/audio&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In this inaugural episode, I talk with Richard, Carl and Sara about Speaker Idol, speaking at Tech-Ed, podcasting, .NET Rocks, Richard and Carl&amp;#39;s back stories, and more. Narrated by &lt;a href="http://twitter.com/csharpfritz"&gt;Jeff Fritz&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;As always, your feedback is greatly appreciated.&lt;/p&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=793" width="1" height="1"&gt;</description><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Community+Radio/default.aspx">Community Radio</category></item><item><title>Results – Community Radio Narration Contest</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/06/10/results-community-radio-narration-contest.aspx</link><pubDate>Thu, 11 Jun 2009 00:01:00 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:789</guid><dc:creator>Steve</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;The &lt;a href="http://www.platinumbay.com/blogs/dotneticated/archive/2009/05/24/community-radio-narration-contest.aspx" target="_blank"&gt;contest&lt;/a&gt; deadline has come and gone, and I received four submissions. After reviewing the submission I have determined that they were all great, so whoever sends me $500 first… just kidding. I’ve decided that the only satisfactory course of action is to use them all on a rotational basis. In fact, I’ve decided to use community contributions exclusively going forward because, well, this is your radio! The first four, in no particular (though apparently alphabetical) order, are:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://twitter.com/csharpfritz" target="_blank"&gt;Jeff Fritz&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://twitter.com/JohnBlumenauer" target="_blank"&gt;John Blumenauer&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://twitter.com/fallenrogue" target="_blank"&gt;Leon Gersing&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Michael Diiorio&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Would you like to introduce an episode of Community Radio? Record yourself in high-quality MP3 or WAV format speaking the following phrases. I look forward to your submissions!&lt;/p&gt;  &lt;h4&gt;Intro:&lt;/h4&gt;  &lt;p&gt;&amp;quot;[Hey, Hi, Howdy, Hey Y’all, etc.], this is [your name] welcoming you to Community Radio: connecting the developer community everywhere. Community Radio is powered by INETA Live and hosted by Steve Andrews: Microsoft MVP for Visual Studio Team System, Director of Technology for INETA North America, and all-around Community Fanatic. And now… to the communitymobile! Enjoy the show!&amp;quot;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;Note: In the second to last sentence, it&amp;#39;s communitymobile, as in &amp;quot;To the Batmobile.&amp;quot;&lt;/i&gt;&lt;/p&gt;  &lt;h4&gt;Outro:&lt;/h4&gt;  &lt;p&gt;&amp;quot;Thanks for listening to Community Radio: powered by INETA Live, and hosted by Steve Andrews. If you enjoyed this episode, pass us along to your friends and colleagues and check out our podcast archives at live.ineta.org. I’m [your name], join us next time for another edition of... Community Radio.&amp;quot;&lt;/p&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=789" width="1" height="1"&gt;</description><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Community+Radio/default.aspx">Community Radio</category></item><item><title>Community Tour 2010</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/06/09/community-tour-2010.aspx</link><pubDate>Tue, 09 Jun 2009 21:43:43 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:786</guid><dc:creator>Steve</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;I think most folks know that I tend to speak at developer events from time to time. Actually in 2008 I gave 48 presentations at 32 events. My goal for 2009 is 52 events and I have 44 confirmed so far. Next year though I thought I’d take it up another notch. No, I’m not going for 72 events as some have suggested, nor am I retiring. Rather, I’m going on a North American tour and I’m currently on the hunt for a class A diesel motor home.&lt;/p&gt;  &lt;p&gt;&lt;img title="" style="border-top-width:0px;display:block;border-left-width:0px;float:none;border-bottom-width:0px;margin-left:auto;margin-right:auto;border-right-width:0px;" height="129" alt="" src="http://www.platinumbay.com/blogs/postimages/CommunityTour2010_1118D/CT2010CoachMockup.gif" width="380" border="0" /&gt;&lt;/p&gt;  &lt;h6 align="center"&gt;&lt;em&gt;Note: Image for dramatization only. Logos are for illustrative purposes and do not signify support from any organization. Also, CommunityTour.com is sadly already taken.&lt;/em&gt;&lt;/h6&gt;  &lt;p&gt;As part of this tour, I am organizing and planning a number of programs, including:&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;         &lt;p align="right"&gt;&lt;strong&gt;Community Events:&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;continuing to speak at user groups, code camps, and other developer events.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;         &lt;p align="right"&gt;&lt;strong&gt;Guest Lecturing:&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;engaging with college and university students about real-world programming, best practices, etc.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;         &lt;p align="right"&gt;&lt;strong&gt;Community Camp:&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;teaching up-and-coming influentials about speaking, presentations, writing, blogging, the MVP program, the INETA Speakers Bureau, and more.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;         &lt;p align="right"&gt;&lt;strong&gt;Volunteering:&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;continuing the idea of &lt;a href="http://www.GeekFoodDrive.com"&gt;www.GeekFoodDrive.com&lt;/a&gt; and &lt;a href="http://www.GeekGive.org"&gt;www.GeekGive.org&lt;/a&gt; by helping to organize volunteer opportunities at community events.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;         &lt;p align="right"&gt;&lt;strong&gt;Mobile Code Camp:&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;bringing the code camp idea to smaller and under-represented areas in the US where there aren’t currently any community events&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;         &lt;p align="right"&gt;&lt;strong&gt;Community Radio:&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;talking with folks along the way, tapping the pockets of knowledge and sharing that knowledge with the community.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;         &lt;p align="right"&gt;&lt;strong&gt;Community TV:&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;video interviews with community influentials.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;         &lt;p align="right"&gt;&lt;strong&gt;INETA Live:&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;recording INETA Live webcasts from local technologists on the road.&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;h5&gt;Community Organizers&lt;/h5&gt;  &lt;p&gt;If you would like the Community Bus at one of your events next year, have feedback, are interested in organizing specific programs in your area, or you would be interested in riding along, please &lt;a href="http://www.platinumbay.com/blogs/dotneticated/contact.aspx" target="_blank"&gt;contact me&lt;/a&gt;.&lt;/p&gt;  &lt;h5&gt;Sponsors&lt;/h5&gt;  &lt;p&gt;To learn more about sponsoring the tour, please request a Community Tour 2010 Sponsorship Prospectus from the &lt;a href="http://www.platinumbay.com/blogs/dotneticated/contact.aspx" target="_blank"&gt;Contact page&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=786" width="1" height="1"&gt;</description><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/blog/default.aspx">blog</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/code+camp/default.aspx">code camp</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Speaking/default.aspx">Speaking</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Community/default.aspx">Community</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Community+Radio/default.aspx">Community Radio</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/INETA+Live/default.aspx">INETA Live</category></item><item><title>Community Radio Narration Contest</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/05/24/community-radio-narration-contest.aspx</link><pubDate>Sun, 24 May 2009 23:26:00 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:772</guid><dc:creator>Steve</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;I started recording episodes of Community Radio at Microsoft Tech-Ed 2009 in Los Angeles, California. Since coming back home, I’ve been hard at work editing these episodes and creating the intro/outro music. There is still one element missing however, the narrator. That’s where you come in.&lt;/p&gt;  &lt;p&gt;I’m holding a contest to find the Community Radio narrator. To enter, record yourself speaking the below intro and outro phrases in the highest quality format (either MP3 or WAV). The recorded intro and outro must be no longer than 27 seconds each. To submit your entry, send an email to &lt;a href="mailto:steve@platinumbay.com?subject=Submission:%20Community%20Radio%20Narration%20Contest" target="_blank"&gt;Steve&lt;/a&gt; with a link to download your recordings. Entries must be received by 11:59 PM eastern time on Friday, May 29th.&lt;/p&gt;  &lt;h4&gt;Intro:&lt;/h4&gt;  &lt;p&gt;&amp;quot;Welcome to Community Radio: connecting the developer community everywhere. Community Radio is powered by INETA Live, located on the web at live.ineta.org, and hosted by Steve Andrews: Microsoft MVP for Visual Studio Team System, Director of Technology for INETA North America, and all-around Community Fanatic. And now… to the communitymobile! Enjoy the show!&amp;quot;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;i&gt;Note: In the second to last sentance, it&amp;#39;s communitymobile, as in &amp;quot;To the Batmobile.&lt;/i&gt;&lt;/font&gt;&amp;quot;&lt;br /&gt;&lt;/p&gt;  &lt;h4&gt;Outro:&lt;/h4&gt;  &lt;p&gt;&amp;quot;Thanks for listening to Community Radio: powered by INETA Live and hosted by Steve Andrews. If you enjoyed this episode, pass us along to your friends and colleagues and check out our podcast archives at live.ineta.org. Narration by [your name]. Join us next time for another edition of... Community Radio.&amp;quot;&lt;/p&gt;  &lt;p&gt;Good luck!&lt;/p&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=772" width="1" height="1"&gt;</description><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/contest/default.aspx">contest</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Community+Radio/default.aspx">Community Radio</category></item><item><title>WinFormsMVC</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/05/20/winformsmvc.aspx</link><pubDate>Wed, 20 May 2009 21:11:27 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:763</guid><dc:creator>Steve</dc:creator><slash:comments>3</slash:comments><description>&lt;p&gt;I’ve been working on a Windows Forms based project recently, and I quickly became frustrated at how unwieldy it became after just a short while. I have also been working a lot with the ASP.NET MVC framework recently, and I thought this model might work better, so I set out to build a proof-of-concept of what Windows Forms MVC might look like.&lt;/p&gt;  &lt;p&gt;So far I have a very rough framework, but it’s at a point where feedback would be beneficial so I have published the project over on &lt;a title="CodePlex" href="http://www.codeplex.com" target="_blank"&gt;CodePlex&lt;/a&gt;. So go take a look, browse the source, and let me know what you think!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://winformsmvc.codeplex.com"&gt;http://winformsmvc.codeplex.com&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=763" width="1" height="1"&gt;</description><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Windows+Forms/default.aspx">Windows Forms</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/MVC/default.aspx">MVC</category></item><item><title>Training: Hands-on Introduction to ASP.NET MVC Development</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/05/18/training-hands-on-introduction-to-asp-net-mvc-development.aspx</link><pubDate>Tue, 19 May 2009 01:02:00 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:761</guid><dc:creator>Steve</dc:creator><slash:comments>12</slash:comments><description>&lt;p&gt;Registration is now open for this four hour course taking place on May 29th, 2009 at the Desmond Hotel and Conference Center in Malvern, PA.&lt;/p&gt;  &lt;p&gt;ASP.NET MVC is a free and fully supported Microsoft framework for building web applications that use a model-view-controller pattern. Like ASP.NET Web Forms, ASP.NET MVC is built on the ASP.NET framework. The benefits of ASP.NET MVC include complete control over your HTML markup, intuitive website URLs, clear separation of concerns which results in web applications that are easier to maintain and extend over time, and testability – including support for test-driven development.&lt;/p&gt;  &lt;p&gt;This course will be led by Steve Andrews, a Microsoft MVP for Visual Studio Team System, Director of Technology for INETA North America, and founding partner of Five Velocity Partners, a consulting and training provider specializing in Application Lifecycle Management and custom application development.&lt;/p&gt;  &lt;h4&gt;Overview:&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;4 Hour Course, including lunch&lt;/li&gt;    &lt;li&gt;Instructor-Led Introduction to ASP.NET MVC Development &lt;/li&gt;    &lt;li&gt;Overview of the Strengths and Weaknesses of ASP.NET MVC from a Developer’s Perspective &lt;/li&gt;    &lt;li&gt;Overview of the Essentials of the ASP.NET MVC Object Model &lt;/li&gt;    &lt;li&gt;Opportunity for a Hands-on Lab Writing ASP.NET MVC Extensions &lt;/li&gt;    &lt;li&gt;Discussion of Unique ASP.NET Deployment Requirements and Strategies &lt;/li&gt;    &lt;li&gt;Opportunity for Questions and Answers &lt;/li&gt; &lt;/ul&gt;  &lt;table cellpadding="2" cellspacing="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;&lt;b&gt;Date&lt;/b&gt;&lt;/td&gt;        &lt;td&gt;&lt;b&gt;Location&lt;/b&gt;&lt;/td&gt;        &lt;td&gt;&lt;b&gt;Event&lt;/b&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Friday May 29, 2009          &lt;br /&gt;9:00am -1:00pm ET&lt;/td&gt;        &lt;td&gt;Desmond Hotel &amp;amp; Conference Center          &lt;br /&gt;Malvern, PA&lt;/td&gt;        &lt;td&gt;&lt;i&gt;Hands-on Introduction to ASP.NET MVC Development&lt;/i&gt;           &lt;br /&gt;Registration Fee: $349           &lt;br /&gt;Presented By: Steve Andrews&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;h4&gt;Includes&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;Bound hard-copy of the training materials&lt;/li&gt;    &lt;li&gt;USB memory stick with trainings resources including demos and labs&lt;/li&gt;    &lt;li&gt;Continental breakfast&lt;/li&gt;    &lt;li&gt;Buffet lunch&lt;/li&gt;    &lt;li&gt;High-speed internet access&lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;Requirements:&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;Comfortable with ASP.NET development &lt;/li&gt;    &lt;li&gt;Understanding of the ASP.NET page lifecycle &lt;/li&gt;    &lt;li&gt;Attendees must bring their own laptop installed with:      &lt;ul&gt;       &lt;li&gt;Visual Studio 2008 SP1 Standard or greater &lt;/li&gt;        &lt;li&gt;SQL Server 2005 or 2008, Express or greater &lt;/li&gt;&lt;li&gt;ASP.NET MVC Framework version 1.0&lt;br /&gt;&lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;To register for this event, please contact &lt;a href="mailto:steve@platinumbay.com?subject=Inquiry:%20Hands-on%20Introduction%20to%20ASP.NET%20MVC%20Development" target="_blank"&gt;Steve Andrews&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=761" width="1" height="1"&gt;</description><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/MVC/default.aspx">MVC</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Training/default.aspx">Training</category></item><item><title>Volunteering at Tech·Ed 2010 in New Orleans</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/05/17/volunteering-at-tech-183-ed-2010-in-new-orleans.aspx</link><pubDate>Sun, 17 May 2009 20:04:00 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:757</guid><dc:creator>Steve</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Tech·Ed this week was tons of fun and an amazing experience! I worked several booths, interacted and networked with a large number of my peers, and enjoyed almost every moment. Needless to say I was thoroughly exhausted when I got home. One of the highlights of the week though was the Wednesday night INETA Developer Party at Chaya; thanks to Infragistics for helping to sponsor it! The food was great: sushi, great wine, delicious pastries.&lt;/p&gt;  &lt;p&gt;During the course of the night the topic of New Orleans and Tech·Ed came up, and I suggested that we fly in a day or two early and volunteer for an organization like Habitat for Humanity. The whole table was in agreement and every person said they would do it.&lt;/p&gt;  &lt;p&gt;Today, I sent an email to Habitat for Humanity inquiring about volunteering on June 5th, 2010 which is the Saturday before Tech·Ed. This is where you come in. If you are interested in arriving early for Tech·Ed 2010 to help rebuild New Orleans, please contact me so I can start to get a headcount.&lt;/p&gt;  &lt;p&gt;More information about volunteering for Habitat for Humanity can be found here: &lt;a href="http://www.habitat-nola.org/volunteer/faq.php" title="http://www.habitat-nola.org/volunteer/faq.php"&gt;http://www.habitat-nola.org/volunteer/faq.php&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=757" width="1" height="1"&gt;</description><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Tech+Ed/default.aspx">Tech Ed</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Community/default.aspx">Community</category></item><item><title>Tech·Ed Visual Studio Tips with Sara Ford</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/05/17/tech-183-ed-visual-studio-tips-with-sara-ford.aspx</link><pubDate>Sun, 17 May 2009 19:50:26 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:756</guid><dc:creator>Steve</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;While at Tech·Ed this week I had several opportunities to sit down with &lt;a title="Sara Ford&amp;#39;s Blog" href="http://blogs.msdn.com/saraford" target="_blank"&gt;Sara Ford&lt;/a&gt;, including for my new Community Radio podcast. Along the way, I learned a few new tips and tidbits of knowledge about Visual Studio.&lt;/p&gt;  &lt;h3&gt;Cycle Clipboard Ring&lt;/h3&gt;  &lt;p&gt;If you’re like me when using Visual Studio, the last block of text you copied to the clipboard is always in the back of your mind, in many cases for future use. And then you mistakenly hit Ctrl+C (Copy), and overwrite the clipboard and destroying the coding flow. No more. Instead of using Ctrl+V (Paste) to paste from the clipboard, you can use Ctrl+Shift+V, which cycles through Visual Studio’s clipboard ring. Yes, Visual Studio has a clipboard ring.&lt;/p&gt;  &lt;p&gt;In the past when I presented this tip folks wanted to know how large the clipboard ring is, and I didn’t know. I asked Sara this week and it’s 20 items.&lt;/p&gt;  &lt;h3&gt;File Tab Channel File Menu&lt;/h3&gt;  &lt;p&gt;There are a couple nifty tips about the File Tab Channel, which is the horizontal bar above documents that lists each document name.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.platinumbay.com/blogs/postimages/TechEdVisualStudioTipswithSaraFord_1410C/image.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="31" alt="image" src="http://www.platinumbay.com/blogs/postimages/TechEdVisualStudioTipswithSaraFord_1410C/image_thumb.png" width="314" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;First, if you right-click on a document’s tab, there are a couple new menu items added in Visual Studio 2008 that can be very useful:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Copy Full Path – Copies the full file path to the clipboard. &lt;/li&gt;    &lt;li&gt;Open Containing Folder – opens Windows Explorer to the directory containing the file. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Second, the File Tab Channel File Menu, the down arrow on the right side of the File Tab Channel, lists all the open documents. It can also be invoked from the keyboard using Ctrl+Alt+DownArrow.&lt;/p&gt;  &lt;p&gt;Lastly, and I learned this little-known tip this week, the File Tab Channel File Menu itself is state-sensitive. That is, when there are more documents than can be displayed in the space, the icon changes from &lt;a href="http://www.platinumbay.com/blogs/postimages/TechEdVisualStudioTipswithSaraFord_1410C/image_3.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="23" alt="image" src="http://www.platinumbay.com/blogs/postimages/TechEdVisualStudioTipswithSaraFord_1410C/image_thumb_3.png" width="21" border="0" /&gt;&lt;/a&gt; to &lt;a href="http://www.platinumbay.com/blogs/postimages/TechEdVisualStudioTipswithSaraFord_1410C/image_4.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="24" alt="image" src="http://www.platinumbay.com/blogs/postimages/TechEdVisualStudioTipswithSaraFord_1410C/image_thumb_4.png" width="24" border="0" /&gt;&lt;/a&gt;. This can be really handy since it isn’t always apparent how many documents are open.&lt;/p&gt;  &lt;h3&gt;Using the Find Combo Box to Set a Breakpoint&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://www.platinumbay.com/blogs/postimages/TechEdVisualStudioTipswithSaraFord_1410C/image_5.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;margin:0px 10px 5px 0px;border-right-width:0px;" height="30" alt="image" src="http://www.platinumbay.com/blogs/postimages/TechEdVisualStudioTipswithSaraFord_1410C/image_thumb_5.png" width="218" align="left" border="0" /&gt;&lt;/a&gt;Another little-known tip is that if you type a method name for the currently open document into the Find combo box, located in the Standard command bar, and press F9, it will set a breakpoint on that method.&lt;/p&gt;  &lt;h3&gt;More Tips&lt;/h3&gt;  &lt;p&gt;If you liked these tips you can find more in Sara’s book, “&lt;a title="Visual Studio Tips" href="http://www.amazon.com/Microsoft-Visual-Studio-Tips-Sara/dp/0735626405" target="_blank"&gt;Visual Studio Tips&lt;/a&gt;”, available now on Amazon.com. 100% of the author royalties are being donated to a scholarship fund at the local community college for residents of Waveland, MS which was destroyed by Hurricane Katrina. Microsoft is also matching her donations 100%. Go buy three or four copies!&lt;/p&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=756" width="1" height="1"&gt;</description><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Tips/default.aspx">Tips</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Tech+Ed/default.aspx">Tech Ed</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Sara+Ford/default.aspx">Sara Ford</category></item><item><title>INETA Live – Call for Speakers</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/05/03/ineta-live-call-for-speakers.aspx</link><pubDate>Mon, 04 May 2009 03:25:51 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:752</guid><dc:creator>Steve</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;Want to be famous-er? Give back knowledge? Geek out with your peers? You should do an INETA Live webcast! One of my initiatives as Director of Technology for INETA is to further develop &lt;a href="http://live.ineta.org/Videos"&gt;INETA Live&lt;/a&gt;. Details on INETA Live can be found below:&lt;/p&gt;  &lt;p&gt;&lt;b&gt;What is INETA Live?&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;INETA Live is a forum for virtual events and webcasts via Microsoft Live Meeting.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;What to Present&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Whatever you want! Speakers can present a full presentation that they may present to user groups, an intro to one of their talks, or a topic of current interest. The choice is completely up to you!&lt;/p&gt;  &lt;p&gt;&lt;b&gt;When do the webcasts happen?&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;INETA Live webcasts are typically done during the week at 12 noon or 8pm eastern time. Feel free to request other arrangements if these times do not work for you.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Hosts&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Each presentation and speaker will be introduced by a meeting host who will also serve to field audience questions to the speaker.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Recording&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;The presentation will be recorded for future viewing on INETA Live.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;What next?&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;If you are interested in doing an INETA Live presentation, please contact me. &lt;/p&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=752" width="1" height="1"&gt;</description><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/INETA/default.aspx">INETA</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/INETA+Live/default.aspx">INETA Live</category></item><item><title>INETA Live Webcasts: Round One</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/04/20/ineta-live-webcasts-round-one.aspx</link><pubDate>Mon, 20 Apr 2009 08:15:00 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:745</guid><dc:creator>Steve</dc:creator><slash:comments>3</slash:comments><description>
&lt;p&gt;One of my initiatives as Director of Technology for INETA is to further develop &lt;a href="http://live.ineta.org/Videos" target="_blank"&gt;INETA Live&lt;/a&gt;. To that end, Rachel Appel and I will be hosting &lt;b&gt;five&lt;/b&gt; exciting live webcasts this month on Live Meeting, all from INETA speakers. Details below, and remember to stay tuned for more exciting content from INETA Live. If you are interested in doing a live webcast on INETA Live, please contact me.&lt;/p&gt;
  
&lt;p&gt;&lt;i&gt;* All times are Eastern US/Canada &lt;/i&gt;    &lt;br /&gt;&lt;/p&gt;
  
&lt;p&gt;&lt;a href="http://www.platinumbay.com/blogs/postimages/INETALiveWebcastsRoundOne_3109/image.png"&gt;&lt;img src="http://www.platinumbay.com/blogs/postimages/INETALiveWebcastsRoundOne_3109/image_thumb.png" title="image" style="border-width:0px;margin:0px 15px 0px 0px;display:inline;" alt="image" width="64" align="left" border="0" height="64" /&gt;&lt;/a&gt;&lt;span style="font-weight:bold;font-size:1.2em;"&gt;Pete Brown – A Lap Around Silverlight 3&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-size:0.85em;"&gt;When: April 21st, 2009 at 12:00pm ET      &lt;br /&gt;Host: Rachel Appel       &lt;br /&gt;Link: &lt;a href="https://www323.livemeeting.com/cc/usergroups/join?id=ZBZ3KJ&amp;amp;role=attend" title="Join Live Meeting" target="_blank"&gt;https://www323.livemeeting.com/cc/usergroups/join?id=ZBZ3KJ&amp;amp;role=attend&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;
  
&lt;p&gt;&lt;b&gt;Abstract:&lt;/b&gt; Join us for a lap around the new features in Silverlight 3 ranging from business application development to rich media, validation, navigation and out of browser support. If you’re new to Silverlight 3, or new to Silverlight itself, you’ll want to join us for this end-to-end look at Microsoft’s premier RIA platform. We’ll cover the basics from Silverlight 2, but focus primarily on the new announcements from mix09 and new features in Silverlight 3.&lt;/p&gt;
  
&lt;p&gt;&lt;b&gt;Bio:&lt;/b&gt; Pete Brown is a Microsoft MVP for Client Application Development (Silverlight and WPF), an INETA speaker, and an Architect/Project Manager for Applied Information Sciences in the Washington, DC area. From his first sprite graphics and custom character sets on the Commodore 64 to 3d modeling and design through to Silverlight, Surface, XNA, and WPF, Pete has always had a deep interest in programming, design, and user experience. His involvement in Silverlight goes back to the Silverlight 1.1 alpha application that he co-wrote and put into production in July 2007. Pete has been programming for fun since 1984, and professionally since 1992. In his spare time, Pete enjoys programming, blogging, designing and building his own woodworking projects and raising his two children with his wife in the suburbs of Maryland. Pete’s blog is at &lt;a href="http://www.irritatedVowel.com/Blog" target="_blank"&gt;http://www.irritatedVowel.com/Blog&lt;/a&gt; , and you can follow him on Twitter at &lt;a href="http://twitter.com/pete_brown" target="_blank"&gt;http://twitter.com/pete_brown&lt;/a&gt;. &lt;/p&gt;
  
&lt;p style="padding-top:12px;"&gt;&lt;a href="http://www.platinumbay.com/blogs/postimages/INETALiveWebcastsRoundOne_3109/image_3.png"&gt;&lt;img src="http://www.platinumbay.com/blogs/postimages/INETALiveWebcastsRoundOne_3109/image_thumb_3.png" title="image" style="border-width:0px;margin:0px 15px 0px 0px;display:inline;" alt="image" width="64" align="left" border="0" height="64" /&gt;&lt;/a&gt;&lt;span style="font-weight:bold;font-size:1.2em;"&gt;Steve Andrews – Visual Studio 2008 Tips and Treats&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-size:0.85em;"&gt;When: April 22nd, 2009 at 12:00pm ET      &lt;br /&gt;Host: Rachel Appel       &lt;br /&gt;Link: &lt;a href="https://www323.livemeeting.com/cc/usergroups/join?id=TNTB2N&amp;amp;role=attend" title="Join Live Meeting" target="_blank"&gt;https://www323.livemeeting.com/cc/usergroups/join?id=TNTB2N&amp;amp;role=attend&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;
  
&lt;p&gt;&lt;b&gt;Abstract: &lt;/b&gt;Based on real life experience of 8+ hours a day developing with Visual Studio, learn some sweet tips and tricks to tame the IDE. With something new for everyone, these techniques will give you valuable information to start using right away, increase your productivity, and make you wonder how you survived all this time without them.&lt;/p&gt;
  
&lt;p&gt;&lt;b&gt;Bio:&lt;/b&gt; Steve Andrews is a Team System MVP and INETA Board Member and Speaker, and has been working as a developer for more than 9 years. During this time, he has designed and developed applications in such widely varying areas as trust accounting, medical information management, supply chain management, and retail systems. Steve is also a MCTS, ICSOO, and community fanatic.&lt;/p&gt;
  
&lt;p style="padding-top:12px;"&gt;&lt;a href="http://www.platinumbay.com/blogs/postimages/INETALiveWebcastsRoundOne_3109/image_4.png"&gt;&lt;img src="http://www.platinumbay.com/blogs/postimages/INETALiveWebcastsRoundOne_3109/image_thumb_4.png" title="image" style="border-width:0px;margin:0px 15px 0px 0px;display:inline;" alt="image" width="64" align="left" border="0" height="64" /&gt;&lt;/a&gt;&lt;span style="font-weight:bold;font-size:1.2em;"&gt;Claudio Lassala – Design Patterns in .NET&lt;/span&gt;     &lt;br /&gt;&lt;span style="font-size:0.85em;"&gt;When: April 27th, 2009 at 12:00pm ET      &lt;br /&gt;Host: Steve Andrews       &lt;br /&gt;Link: &lt;a href="https://www323.livemeeting.com/cc/usergroups/join?id=P648S9&amp;amp;role=attend" title="Join Live Meeting" target="_blank"&gt;https://www323.livemeeting.com/cc/usergroups/join?id=P648S9&amp;amp;role=attend&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;
  
&lt;p&gt;&lt;b&gt;Abstract:&lt;/b&gt; Design Patterns are used every day by most developers in one way or another. A basic understanding of patterns and how to implement them is very useful for all .NET developers, and this session tries to clarify design patterns in a way that everybody can understand and start thinking about patterns in a more natural way.     &lt;br /&gt;&lt;/p&gt;
  
&lt;p&gt;&lt;b&gt;Bio:&lt;/b&gt; Claudio Lassala is a Senior Developer at EPS Software Corp. He has presented several lectures at Microsoft events such as PDC Brazil and various other Microsoft seminars, as well as several conferences and user groups across North America and Brazil. He is a multiple winner of the Microsoft MVP Award since 2001 (for Visual FoxPro in 2001-2002, and for C# ever since), an INETA speaker, and also holds the MCSD for .NET certification. He has articles published on several magazines, such as MSDN Brazil Magazine, CoDe Magazine, UTMag, Developers Magazine, and FoxPro Advisor.Claudio blogs at &lt;a href="http://claudiolassala.spaces.live.com" target="_blank"&gt;http://claudiolassala.spaces.live.com&lt;/a&gt;, and can be followed on Twitter at &lt;a href="http://twitter.com/ClaudioLassala" target="_blank"&gt;http://twitter.com/ClaudioLassala&lt;/a&gt;. More detailed information regarding his presentations and articles can be found in his &lt;a href="https://mvp.support.microsoft.com/default.aspx/profile=ec6b1e0b-8efc-4530-97b0-55bd924e26d0" target="_blank"&gt;MVP Profile&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=745" width="1" height="1"&gt;</description><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/INETA+Live/default.aspx">INETA Live</category></item><item><title>Community Radio #1: The After-Party</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/04/11/community-radio-1-the-after-party.aspx</link><pubDate>Sat, 11 Apr 2009 11:38:00 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:738</guid><dc:creator>Steve</dc:creator><slash:comments>3</slash:comments><description>&lt;p&gt;One of my near-term goals is to start up a community-focused podcast. Until I get hardware funding however, I’ve decided to start with blogcasts. For this episode, I’m having a conversation with some folks about community events and after-parties via email. These folks are:&lt;/p&gt;  &lt;table cellpadding="2" cellspacing="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;&lt;b&gt;Name:&lt;/b&gt;&lt;/td&gt;        &lt;td&gt;&amp;nbsp;&lt;/td&gt;        &lt;td&gt;&lt;b&gt;Blog&lt;/b&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Stephen Forte&lt;/td&gt;        &lt;td&gt;Technology Entrepreneur &amp;amp; Consultant&lt;/td&gt;        &lt;td&gt;&lt;a href="http://www.stephenforte.net"&gt;www.stephenforte.net&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Rob Zelt&lt;/td&gt;        &lt;td&gt;President, INETA North America&lt;/td&gt;        &lt;td&gt;&lt;a href="http://www.robzelt.com/blog"&gt;www.robzelt.com/blog&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Michael Eaton&lt;/td&gt;        &lt;td&gt;Independent Consultant&lt;/td&gt;        &lt;td&gt;&lt;a href="http://www.mjeaton.net/blog"&gt;www.mjeaton.net/blog&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Rachel Appel&lt;/td&gt;        &lt;td&gt;Independent Consultant&lt;/td&gt;        &lt;td&gt;&lt;a href="http://www.rachelappel.com"&gt;www.rachelappel.com&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Daniel Egan&lt;/td&gt;        &lt;td&gt;Developer Evangelist, Microsoft&lt;/td&gt;        &lt;td&gt;&lt;a href="http://www.dotnetdoc.com"&gt;www.dotnetdoc.com&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;To kick it off, I threw out a couple ideas:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;There is some debate about whether, for code camps, to have a speaker party or an attendee party, and whether to hold it the evening before or after the event. &lt;/li&gt;    &lt;li&gt;There is also some discussion about the practicality of having post-meeting events as well. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Here is the transcript:&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;b&gt;Stephen Forte: &lt;/b&gt;&lt;/i&gt;I think that there should be neither. Code Camps are suppose to be community based and organized. So if you want to have some kind of party, everyone should just go to the bar afterwards, nothing official. That is what we did, and we were lucky, our DE was there and picked up the first round or two.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;i&gt;Rob Zelt:&lt;/i&gt; &lt;/b&gt;I completely disagree with Stephen. (I&amp;#39;m not sure I do, but it always makes for a better conversation this way ;-)&lt;/p&gt;  &lt;p&gt;While I do think it is important for events like code camps to not put up barriers between speakers and attendees, I also think that creating an opportunity for speakers and volunteers to gather at a speaker dinner the night before a code camp creates an incentive for new speakers and volunteers to get involved. It doesn&amp;#39;t need to be anything fancy (or funded), but can go a long way as a pat on the back for those putting in the effort to make the event happen. &lt;/p&gt;  &lt;p&gt;I really like the model the SoCal groups use for their events that include a speaker/volunteer dinner of Friday and then a big attendee/speaker/volunteer event on the Saturday night. They go all out with a live band and everything, but I think the importance is in giving everybody a chance to socialize.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;i&gt;Steve Andrews: &lt;/i&gt;&lt;/b&gt;I agree with Stephen in that they typically shouldn’t be official. My thought though is that the speaker and/or attendee parties for Code Camps should occur after the event, as to attract more attendees and speakers, including those who come from out of town.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;i&gt;Daniel Egan: &lt;/i&gt;&lt;/b&gt;I agree with Rob... (obviously since he used us as a reference lol).&amp;nbsp; The great thing about code camp is that you are able to find new speakers that are not on the &amp;quot;user group circuit&amp;quot; already. The Friday meetup allows you the time to make the contact with these individuals and encourage them to do the talks at the UGs also. We do leave ours &amp;quot;Semi-open&amp;quot; meaning that others are allowed to come but it is not announced to ALL the attendees, but if they find out about it, they are welcome.&lt;/p&gt;  &lt;p&gt;As a matter of fact, I think I met Steve Andrews at the San Diego Speakers dinner.&amp;nbsp; So I guess you can decide if that was a good thing or bad thing :)&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;i&gt;Michael Eaton:&lt;/i&gt; &lt;/b&gt;I go back and forth on this one. While I think speaker dinners are ok, they can appear elitist. If I get into town early for an event, it&amp;#39;s nice to hang out with friends (who, for the most part, are speakers), but this doesn&amp;#39;t have to be an official event. As far as I&amp;#39;m concerned, anyone can show up, especially if it&amp;#39;s not being paid for by the event organizers.&lt;/p&gt;  &lt;p&gt;After parties are a great way to relax, especially if you&amp;#39;ve traveled and then spoken at the event.I think far too often though, the after-party *is* the event for many people.&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;b&gt;Rachel Appel: &lt;/b&gt;&lt;/i&gt;I think I&amp;#39;m with Mike on this one. I don&amp;#39;t want to appear elitist, nor do I want to exclude anyone. But I like to hang with my friends too, many of whom happen to be speaking. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;i&gt;Steve Andrews: &lt;/i&gt;&lt;/b&gt;I think opening up such events to everyone, and not just speakers or other influentials, is a great way to help grow local community. One suggestion I&amp;#39;ve heard for organizers who have some budget for food or drinks for speakers is to invite everyone, and issue drink and/or food tickets to speakers. Of course, I&amp;#39;d also propose raffling some off as well to attendees.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;i&gt;Michael Eaton:&lt;/i&gt;&lt;/b&gt; Hmmm, I don&amp;#39;t know about that. I know at Codemash this year, the speakers got free drink tickets for one of the hotel bars. I was given a couple for being an &amp;quot;influencer&amp;quot;, but honestly, it was weird because I had these tickets and many of my friends didn&amp;#39;t.&lt;/p&gt;  &lt;p&gt;On a related note, I know that at devLink last year, there was a raffle to win a chance to have dinner with the speakers. Maybe the national guys got off on it, but it was largely made fun of by the regional speakers.&lt;/p&gt;  &lt;p&gt;I think speakers should be applauded for traveling to events and giving up their time, but I really think we need to be careful about setting them apart at after-events.&lt;/p&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=738" width="1" height="1"&gt;</description><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Community+Radio/default.aspx">Community Radio</category></item><item><title>INETA Board of Directors: The Board Meeting</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/04/07/ineta-board-of-directors-the-board-meeting.aspx</link><pubDate>Wed, 08 Apr 2009 02:01:00 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:739</guid><dc:creator>Steve</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;This past weekend I went down to Raleigh, NC for my first INETA Board Meeting. Never a fan of being cooped up in a conference room, I had slight apprehensions about nicotine and caffeine withdrawls and the like. Rather, it turned out to be a very engaging and enjoyable time with fellow community-minded folks. I would even argue it was productive!&lt;/p&gt;  &lt;p&gt;As part of the meeting, we voted on the primary roles each director would be responsible for. I think the choices were obvious and well-placed, and I look forward to what the team will do over the next year. The primary role assignments are:&lt;/p&gt;  &lt;table cellpadding="2" cellspacing="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;Chris Williams&lt;/td&gt;        &lt;td&gt;Director of Membership&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Lori McKinney&lt;/td&gt;        &lt;td&gt;Director of Marketing&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Randy Walker&lt;/td&gt;        &lt;td&gt;Director of Speakers&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Shawn Weisfeld&lt;/td&gt;        &lt;td&gt;Director of Community Activities&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Steve Andrews&lt;/td&gt;        &lt;td&gt;Director of Technology&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;One piece of information I would like to share is that the Regional Speaker Program is not dead as some have suggested. Rather, it is actively being pursued and we are working on getting all the right pieces in place. More information will be announced as it is available.&lt;/p&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=739" width="1" height="1"&gt;</description><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/INETA/default.aspx">INETA</category></item><item><title>INETA Board of Directors</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/03/12/ineta-board-of-directors.aspx</link><pubDate>Thu, 12 Mar 2009 21:32:00 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:725</guid><dc:creator>Steve</dc:creator><slash:comments>3</slash:comments><description>&lt;p&gt;On Tuesday, INETA NORAM (the International .NET Association, North America) announced the results of their Board of Directors elections. INETA’s mission is to offer assistance and resources to community groups that promote and educate their membership in Microsoft&amp;#39;s .NET technologies.&lt;/p&gt;  &lt;p&gt;What makes this election different from the past however, is that I was elected to a Director position! I am very excited to step into this position on March 3rd and be a part of helping make our developer communities stronger.&lt;/p&gt;  &lt;p&gt;Throughout my moderate speaking schedule though, I have heard various complaints about INETA, and I want to take this opportunity to get your thoughts and concerns. To that end, I am soliciting feedback on INETA from the North American community. What does INETA do well? What issues have you had with INETA in the past? How can INETA better serve your local community? What do you want INETA to be?&lt;br /&gt;&lt;/p&gt;  &lt;p&gt;While I can’t promise anything, this is your opportunity to be heard. Feel free to send me an email, Twitter DM, IM, certified letter, carrier pigeon, or singing telegram.&lt;/p&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=725" width="1" height="1"&gt;</description><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/INETA/default.aspx">INETA</category></item><item><title>MSTest Digest #1</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/02/19/mstest-digest-1.aspx</link><pubDate>Thu, 19 Feb 2009 05:49:00 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:705</guid><dc:creator>Steve</dc:creator><slash:comments>4</slash:comments><description>&lt;p&gt;A couple weeks ago, I became engaged with some folks on Twitter about their specific complaints about MSTest. I received five complaints, some of which I sent off to Microsoft. I’d like to share the answers and Microsoft’s response in hopes of creating more awareness around the tool’s capabilities.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Artifact Cleanup – When tests are run, artifacts such as test results and the (optionally) shadow-copied assemblies are left behind. For a team running many, frequent tests, this can quickly eat up disk space.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;In Visual Studio 2008, a new option was created to help alleviate this problem. Under Tools &amp;gt; Options &amp;gt; Test Tools &amp;gt; Test Execution, there is a new setting called Test Result Management which contains a numeric option to limit the number of old test results. For tests executed as part of an automated Team Build, the results should always be scorched by Team Build as they are subsequently stored in the Team Foundation database.&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.platinumbay.com/blogs/postimages/MSTestDigest1_5E99/image.png" title="image" style="border-width:0px;display:block;float:none;margin-left:auto;margin-right:auto;" alt="image" width="644" border="0" height="105" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;b&gt;Extensibility: Creating custom MSTest attributes is a bit more drawn out than most would like.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Microsoft has simplified the ability to create custom test types by allowing inheritance from existing MSTest attributes. This builds on the Unit Test base and allows you to customize any part (initialize, cleanup, execution) of the test being run.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb165914.aspx"&gt;Creating Custom Test Types in Visual Studio Team System&lt;/a&gt; on MSDN &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blog.dotnetwiki.org/IntroducingYUnitAMicroscopicUnitTestFrameworkForTeamTest.aspx"&gt;Introducing YUnit, a Microscopic Unit Test Framework (for Team Test)&lt;/a&gt; – on Peli’s Farm &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;Transactions – NUnit has an option for Transactional tests, which automatically rollback after the test is run.&lt;/b&gt; &lt;/p&gt;  &lt;p&gt;This is not provided out of the box. You can either code up the transaction manually (&lt;a href="http://www.jimbodriven.com/2007/11/on-unit-tests-seed-data-and.html"&gt;http://www.jimbodriven.com/2007/11/on-unit-tests-seed-data-and.html&lt;/a&gt;), or use the extensibility points to create your own test type to handle this.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.codeplex.com/MSTestExtensions"&gt;MSTestExtensions&lt;/a&gt; on CodePlex&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;Data-driven Testing – In NUnit, there is a RowTest attribute which allows data to be specified to use in testing (&lt;/b&gt;&lt;a href="http://mjeaton.net/blog/archive/2008/11/03/getting-started-with-nunits-rowtest.aspx"&gt;&lt;b&gt;http://mjeaton.net/blog/archive/2008/11/03/getting-started-with-nunits-rowtest.aspx&lt;/b&gt;&lt;/a&gt;&lt;b&gt;).&lt;/b&gt; &lt;/p&gt;  &lt;p&gt;Microsoft is looking into this for future releases. For now, take a look how to achieve this in the current releases. This method has the added benefit of not having to recompile tests to change test data.&lt;br /&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://codeclimber.net.nz/archive/2008/01/18/How-to-simulate-RowTest-with-MS-Test.aspx"&gt;How to simulate RowTest with MSTest&lt;/a&gt; on Simone Chiaretta’s blog&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;Accessibility: It was suggested that MSTest should be available as a standalone, free product, similar to NUnit, MBUnit, xUnit, etc.&lt;/b&gt; &lt;/p&gt;  &lt;p&gt;Microsoft is looking into this for future releases.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;So of course my next question is, what else don’t you like about MSTest?&lt;/p&gt;&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=705" width="1" height="1"&gt;</description><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Team+System/default.aspx">Team System</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Team+Foundation/default.aspx">Team Foundation</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/MSTest/default.aspx">MSTest</category></item><item><title>Team System on Twitter</title><link>http://www.platinumbay.com/blogs/dotneticated/archive/2009/02/18/team-system-on-twitter.aspx</link><pubDate>Wed, 18 Feb 2009 20:52:00 GMT</pubDate><guid isPermaLink="false">643c9627-9341-4fbb-b075-f2ccb6a51baa:708</guid><dc:creator>Steve</dc:creator><slash:comments>13</slash:comments><description>&lt;p&gt;
        Twitter is quite the rage these days, so I thought I&amp;#39;d compile a list of all the
        Visual Studio and Team System influentials. Here you go:&lt;/p&gt;
    
&lt;table cellpadding="2" cellspacing="2"&gt;
        &lt;tbody&gt;
            
&lt;tr&gt;
                
&lt;td colspan="3"&gt;
                    &lt;h3&gt;
                        General Info&lt;/h3&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://www.twitter.com/MicrosoftVSTS"&gt;
                        @MicrosoftVSTS&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    &amp;nbsp;
                &lt;/td&gt;
                
&lt;td&gt;
                    &amp;nbsp;
                &lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td colspan="3"&gt;
                    &lt;h3&gt;
                        Product Teams&lt;/h3&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/JasonBarile"&gt;@JasonBarile&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Jason Barile
                &lt;/td&gt;
                
&lt;td&gt;
                    Principal Test Manager for Team Foundation Server
                &lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/adambarr"&gt;@adambarr&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Adam Barr
                &lt;/td&gt;
                
&lt;td&gt;
                    Test Lead for Team Foundation Build and Team System Web Access&lt;br /&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/jeffbe"&gt;@jeffbe&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Jeff Beehler
                &lt;/td&gt;
                
&lt;td&gt;
                    Chief of Staff for Visual Studio Team System&lt;br /&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/robcaron"&gt;@robcaron&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Rob Caron
                &lt;/td&gt;
                
&lt;td&gt;
                    Visual Studio Team System &lt;span class="bio"&gt;&lt;/span&gt;BlogFather
                &lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/noahcoad"&gt;@noahcoad&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Noah Coad
                &lt;/td&gt;
                
&lt;td&gt;
                    Program Manager for Visual Studio
                &lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/mgroves84"&gt;@mgroves84&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Mark Groves
                &lt;/td&gt;
                
&lt;td&gt;
                    &lt;span class="bio"&gt;Senior Project Manager for Visual Studio Architecture Edition&lt;/span&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/bharry"&gt;@bharry&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Brian Harry
                &lt;/td&gt;
                
&lt;td&gt;
                    &lt;span class="bio"&gt;Product Unit Manager for Team Foundation Server&lt;/span&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/gholliday"&gt;@gholliday&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Grant Holliday
                &lt;/td&gt;
                
&lt;td&gt;
                    &amp;nbsp;
                &lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/bubbafat"&gt;@bubbafat&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Robert Horvik
                &lt;/td&gt;
                
&lt;td&gt;
                    Software Engineer for Team Foundation Server&lt;br /&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/briankel"&gt;@briankel&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Brian Keller&lt;br /&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Technical Evangelist for Visual Studio Team System&lt;br /&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/jimlamb"&gt;@jimlamb&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Jim Lamb
                &lt;/td&gt;
                
&lt;td&gt;
                    Program Manager for Team Foundation Server
                &lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/mitrik"&gt;@mitrik&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Matt Mitrik
                &lt;/td&gt;
                
&lt;td&gt;
                    Program Manager
                &lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/markmyd"&gt;@markmyd&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Mark Mydland
                &lt;/td&gt;
                
&lt;td&gt;
                    Group Manager for Visual Studio Tester Edition
                &lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/pprovost"&gt;@pprovost&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Peter Provost
                &lt;/td&gt;
                
&lt;td&gt;
                    Senior Program Manager for Visual Studio Team System
                &lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/dseven"&gt;@dseven&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Doug Seven
                &lt;/td&gt;
                
&lt;td&gt;
                    Senior Program Manager for Visual Studio Team System
                &lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/chass"&gt;@chass&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Chuck Sterling
                &lt;/td&gt;
                
&lt;td&gt;
                    Program Manager for Visual Studio Team System
                &lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td colspan="3"&gt;
                    &lt;h3&gt;
                        MVPs&lt;/h3&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/edblankenship"&gt;
                        @edblankenship&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Ed Blankenship
                &lt;/td&gt;
                
&lt;td&gt;
                    &lt;a href="http://www.edsquared.com/"&gt;http://www.edsquared.com&lt;/a&gt;&lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/anthonyborton"&gt;
                        @anthonyborton&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Anthony Borton
                &lt;/td&gt;
                
&lt;td&gt;
                    &lt;a href="http://myvstsblog.com/"&gt;http://myvstsblog.com&lt;/a&gt;&lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/benday"&gt;@benday&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Ben Day
                &lt;/td&gt;
                
&lt;td&gt;&lt;a href="http://blog.benday.com/"&gt;http://blog.benday.com&lt;/a&gt;&lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/mitchdenny"&gt;@mitchdenny&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Mitch Denny
                &lt;/td&gt;
                
&lt;td&gt;
                    &lt;a href="http://notgartner.com/"&gt;http://notgartner.com&lt;/a&gt;&lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/mickey_gousset"&gt;
                        @mickey_gousset&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Mickey Gousset
                &lt;/td&gt;
                
&lt;td&gt;
                    &lt;a href="http://www.teamsystemrocks.com/"&gt;http://www.teamsystemrocks.com&lt;/a&gt;&lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/pjhacker"&gt;@pjhacker&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Paul Hacker
                &lt;/td&gt;
                
&lt;td&gt;
                    &lt;a href="http://www.phacker.wordpress.com/"&gt;http://www.phacker.wordpress.com&lt;/a&gt;&lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/kevdadev"&gt;@kevdadev&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Kevin Israel
                &lt;/td&gt;
                
&lt;td&gt;
                    &lt;a href="http://vsteamsystemcentral.com/cs21/blogs/kevin_israel"&gt;
                    http://vsteamsystemcentral.com/cs21/blogs/kevin_israel&lt;/a&gt;&lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/wesmacdonald"&gt;
                        @wesmacdonald&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Wes MacDonald
                &lt;/td&gt;
                
&lt;td&gt;
                    &lt;a href="http://wesmacdonald.spaces.live.com/"&gt;
                    http://wesmacdonald.spaces.live.com&lt;/a&gt;&lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/tedmalone"&gt;@tedmalone&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Ted Malone
                &lt;/td&gt;
                
&lt;td&gt;
                    &lt;a href="http://portal.sqltrainer.com/"&gt;http://portal.sqltrainer.com&lt;/a&gt;&lt;/td&gt;
            &lt;/tr&gt;
            
           
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/brianrandell"&gt;
                        @brianrandell&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Brian Randell
                &lt;/td&gt;
                
&lt;td&gt;
                    &lt;a href="http://www.mcwtech.com/cs/blogs/brianr"&gt;
                    http://www.mcwtech.com/cs/blogs/brianr&lt;/a&gt;&lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/clemensreijnen"&gt;
                        @clemensreijnen&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Clemens Reijnen
                &lt;/td&gt;
                
&lt;td&gt;
                    &lt;a href="http://www.clemensreijnen.nl/"&gt;http://www.clemensreijnen.nl&lt;/a&gt;&lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/michaelruminer"&gt;
                        @michaelruminer&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Michael Ruminer
                &lt;/td&gt;
                
&lt;td&gt;
                    &lt;a href="http://manicprogrammer.com/cs/blogs/michaelruminer"&gt;
                    http://manicprogrammer.com/cs/blogs/michaelruminer&lt;/a&gt;&lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/Joel_Semeniuk"&gt;
                        @Joel_Semeniuk&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Joel Semeniuk
                &lt;/td&gt;
                
&lt;td&gt;
                    &amp;nbsp;&lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/EtienneT"&gt;@EtienneT&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Etienne Tremblay
                &lt;/td&gt;
                
&lt;td&gt;
                    &amp;nbsp;&lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/omarv74"&gt;@omarv74&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    D. Omar Villarreal
                &lt;/td&gt;
                
&lt;td&gt;
                    &lt;a href="http://www.teamsystemrocks.com/"&gt;http://www.teamsystemrocks.com&lt;/a&gt;&lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/martinwoodward"&gt;
                        @martinwoodward&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Martin Woodward
                &lt;/td&gt;
                
&lt;td&gt;
                    &lt;a href="http://www.woodwardweb.com/"&gt;http://www.woodwardweb.com&lt;/a&gt;&lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td colspan="3"&gt;
                    &lt;h3&gt;
                        Other Influentials&lt;/h3&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://www.twitter.com/maordp"&gt;@maordp&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Maor David
                &lt;/td&gt;
                
&lt;td&gt;
                    Developer Evangelist, Former Team System MVP
                &lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://www.twitter.com/leshka"&gt;@leshka&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Alexei Govorine
                &lt;/td&gt;
                
&lt;td&gt;
                    Co-runs the Central Ohio ALM User Group
                &lt;/td&gt;
            &lt;/tr&gt;
            
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://www.twitter.com/jeffhunsaker"&gt;
                        @jeffhunsaker&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Jeff Hunsaker
                &lt;/td&gt;
                
&lt;td&gt;
                    Co-runs the Central Ohio ALM User Group
                &lt;/td&gt;
            &lt;/tr&gt;
         &lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://twitter.com/tommynorman"&gt;@tommynorman&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Tommy Norman
                &lt;/td&gt;
                
&lt;td&gt;
                    &lt;a href="http://tommynorman.blogspot.com/"&gt;http://tommynorman.blogspot.com&lt;/a&gt;&lt;/td&gt;
            &lt;/tr&gt;   
&lt;tr&gt;
                
&lt;td&gt;
                    &lt;a href="http://www.twitter.com/christullier"&gt;
                        @christullier&lt;/a&gt;
                &lt;/td&gt;
                
&lt;td&gt;
                    Chris Tullier
                &lt;/td&gt;
                
&lt;td&gt;
                    &lt;a href="http://www.platinumbay.com/controlpanel/blogs/www.TeamSystemLive.com"&gt;www.TeamSystemLive.com&lt;/a&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
        &lt;/tbody&gt;
    &lt;/table&gt;
&lt;img src="http://www.platinumbay.com/aggbug.aspx?PostID=708" width="1" height="1"&gt;</description><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/TFS/default.aspx">TFS</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Team+System/default.aspx">Team System</category><category domain="http://www.platinumbay.com/blogs/dotneticated/archive/tags/Team+Foundation/default.aspx">Team Foundation</category></item></channel></rss>