<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" version="2.0"><channel><title>Dan Wahlin's WebLog</title><link>http://weblogs.asp.net/dwahlin/default.aspx</link><description>jQuery, HTML5, JavaScript, ASP.NET, and XAML</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/dwahlin" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="dwahlin" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><title>Understanding C# Events, Delegates and Lambdas – New Pluralsight Course</title><link>http://weblogs.asp.net/dwahlin/archive/2013/04/26/understanding-c-events-delegates-and-lambdas-new-pluralsight-course.aspx</link><pubDate>Sat, 27 Apr 2013 06:08:04 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:10217229</guid><dc:creator>dwahlin</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://weblogs.asp.net/dwahlin/rsscomments.aspx?PostID=10217229</wfw:commentRss><comments>http://weblogs.asp.net/dwahlin/archive/2013/04/26/understanding-c-events-delegates-and-lambdas-new-pluralsight-course.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://pluralsight.com/training/Courses/TableOfContents/csharp-events-delegates" target="_blank"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://weblogs.asp.net/blogs/dwahlin/image_71C2294F.png" width="768" height="90" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;C# continues to grow in popularity attracting more and more developers looking to build Web, desktop or mobile applications targeting a variety of platforms. As developers learn the language the concept of events, delegates and lambdas tend to trip some up and generate a lot of questions. For example, what are delegates and how do they actually work? Would you ever create a custom delegate and in which scenarios? What’s a lambda used for and why would someone choose a lambda over other techniques? How do you write custom delegates/events and use them in C# classes to provide notifications to other components in an application? These are just a few of the questions that many struggle to understand.&lt;/p&gt;  &lt;p&gt;To help answer these questions and clarify the role of events, delegates, EventArgs, lambdas and other related features, I’m excited to announce the release of a new Pluralsight course titled &lt;strong&gt;&lt;a href="http://pluralsight.com/training/Courses/TableOfContents/csharp-events-delegates" target="_blank"&gt;C# Events, Delegates and Lambdas&lt;/a&gt;&lt;/strong&gt; that provides simple explanations that show the big picture and how events, delegates, lambdas and other components fit in. If you’re interested in gaining a more thorough understanding of how these C# technologies work together then you’ll definitely want to check out this new course!     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/dwahlin/image_172FE501.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px 15px 15px 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://weblogs.asp.net/blogs/dwahlin/image_thumb_26D280C3.png" width="434" height="346" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Key topics covered in the course include:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The role of events, delegates and event handlers &lt;/li&gt;    &lt;li&gt;How to create custom delegates and events &lt;/li&gt;    &lt;li&gt;Techniques for raising events (without raising errors) &lt;/li&gt;    &lt;li&gt;Different techniques that can be used to handle events &lt;/li&gt;    &lt;li&gt;The role of lambdas and how they provide a concise way to write code &lt;/li&gt;    &lt;li&gt;Built-in .NET delegates that can be used in your custom C# classes &lt;/li&gt;    &lt;li&gt;Using lambdas with delegates to provide flexibility in an application &lt;/li&gt; &lt;/ul&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=10217229" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dwahlin/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/Lambdas/default.aspx">Lambdas</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/Pluralsight/default.aspx">Pluralsight</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/Delegates/default.aspx">Delegates</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/Events/default.aspx">Events</category></item><item><title>What’s the Developer Community Like in India? My interview with Pinal Dave and Aaron Skonnard</title><link>http://weblogs.asp.net/dwahlin/archive/2013/04/24/what-s-the-developer-community-like-in-india-my-interview-with-pinal-dave-and-aaron-skonnard.aspx</link><pubDate>Thu, 25 Apr 2013 05:18:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:10209774</guid><dc:creator>dwahlin</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://weblogs.asp.net/dwahlin/rsscomments.aspx?PostID=10209774</wfw:commentRss><comments>http://weblogs.asp.net/dwahlin/archive/2013/04/24/what-s-the-developer-community-like-in-india-my-interview-with-pinal-dave-and-aaron-skonnard.aspx#comments</comments><description>&lt;p&gt;I had the opportunity to sit down with &lt;a href="https://twitter.com/pinaldave" target="_blank"&gt;Pinal Dave&lt;/a&gt; and &lt;a href="https://twitter.com/skonnard" target="_blank"&gt;Aaron Skonnard&lt;/a&gt; at &lt;a href="http://www.pluralsight.com" target="_blank"&gt;Pluralsight’s&lt;/a&gt; 2013 Author Summit to discuss the developer community in India and how immense it is. I’ve always been fascinated with the Indian culture, have a lot of friends there, and absolutely love the food so it was fun to talk with Pinal and Aaron and hear more details about the community and what Pluralsight is doing in that part of the world.&lt;/p&gt;  &lt;br /&gt;&lt;iframe height="480" src="http://www.youtube.com/embed/Q0_6AfD2SXc" frameborder="0" width="853" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=10209774" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dwahlin/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/Pluralsight/default.aspx">Pluralsight</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/India/default.aspx">India</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/Software+Development/default.aspx">Software Development</category></item><item><title>What’s a Pluralsight Study Group? Steve Woolley and I Discuss the Concept!</title><link>http://weblogs.asp.net/dwahlin/archive/2013/04/17/what-s-a-pluralsight-study-group-steve-woolley-and-i-discuss-the-concept.aspx</link><pubDate>Thu, 18 Apr 2013 06:52:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:10177927</guid><dc:creator>dwahlin</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://weblogs.asp.net/dwahlin/rsscomments.aspx?PostID=10177927</wfw:commentRss><comments>http://weblogs.asp.net/dwahlin/archive/2013/04/17/what-s-a-pluralsight-study-group-steve-woolley-and-i-discuss-the-concept.aspx#comments</comments><description>&lt;br /&gt;&lt;iframe height="480" src="http://www.youtube.com/embed/rq3jcwkoc68" frameborder="0" width="853" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;
&lt;br /&gt;
&lt;br /&gt;

&lt;p&gt;Have you ever heard about or attended a Pluralsight Study Group? If you’re new to the concept, Pluralsight &lt;a href="http://pluralsight.com/training/Community/Sponsorships" target="_blank"&gt;provides a subscription&lt;/a&gt; for a study group that can be used to access Pluralsight’s entire content library. Study group leaders then organize meetings where a group of people get together and watch and discuss courses over a span of several weeks depending on the course. &lt;/p&gt;  &lt;p&gt;I had the opportunity to visit the &lt;a href="http://www.meetup.com/NYPluralsightStudy/" target="_blank"&gt;New York Pluralsight Study Group&lt;/a&gt; while on a business trip and was really impressed with how interactive the group was. Instead of having people sitting around listening to a speaker present, asking a question every now and then and then wrapping things up, the NYC study group reviewed a portion of a course, paused the video, and then interacted with each other to discuss the code, how it could be used, and more. It was a different approach that really opened my eyes to how interactive a group can be when you can completely pause the content to discuss it more in-depth. Here’s the group I met while in NYC – it was a lot of fun! &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/dwahlin/image_3402E6D0.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://weblogs.asp.net/blogs/dwahlin/image_thumb_4A588C15.png" width="542" height="413" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;In addition to watching a course I presented a few concepts and had a lot of fun meeting the different people. Additional study groups are springing up all around the world now in &lt;a href="http://www.meetup.com/Sweden-Pluralsight-Study-Group/" target="_blank"&gt;Sweden&lt;/a&gt;, &lt;a href="http://www.meetup.com/NYPluralsightStudy/" target="_blank"&gt;NYC&lt;/a&gt;, &lt;a href="http://www.linkedin.com/groups/Philly-Pluralsight-Study-Group-4747950" target="_blank"&gt;Philadelphia&lt;/a&gt;, &lt;a href="http://www.copssg.org/" target="_blank"&gt;Ohio&lt;/a&gt;, &lt;a href="http://www.linkedin.com/groups?gid=4930731" target="_blank"&gt;Manila&lt;/a&gt;, &lt;a href="https://www.facebook.com/pages/Bangalore-Pluralsight-Study-Group/219535524859464" target="_blank"&gt;Bangalore&lt;/a&gt;, &lt;a href="http://odessastudygroup.blogspot.com/" target="_blank"&gt;Odessa&lt;/a&gt; and many other locations.&lt;/p&gt;  &lt;p&gt;While at the Pluralsight Author Summit earlier this year I had the opportunity to interview &lt;a href="https://twitter.com/stwool" target="_blank"&gt;Steve Woolley&lt;/a&gt; who’s the Director of Marketing at Pluralsight and talk about what a Pluralsight Study Group is, how Pluralsight helps, and how to get going if you’re interested in starting a study group in your area. If you’ve ever run a user group before and struggled to find speakers month after month then you’ll definitely want to check out the study group option since you’ll never have to find another speaker again! It’s definitely a different approach to the standard user group meeting that can be really interactive. If you’re interested in starting a study group watch the interview below and visit &lt;a href="http://pluralsight.com/training/Community/Sponsorships"&gt;http://pluralsight.com/training/Community/Sponsorships&lt;/a&gt; for more details.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  
&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=10177927" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dwahlin/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/Pluralsight/default.aspx">Pluralsight</category></item><item><title>Building an HTML5 Web Sockets Server with ASP.NET 4.5</title><link>http://weblogs.asp.net/dwahlin/archive/2013/04/13/building-an-html5-web-sockets-server-with-asp-net-4-5.aspx</link><pubDate>Sat, 13 Apr 2013 22:08:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:10152809</guid><dc:creator>dwahlin</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://weblogs.asp.net/dwahlin/rsscomments.aspx?PostID=10152809</wfw:commentRss><comments>http://weblogs.asp.net/dwahlin/archive/2013/04/13/building-an-html5-web-sockets-server-with-asp-net-4-5.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/dwahlin/image_1F239776.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: right; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" align="right" src="http://weblogs.asp.net/blogs/dwahlin/image_thumb_498FC893.png" width="152" height="152" /&gt;&lt;/a&gt;ASP.NET 4.5 now includes support for HTML5 Web Sockets which can provide a great way to add real-time communication to a Web app where a server can actually push data live to one or more clients. In this video from the &lt;a href="http://pluralsight.com/training/Courses/TableOfContents/aspnet-webforms45-new-features" target="_blank"&gt;New Features in ASP.NET 4.5&lt;/a&gt; Pluralsight course I walk through getting started with creating a Web Sockets server using a Nuget package from Microsoft called &lt;a href="http://nuget.org/packages/Microsoft.WebSockets/" target="_blank"&gt;Microsoft.WebSockets&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Learn to Use ASP.NET 4.5 Web Sockets - The Easy Way&lt;/h2&gt;  &lt;br /&gt;&lt;iframe height="480" src="http://www.youtube.com/embed/RKzxOUeVrIU" frameborder="0" width="640" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;  &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;If you'd like to learn more about the new features in the 4.5 release and in Visual Studio 2012 check out my &lt;a href="http://pluralsight.com/training/Courses/TableOfContents/aspnet-webforms45-new-features" target="_blank"&gt;Pluralsight course&lt;/a&gt;.   &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://pluralsight.com/training/Courses/TableOfContents/aspnet-webforms45-new-features" target="_blank"&gt;&lt;img style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; padding-right: 0px" border="0" src="http://weblogs.asp.net/blogs/dwahlin/image_7668CFF2.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;
Download samples of using the "raw" ASP.NET support for Web Sockets as well as the Microsoft.WebSockets support &lt;a href="https://dl.dropboxusercontent.com/u/6037348/HTML5AndJavaScript/WebSockets.zip"&gt;here&lt;/a&gt;. I've also included a Node.js sample for anyone who may be interested.
&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=10152809" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dwahlin/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/HTML5/default.aspx">HTML5</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/Websockets/default.aspx">Websockets</category></item><item><title>Video Tutorial: AngularJS Fundamentals in 60-ish Minutes</title><link>http://weblogs.asp.net/dwahlin/archive/2013/04/12/video-tutorial-angularjs-fundamentals-in-60-ish-minutes.aspx</link><pubDate>Sat, 13 Apr 2013 03:07:28 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:10146910</guid><dc:creator>dwahlin</dc:creator><slash:comments>34</slash:comments><wfw:commentRss>http://weblogs.asp.net/dwahlin/rsscomments.aspx?PostID=10146910</wfw:commentRss><comments>http://weblogs.asp.net/dwahlin/archive/2013/04/12/video-tutorial-angularjs-fundamentals-in-60-ish-minutes.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/dwahlin/image_3E5C0C5B.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; float: right; padding-top: 0px; padding-left: 0px; margin: 0px 0px 0px 15px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" align="right" src="http://weblogs.asp.net/blogs/dwahlin/image_thumb_325A1C27.png" width="290" height="108" /&gt;&lt;/a&gt;The term &amp;quot;Single Page Application&amp;quot; (&lt;a href="http://en.wikipedia.org/wiki/Single_page_application" target="_blank"&gt;SPA&lt;/a&gt;) is one of the biggest buzz words out there right now especially when it comes to building client-centric applications. SPAs provide a great way to load different views into a screen without reloading everything from scratch. When done right, true SPAs have support for history, routing, page lifecycle management, two-way data binding and more. How you get started with SPAs though? Do you go down the road of building 100% custom SPA applications or rely on a framework? &lt;/p&gt;  &lt;p&gt;I've debated that question a lot over the past year and preached (pretty strongly) that building a SPA from scratch just doesn't make any sense if productivity and maintenance are important to you. It may not be an issue for smaller apps but for larger, enterprise-scale apps with multiple screens, custom business rules and a plethora of other features &lt;em&gt;custom&lt;/em&gt; SPAs just don't make sense in my opinion. If you work on a team with multiple developers all having different skill levels then you can imagine what it'd be like to have everyone contributing custom code that doesn't have any consistency across it. In the long-run it becomes a maintenance nightmare especially if there isn't any documentation or tests available (which is bad I realize). Add in several 3rd party libraries and the problem can get even worse especially over time as new versions of scripts are released and others become stale.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/dwahlin/image_71B7CFB7.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; float: left; padding-top: 0px; padding-left: 0px; margin: 0px 15px 0px 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" align="left" src="http://weblogs.asp.net/blogs/dwahlin/image_thumb_1C2400D5.png" width="235" height="236" /&gt;&lt;/a&gt;The good news is that several different SPA frameworks have appeared on the scene that can greatly simplify the process of building SPAs while also making maintenance easier. One of the SPA frameworks that I really like is &lt;a href="http://angularjs.org" target="_blank"&gt;AngularJS&lt;/a&gt; since it provides a robust set of features that can be used out-of-the-box without having to be an expert in routing, history, data binding and more. It provides a solid base that you can build on top of. The challenge that I hear from many people though is that &amp;quot;AngularJS has a steep learning curve!&amp;quot;. I just gave a talk on AngularJS at the &lt;a href="http://anglebrackets.org/" target="_blank"&gt;AngleBrackets&lt;/a&gt; conference in Las Vegas and heard this statement from several people. To be real honest, I felt the same way the first time I looked at it. However, the more I dug in the more I realized how powerful the framework was and all of the ways it could enhance productivity while simplifying maintenance. &lt;a href="http://weblogs.asp.net/blogs/dwahlin/image_7B9CC122.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: right; padding-top: 0px; padding-left: 0px; margin: 10px 0px 0px 15px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" align="right" src="http://weblogs.asp.net/blogs/dwahlin/image_thumb_16D51A24.png" width="288" height="180" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Before moving on I should mention that I also like the &lt;a href="http://durandaljs.com/" target="_blank"&gt;Durandal&lt;/a&gt; SPA framework too - it has robust functionality built-in as well and is definitely worth checking out.&lt;/p&gt;  &lt;p&gt;To help break down the learning curve I've put together a short video series titled &amp;quot;AngularJS Fundamentals in 60-ish Minutes&amp;quot; (I added &amp;quot;ish&amp;quot; because it ended up being more than 60 minutes :-)). In the video you'll learn how to get started with the AngularJS framework and some of the key features it provides that simplify SPA development. You'll see how to use directives, filters and data binding techniques to capture and display data. Next up is views, controllers and scope and the role they play followed by a discussion of modules, routes and factories/services. At the end of the video a sample application built using AngularJS is shown. I hope you enjoy the video and that it helps jumpstart your AngularJS learning process!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h1&gt;AngularJS Fundamentals in 60-ish Minutes&lt;/h1&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Watch the complete video tutorial here or choose specific sections from the video below.&lt;/p&gt;  &lt;br /&gt;&lt;iframe height="480" src="http://www.youtube.com/embed/i9MHigUZKEM" frameborder="0" width="640" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Jump to a Specific Section:&lt;/h2&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=0g_KpX08T4c" target="_blank"&gt;Introduction to AngularJS&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=_kux-YQujjM" target="_blank"&gt;Getting Started with AngularJS Features&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=LFEHq8YANLI" target="_blank"&gt;Directives, Filters and Data Binding&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Uj-KLCTsQrw" target="_blank"&gt;Views, Controllers and Scope&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=rAyEGv67P-U" target="_blank"&gt;Modules, Routes and Factories/Services&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=qCzYrDgOy1A" target="_blank"&gt;Customer Manager App Demo&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=SL5sTjyowLY" target="_blank"&gt;Summary and Resources&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;   &lt;br /&gt;&lt;a href="http://tinyurl.com/AngularJSDemos"&gt;Download AngularJS samples&lt;/a&gt; and the Customer Manager sample application shown in the video.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=10146910" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dwahlin/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/HTML5/default.aspx">HTML5</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/Pluralsight/default.aspx">Pluralsight</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/Ajax/default.aspx">Ajax</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/Databinding/default.aspx">Databinding</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/SPA/default.aspx">SPA</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/AngularJS/default.aspx">AngularJS</category></item><item><title>Slides and Code from my AngleBrackets/DevIntersection Talks: AngularJS, ASP.NET MVC, jQuery and JavaScript</title><link>http://weblogs.asp.net/dwahlin/archive/2013/04/11/slides-and-code-from-my-anglebrackets-devintersection-talks-angularjs-asp-net-mvc-jquery-and-javascript.aspx</link><pubDate>Thu, 11 Apr 2013 19:38:25 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:10136873</guid><dc:creator>dwahlin</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://weblogs.asp.net/dwahlin/rsscomments.aspx?PostID=10136873</wfw:commentRss><comments>http://weblogs.asp.net/dwahlin/archive/2013/04/11/slides-and-code-from-my-anglebrackets-devintersection-talks-angularjs-asp-net-mvc-jquery-and-javascript.aspx#comments</comments><description>&lt;p&gt;The &lt;a href="http://anglebrackets.org/" target="_blank"&gt;AngleBrackets&lt;/a&gt; and &lt;a href="http://devintersection.com/" target="_blank"&gt;DevIntersection&lt;/a&gt; conference is all wrapped up for me and I had a great time as always meeting new people and talking about technologies that I really love to work with. Thanks to everyone that took the time to come to my talks - I definitely had a lot of fun giving them and chatting with people after each session.&lt;/p&gt;  &lt;p&gt;As promised, here are the code and slides from each presentation.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h1&gt;Simplify SPA Development with the AngularJS JavaScript Framework&lt;/h1&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Abstract:&lt;/h3&gt;  &lt;p&gt;This talk covers the &lt;a href="http://angularjs.org/" target="_blank"&gt;AngularJS&lt;/a&gt; JavaScript framework (one of my favorite frameworks out there!) and discusses challenges associated with Single Page Applications (SPA). Throughout the talk I go into detail about how AngularJS helps solve many of the challenges with built-in support for two-way data binding, directives and filters, controllers, ViewModels (scope) and more. I also discuss the relationship of modules to controllers, factories/services and how the big picture looks.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;Presentation:&lt;/h4&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;iframe style="margin-bottom: 5px; border-top: #ccc 1px solid; border-right: #ccc 1px solid; border-bottom: #ccc 0px solid; border-left: #ccc 1px solid" height="486" marginheight="0" src="http://www.slideshare.net/slideshow/embed_code/18631218" frameborder="0" width="597" marginwidth="0" scrolling="no" mozallowfullscreen="mozallowfullscreen" webkitallowfullscreen="webkitallowfullscreen" allowfullscreen="allowfullscreen"&gt; &lt;/iframe&gt;  &lt;br /&gt;  &lt;br /&gt;  &lt;div style="margin-bottom: 5px"&gt;&lt;strong&gt;&lt;a title="Simplify SPA Development with the AngularJS JavaScript Framework" href="http://www.slideshare.net/DanWahlin/simplify-spa-development-with-the-angularjs-javascript-framework" target="_blank"&gt;Simplify SPA Development with the AngularJS JavaScript Framework&lt;/a&gt; &lt;/strong&gt;from &lt;strong&gt;&lt;a href="http://www.slideshare.net/DanWahlin" target="_blank"&gt;Dan Wahlin&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;Code Samples:&lt;/h4&gt;  &lt;p&gt;   &lt;br /&gt;&lt;a href="http://tinyurl.com/AngularJSDemos"&gt;http://tinyurl.com/AngularJSDemos&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h1&gt;JavaScript Patterns to Cleanup your Code&lt;/h1&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Abstract:&lt;/h3&gt;  &lt;p&gt;This talk covers JavaScript patterns that can be used to structure code and clean it up to enhance productivity and simplify maintenance. Topics covered include why &amp;quot;function spaghetti code&amp;quot; is bad, the role of closures and different patterns such as the Prototype Pattern, Revealing Module Pattern and the Revealing Prototype Pattern.    &lt;br /&gt;    &lt;br /&gt;A full course on this subject can be found on &lt;a href="http://pluralsight.com/training/Courses/TableOfContents/structuring-javascript" target="_blank"&gt;Pluralsight.com&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;Presentation:&lt;/h4&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;iframe style="margin-bottom: 5px; border-top: #ccc 1px solid; border-right: #ccc 1px solid; border-bottom: #ccc 0px solid; border-left: #ccc 1px solid" height="486" marginheight="0" src="http://www.slideshare.net/slideshow/embed_code/18631131" frameborder="0" width="597" marginwidth="0" scrolling="no" mozallowfullscreen="mozallowfullscreen" webkitallowfullscreen="webkitallowfullscreen" allowfullscreen="allowfullscreen"&gt; &lt;/iframe&gt;  &lt;br /&gt;  &lt;br /&gt;  &lt;div style="margin-bottom: 5px"&gt;&lt;strong&gt;&lt;a title="JavaScript Patterns to Cleanup your Code" href="http://www.slideshare.net/DanWahlin/java-script-patterns-to-cleanup-your-code" target="_blank"&gt;JavaScript Patterns to Cleanup your Code&lt;/a&gt; &lt;/strong&gt;from &lt;strong&gt;&lt;a href="http://www.slideshare.net/DanWahlin" target="_blank"&gt;Dan Wahlin&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;Code Samples:&lt;/h4&gt;  &lt;p&gt;   &lt;br /&gt;&lt;a href="http://tinyurl.com/StructuringJSCode"&gt;http://tinyurl.com/StructuringJSCode&lt;/a&gt;     &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h1&gt;Building an End-to-End HTML5 App with ASP.NET MVC 4, Entity Framework and jQuery &lt;/h1&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Abstract:&lt;/h3&gt;  &lt;p&gt;HTML5 is all the rage these days but where do you look to find robust examples of using it along with jQuery, client-side templates, Ajax calls, data access technologies, and more? In this talk I walk through an application that demonstrates how key HTML5 technologies can be integrated and used to present data to users in different ways. Topics covered include exposing data to the client using RESTful services created using the new ASP.NET Web API, using Handlebars templates to render data, JavaScript techniques for structuring code, the role of HTML5 semantic tags, as well as how technologies such as the canvas, SVG, and video can be used. If you want to learn server-side as well as client-side techniques and strategies then this session is for you.    &lt;br /&gt;    &lt;br /&gt;A full course covering these technologies can be found on &lt;a href="http://pluralsight.com/training/Courses/TableOfContents/web-development" target="_blank"&gt;Pluralsight.com&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;Presentation:&lt;/h4&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;iframe style="margin-bottom: 5px; border-top: #ccc 1px solid; border-right: #ccc 1px solid; border-bottom: #ccc 0px solid; border-left: #ccc 1px solid" height="486" marginheight="0" src="http://www.slideshare.net/slideshow/embed_code/18631397" frameborder="0" width="597" marginwidth="0" scrolling="no" mozallowfullscreen="mozallowfullscreen" webkitallowfullscreen="webkitallowfullscreen" allowfullscreen="allowfullscreen"&gt; &lt;/iframe&gt;  &lt;br /&gt;  &lt;br /&gt;  &lt;div style="margin-bottom: 5px"&gt;&lt;strong&gt;&lt;a title="Building the an End-to-End ASP.NET MVC 4, Entity Framework, HTML5, jQuery application" href="http://www.slideshare.net/DanWahlin/building-the-an-endtoend-aspnet-mvc-4-entity-framework-html5-jquery-application" target="_blank"&gt;Building the an End-to-End ASP.NET MVC 4, Entity Framework, HTML5, jQuery application&lt;/a&gt; &lt;/strong&gt;from &lt;strong&gt;&lt;a href="http://www.slideshare.net/DanWahlin" target="_blank"&gt;Dan Wahlin&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;  &lt;div&gt;   &lt;br /&gt;&lt;/div&gt;  &lt;div style="margin-bottom: 5px"&gt;&amp;#160;&lt;/div&gt;  &lt;h4&gt;Code Samples:&lt;/h4&gt;  &lt;p&gt;   &lt;br /&gt;&lt;a href="http://tinyurl.com/AAG2013"&gt;http://tinyurl.com/AAG2013&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=10136873" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dwahlin/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/ASP.NET+MVC/default.aspx">ASP.NET MVC</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/jQuery/default.aspx">jQuery</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/SPA/default.aspx">SPA</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/ASP.NET+Web+API/default.aspx">ASP.NET Web API</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/AngularJS/default.aspx">AngularJS</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/patterns/default.aspx">patterns</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/anglebrackets/default.aspx">anglebrackets</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/devintersection/default.aspx">devintersection</category></item><item><title>Using AngularJS: My Interview with Joe Eames and Jim Cooper</title><link>http://weblogs.asp.net/dwahlin/archive/2013/04/11/using-angularjs-my-interview-with-joe-eames-and-jim-cooper.aspx</link><pubDate>Thu, 11 Apr 2013 17:26:29 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:10136224</guid><dc:creator>dwahlin</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://weblogs.asp.net/dwahlin/rsscomments.aspx?PostID=10136224</wfw:commentRss><comments>http://weblogs.asp.net/dwahlin/archive/2013/04/11/using-angularjs-my-interview-with-joe-eames-and-jim-cooper.aspx#comments</comments><description>&lt;p&gt;I'm really excited about the &lt;a href="http://angularjs.org" target="_blank"&gt;AngularJS&lt;/a&gt; JavaScript framework given all of the great features it offers out of the box for building Single Page Applications (SPAs) and really any application that has a lot of client-side functionality. I just returned from the &lt;a href="http://www.devintersection.com" target="_blank"&gt;DevIntersection&lt;/a&gt; and &lt;a href="http://www.anglebrackets.org" target="_blank"&gt;AngleBrackets&lt;/a&gt; conference in Las Vegas and there was a lot of buzz about the framework at my different AngularJS and JavaScript talks.&lt;/p&gt;  &lt;p&gt;While at the &lt;a href="http://www.pluralsight.com" target="_blank"&gt;Pluralsight&lt;/a&gt; Author Summit in March, I had the opportunity to sit down with &lt;a href="https://twitter.com/josepheames" target="_blank"&gt;Joe Eames&lt;/a&gt; and &lt;a href="http://twitter.com/jimthecoop" target="_blank"&gt;Jim Cooper&lt;/a&gt; to talk about how they've used AngularJS, their favorite features and how it was used to build &lt;a href="http://www.pluralsight.com" target="_blank"&gt;Pluralsight's&lt;/a&gt; HTML5 video player. In the interview we discuss some of our favorite AngularJS features, benefits it offers developers as well as a few other related subjects. If you're interested in hearing more about what AngularJS is and what it can do, check out the interview for a quick introduction.&lt;/p&gt;  &lt;p&gt;For more information about AngularJS visit &lt;a href="http://angularjs.org"&gt;http://angularjs.org&lt;/a&gt;. &lt;/p&gt;  &lt;br /&gt;&lt;span class="embed-youtube" style="display: block"&gt;&lt;iframe class="youtube-player" height="359" src="http://www.youtube.com/embed/saWFkRIOwLE?version=3&amp;amp;rel=1&amp;amp;fs=1&amp;amp;showsearch=0&amp;amp;showinfo=1&amp;amp;iv_load_policy=1&amp;amp;wmode=transparent" frameborder="0" width="584" type="text/html"&gt;&lt;/iframe&gt;&lt;/span&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=10136224" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dwahlin/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/Pluralsight/default.aspx">Pluralsight</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/AngularJS/default.aspx">AngularJS</category></item><item><title>Model Binding in ASP.NET 4.5 Web Forms</title><link>http://weblogs.asp.net/dwahlin/archive/2013/04/02/asp-net-4-5-web-forms-features-model-binding.aspx</link><pubDate>Tue, 02 Apr 2013 19:15:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:10085280</guid><dc:creator>dwahlin</dc:creator><slash:comments>4</slash:comments><wfw:commentRss>http://weblogs.asp.net/dwahlin/rsscomments.aspx?PostID=10085280</wfw:commentRss><comments>http://weblogs.asp.net/dwahlin/archive/2013/04/02/asp-net-4-5-web-forms-features-model-binding.aspx#comments</comments><description>
&lt;p&gt;&lt;a href="http://pluralsight.com/training/Courses/TableOfContents/aspnet-webforms45-new-features" target="_blank"&gt;&lt;img style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; padding-right: 0px" border="0" src="http://weblogs.asp.net/blogs/dwahlin/image_7668CFF2.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;br /&gt;

&lt;p&gt;In my last post on ASP.NET 4.5 Web Forms features I talked about the new &lt;a href="http://weblogs.asp.net/dwahlin/archive/2013/03/26/asp-net-4-5-web-forms-features-strongly-typed-data-controls.aspx" target="_blank"&gt;strongly-typed data controls&lt;/a&gt; that are available and how you can now get Intellisense as you access object properties within a server control template. It's a great feature that you definitely need to check out if you haven't already. Here's a quick summary of what's new when it comes to data-specific features in the ASP.NET 4.5 release:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://weblogs.asp.net/blogs/dwahlin/image_341B9424.png" width="455" height="288" /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;In this post I'm going to focus on my overall favorite new feature in ASP.NET 4.5 called model binding (check out all of the new features in my &lt;a href="http://pluralsight.com/training/Courses/TableOfContents/aspnet-webforms45-new-features" target="_blank"&gt;Pluralsight course&lt;/a&gt;). Model binding isn't exactly a &amp;quot;new&amp;quot; feature when it comes to .NET because ASP.NET MVC has had it for a long time. However, it's new to ASP.NET Web Forms and yet another feature that will truly change how you write your application code if you take advantage of what it offers.     &lt;br /&gt;&lt;/p&gt;  &lt;h2&gt;What is Model Binding?&lt;/h2&gt;  &lt;p&gt;In a nutshell, model binding is the process of getting model objects in and out of controls without writing a lot of plumbing code to do it. You can now bind data controls directly to methods that provide select, insert, update and delete functionality. When the methods are called you don't have to write a lot of code to access the values that were posted back in the case of update, insert, or delete operations. Instead, model binding allows you to have a given model object's properties (a class with properties if you're not familiar with model objects) automatically filled with the posted back data. Here's an example of a model object named SalesOrderHeader:   &lt;br /&gt;&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; SalesOrderHeader
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; SalesOrderHeader()
    {
        &lt;span class="kwrd"&gt;this&lt;/span&gt;.SalesOrderDetails = &lt;span class="kwrd"&gt;new&lt;/span&gt; HashSet&amp;lt;SalesOrderDetail&amp;gt;();
    }
    
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; SalesOrderID { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;byte&lt;/span&gt; RevisionNumber { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; System.DateTime OrderDate { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; System.DateTime DueDate { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; Nullable&amp;lt;System.DateTime&amp;gt; ShipDate { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;byte&lt;/span&gt; Status { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; OnlineOrderFlag { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; SalesOrderNumber { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; PurchaseOrderNumber { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; AccountNumber { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; CustomerID { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; Nullable&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; ShipToAddressID { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; Nullable&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; BillToAddressID { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; ShipMethod { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; CreditCardApprovalCode { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;decimal&lt;/span&gt; SubTotal { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;decimal&lt;/span&gt; TaxAmt { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;decimal&lt;/span&gt; Freight { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;decimal&lt;/span&gt; TotalDue { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Comment { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; System.Guid rowguid { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; System.DateTime ModifiedDate { get; set; }
    
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; Customer Customer { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; ICollection&amp;lt;SalesOrderDetail&amp;gt; SalesOrderDetails { get; set; }
}&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Model binding will save you having to write that nasty code that's been required in the past to dive into a data control such as a GridView or ListView, extract the values and fill a model object's properties. Here's an example of the old way of accessing data posted back from a data control (this is just one way to do it - the Request object could also be used):&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OrdersListView_ItemUpdating(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, ListViewUpdateEventArgs e)
{
    var orderID = &lt;span class="kwrd"&gt;int&lt;/span&gt;.Parse(((Label)GetControl(e, &lt;span class="str"&gt;&amp;quot;OrderID&amp;quot;&lt;/span&gt;)).Text);
    var orderDate = DateTime.Parse(((TextBox)GetControl(e, &lt;span class="str"&gt;&amp;quot;OrderDate&amp;quot;&lt;/span&gt;)).Text);
    var dueDate = DateTime.Parse(((TextBox)GetControl(e, &lt;span class="str"&gt;&amp;quot;DueDate&amp;quot;&lt;/span&gt;)).Text);
    var shipDate = DateTime.Parse(((TextBox)GetControl(e, &lt;span class="str"&gt;&amp;quot;ShipDate&amp;quot;&lt;/span&gt;)).Text);
    var subTotal = &lt;span class="kwrd"&gt;decimal&lt;/span&gt;.Parse(((TextBox)GetControl(e, &lt;span class="str"&gt;&amp;quot;SubTotal&amp;quot;&lt;/span&gt;)).Text);

    &lt;span class="rem"&gt;//Update data in database&lt;/span&gt;

}&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;
  &lt;br /&gt;With model binding the values posted back can automatically be updated in the target model object without having to write all of the messy code shown here to extract them. Let's look at an example of how it all works. 

  &lt;br /&gt;

  &lt;br /&gt;&lt;/p&gt;

&lt;h2&gt;Binding Methods Directly to a Data Control&lt;/h2&gt;

&lt;p&gt;Assume that we have a simple application that displays customers in a DropDownList. As a customer is selected their orders are displayed using a ListView and the client can then edit the order if desired:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/dwahlin/image_6DBA1482.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://weblogs.asp.net/blogs/dwahlin/image_thumb_5B051ACB.png" width="573" height="320" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;To load the DropDownList we can take advantage of model binding and bind a collection of customers directly to the control by defining a select method using the new SelectMethod property as shown next:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:DropDownList&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;CustomersDropDown&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;AutoPostBack&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;True&amp;quot;&lt;/span&gt; 
    &lt;strong&gt;&lt;span class="attr"&gt;SelectMethod&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;BindCustomers&amp;quot;&lt;/span&gt;&lt;/strong&gt;
    &lt;span class="attr"&gt;AppendDataBoundItems&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;
    &lt;span class="attr"&gt;DataTextField&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;FullName&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;DataValueField&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;CustomerID&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:ListItem&lt;/span&gt; &lt;span class="attr"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Select One:&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:ListItem&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:DropDownList&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;The BindCustomers() method handles retrieving data from the database that's then bound into the dropdown control:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; IQueryable&amp;lt;Customer&amp;gt; BindCustomers()
{
    var custs = from cust &lt;span class="kwrd"&gt;in&lt;/span&gt; _DbContext.Customers
                join order &lt;span class="kwrd"&gt;in&lt;/span&gt; _DbContext.SalesOrderHeaders on cust.CustomerID equals order.CustomerID
                orderby cust.LastName
                select cust;
        &lt;span class="kwrd"&gt;return&lt;/span&gt; custs;
}&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; To keep things simple and focused this example puts the database code in the code-behind file. I highly recommend creating a separate data access layer in real applications. See &lt;a href="http://weblogs.asp.net/dwahlin/archive/2008/02/18/building-an-n-layer-asp-net-application-with-linq-lambdas-and-stored-procedures.aspx" target="_blank"&gt;this post&lt;/a&gt; for a starter example of what I mean.

  &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;A data control such as a ListView can then extract the customer ID from the DropDownList and use it to grab all of the orders for the selected customer. The following example defines the select method that handles retrieving orders as well as the insert, update and delete methods that should be called when an order is inserted or edited:&lt;/p&gt;

&lt;p&gt;
  &lt;br /&gt;

  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:ListView&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;OrdersListView&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; 
    &lt;span class="attr"&gt;ItemType&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ModelBinding.Data.SalesOrderHeader&amp;quot;&lt;/span&gt;
    &lt;span class="attr"&gt;DataKeyNames&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;SalesOrderID&amp;quot;&lt;/span&gt;
    &lt;span class="attr"&gt;SelectMethod&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;BindOrders&amp;quot;&lt;/span&gt;
    &lt;span class="attr"&gt;UpdateMethod&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;UpdateOrder&amp;quot;&lt;/span&gt;
    &lt;span class="attr"&gt;InsertMethod&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;InsertOrder&amp;quot;&lt;/span&gt;
    &lt;span class="attr"&gt;DeleteMethod&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;DeleteOrder&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;

   Templates go here

&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ListView&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;br /&gt;&lt;/p&gt;

&lt;h2&gt;Using Model Binding Attributes&lt;/h2&gt;

&lt;p&gt;How does the BindOrders() method defined on the ListView control know where to get the customer ID from though? You could certainly write code to do it, or you could leverage model binding value provider attributes such as [Control(&amp;quot;ControlID&amp;quot;)] to automatically map a selected value to a method parameter. An example of doing this in the BindOrders() method is shown next:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; IQueryable&amp;lt;SalesOrderHeader&amp;gt; BindOrders([Control(&lt;span class="str"&gt;&amp;quot;CustomersDropDown&amp;quot;&lt;/span&gt;)] &lt;span class="kwrd"&gt;int&lt;/span&gt;? customerID)
{
    var orders = from c &lt;span class="kwrd"&gt;in&lt;/span&gt; _DbContext.SalesOrderHeaders
                    &lt;span class="kwrd"&gt;where&lt;/span&gt; c.CustomerID == customerID
                    orderby c.OrderDate
                    select c;
    &lt;span class="kwrd"&gt;return&lt;/span&gt; orders;
}&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Notice that the customerID parameter has a value provider attribute in front of it: [Control(&amp;quot;CustomersDropdown&amp;quot;)]. This instructs the ASP.NET runtime to automatically grab the selected value from the dropdown and pass it in as the customerID parameter. From there, the method handles grabbing the orders from the database and returning them. The ListView then uses its ItemTemplate to bind the order data into the page. There are additional value provider attributes available such as [QueryString], [Route],[Profile], [Session], [ViewState] and others. See the &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.modelbinding.aspx" target="_blank"&gt;System.Web.ModelBinding documentation&lt;/a&gt; for details.

  &lt;br /&gt;

  &lt;br /&gt;&lt;/p&gt;

&lt;h2&gt;Mapping Posted Back Values to Model Object Properties&lt;/h2&gt;

&lt;p&gt;When the end user edits an order the ListView's EditItemTemplate renders and when the update button is clicked the UpdateOrder() method shown earlier on the ListView definition is called. Prior to ASP.NET 4.5 we would have to write the old code that I showed at the beginning of this post to extract all of the values from the EditItemTemplate. That's a process that I've never enjoyed very much since it's quite tedious and subject to typos. With model binding we can have the ASP.NET framework automatically fill the model object that was edited (a SalesOrderHeader object in this case) with data. Here's what the UpdateOrder() method looks like:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;// The id parameter name should match the DataKeyNames value set on the control&lt;/span&gt;
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; UpdateOrder(&lt;span class="kwrd"&gt;int&lt;/span&gt; SalesOrderID)
{
    ModelBinding.Data.SalesOrderHeader order = _DbContext.SalesOrderHeaders.Find(SalesOrderID);
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (order == &lt;span class="kwrd"&gt;null&lt;/span&gt;)
    {
        ModelState.AddModelError(&lt;span class="str"&gt;&amp;quot;Error&amp;quot;&lt;/span&gt;, String.Format(&lt;span class="str"&gt;&amp;quot;Item with id {0} was not found&amp;quot;&lt;/span&gt;, SalesOrderID));
        &lt;span class="kwrd"&gt;return&lt;/span&gt;;
    }

    TryUpdateModel(order);

    &lt;span class="kwrd"&gt;if&lt;/span&gt; (ModelState.IsValid)
    {
        &lt;span class="kwrd"&gt;try&lt;/span&gt;
        {
            _DbContext.SaveChanges();
            OrdersListView.EditIndex = -1;
            ErrorLabel.Text = String.Empty;
        }
        &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception exp)
        {
            ErrorLabel.Text = exp.Message;
        }         
    }
}&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;The primary key for the order that is being edited is automatically passed as a parameter since the DataKeyNames value on the ListView (SalesOrderID) matches the parameter name in UpdateOrder().&amp;#160; From there, the SalesOrderHeader object is retrieved from the database using the key and if it isn't found a model error is added into the model errors collection using ModelState.AddModelError(). ModelState is a new property off of the Page class. If the order is found the TryUpdateModel() method is called and the order is passed into it as a parameter. The values that were posted back from the ListView are automatically mapped into the object's properties with that one line of code - a huge increase in productivity!&lt;/p&gt;

&lt;p&gt;From there the code ensures that the data defined in the model object is valid (for example if any properties are required then an error will be added into the model errors collection if no data was found for them) and if it is valid the object is updated in the database using Entity Framework.&lt;/p&gt;

&lt;p&gt;An alternative technique for performing model binding as an order is being updated is shown next:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; UpdateOrder2(SalesOrderHeader order)
{
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (order != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
    {
        &lt;span class="kwrd"&gt;try&lt;/span&gt;
        {
            &lt;span class="rem"&gt;//Only updating a few properties so grab original order&lt;/span&gt;
            var originalOrder = _DbContext.SalesOrderHeaders.Find(order.SalesOrderID);
            originalOrder.OrderDate = order.OrderDate;
            originalOrder.DueDate = order.DueDate;
            originalOrder.ShipDate = order.ShipDate;
            originalOrder.SubTotal = order.SubTotal;

            _DbContext.SaveChanges();
            OrdersListView.EditIndex = -1;
            ErrorLabel.Text = String.Empty;
        }
        &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception exp)
        {
            ErrorLabel.Text = exp.Message;
        }
    }
}&lt;/pre&gt;

&lt;p&gt;
  &lt;br /&gt;Notice that the type of object defined in the ListView's ItemType (shown earlier) is included as a parameter in the method - a SalesOrderHeader type in this example. As data is posted back, the framework will try to automatically map the values to the order object's properties. From there it's trivial to map the updated values into the order retrieved from the database and then commit the changes. You can define the model object that needs to be filled with values as a parameter or use TryUpdateModel() to map posted back values. I'll let you choose which technique you like best since both will handle updating the model errors collection if there's a problem that's encountered.&lt;/p&gt;

&lt;p&gt;The insert and delete methods are quite similar to the update method. The InsertOrder() method below grabs the customerID for the order to insert from the dropdown control using the value provider attribute and the target model object is then created and updated using TryUpdateModel(). If the model state is valid the order is inserted into the database. The DeleteOrder() method accepts the primary key for the order to delete and then performs the delete operation.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; InsertOrder([Control(&lt;span class="str"&gt;&amp;quot;CustomersDropDown&amp;quot;&lt;/span&gt;)] &lt;span class="kwrd"&gt;int&lt;/span&gt;? custID)
{
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (custID == &lt;span class="kwrd"&gt;null&lt;/span&gt; || custID == 0)
    {
        ErrorLabel.Text = &lt;span class="str"&gt;&amp;quot;Select a customer before inserting a record&amp;quot;&lt;/span&gt;;
        &lt;span class="kwrd"&gt;return&lt;/span&gt;;
    }

    var order = &lt;span class="kwrd"&gt;new&lt;/span&gt; SalesOrderHeader();
    TryUpdateModel(order);
    order.CustomerID = custID.Value;
    order.ModifiedDate = DateTime.Now;

    &lt;span class="kwrd"&gt;if&lt;/span&gt; (ModelState.IsValid)
    {
        &lt;span class="kwrd"&gt;try&lt;/span&gt;
        {
            _DbContext.SalesOrderHeaders.Add(order);
            _DbContext.SaveChanges();
            ErrorLabel.Text = String.Empty;
        }
        &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception exp)
        {
            ErrorLabel.Text = exp.Message;
        }
    }
    &lt;span class="kwrd"&gt;else&lt;/span&gt;
    {
        ErrorLabel.Text = &lt;span class="str"&gt;&amp;quot;Complete all values&amp;quot;&lt;/span&gt;;
    }
}

&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; DeleteOrder(&lt;span class="kwrd"&gt;int&lt;/span&gt; SalesOrderID)
{
    &lt;span class="kwrd"&gt;try&lt;/span&gt;
    {
        var order = _DbContext.SalesOrderHeaders.Find(SalesOrderID);
        _DbContext.SalesOrderHeaders.Remove(order);
        _DbContext.SaveChanges();
        ErrorLabel.Text = String.Empty;
    }
    &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception exp)
    {
        ErrorLabel.Text = exp.Message;
    }
}&lt;/pre&gt;

&lt;p&gt;
  &lt;br /&gt;&lt;/p&gt;

&lt;h2&gt;Conclusion
  &lt;br /&gt;&lt;/h2&gt;

&lt;p&gt;And there you have it! Model binding allows model objects to be bound directly to controls and allows data that's posted back to automatically be mapped into model object properties. It's a feature I've wanted for quite awhile since I've used it heavily in ASP.NET MVC applications. By using the feature you can significantly enhance your productivity and minimize the amount of code you have to write (which is great for maintenance). If you'd like to try out a demonstration of the code discussed here &lt;a href="https://dl.dropbox.com/u/6037348/ASPNET4.5/ModelBinding.zip"&gt;download the sample project&lt;/a&gt; (you'll need Visual Studio 2012 to run it).&lt;/p&gt;

&lt;p&gt;if you'd like to learn more about the new features in the ASP.NET 4.5 release check out my Pluralsight course titled &lt;a href="http://pluralsight.com/training/Courses/TableOfContents/aspnet-webforms45-new-features"&gt;New Features in ASP.NET 4.5&lt;/a&gt;. There's a lot of great stuff in this release!&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://pluralsight.com/training/Courses/TableOfContents/aspnet-webforms45-new-features" target="_blank"&gt;&lt;img style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; padding-right: 0px" border="0" src="http://weblogs.asp.net/blogs/dwahlin/image_7668CFF2.png" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=10085280" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dwahlin/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/ASP.NET+MVC/default.aspx">ASP.NET MVC</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/Databinding/default.aspx">Databinding</category></item><item><title>Getting Started Managing Client-Side Data with the Breeze JavaScript Library</title><link>http://weblogs.asp.net/dwahlin/archive/2013/03/27/getting-started-managing-client-side-data-with-the-breeze-javascript-library.aspx</link><pubDate>Wed, 27 Mar 2013 07:28:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:10057191</guid><dc:creator>dwahlin</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://weblogs.asp.net/dwahlin/rsscomments.aspx?PostID=10057191</wfw:commentRss><comments>http://weblogs.asp.net/dwahlin/archive/2013/03/27/getting-started-managing-client-side-data-with-the-breeze-javascript-library.aspx#comments</comments><description>&lt;p&gt;If you work with JavaScript a lot then you know that there’s no shortage of script libraries being released. New scripts come out on a daily basis providing UI functionality, data binding support, form validation, framework functionality and more. With all of the scripts in circulation it feels like nearly every aspect of client-side development has been covered. However, there’s one area that has seen precious few scripts – the area of client-side data management. &lt;/p&gt;  &lt;p&gt;If you need to query local caches of data, track dirty objects, send modified objects to the server as a batch or validate in-memory data, then you’ve probably been writing custom code or cobbling together various script libraries to solve the problem. Fortunately, a new script library named Breeze has been released that can help with these challenges and more.&lt;/p&gt;  &lt;p&gt;In this post I’ll provide an overview of how to get started using Breeze and discuss some of the data management features that it offers client-side developers. Let’s start by taking a quick look at some of the features that Breeze offers.    &lt;br /&gt;&lt;/p&gt;  &lt;h2&gt;Breeze Features&lt;/h2&gt;  &lt;p&gt;Breeze (&lt;a href="http://breezejs.com"&gt;http://breezejs.com&lt;/a&gt;) is a free open source library from IdeaBlade that aims to solve many of the data management challenges that developers face when building SPAs and other client-centric applications. Although it’s a relatively new library, it provides robust functionality out of the box such as client-side caching, change tracking, entity validation, a variety of data management features (support for custom metadata, import/export entities, entity ID strategies, support for multiple caches, etc.), rich entity query support (both local and remote) directly from JavaScript, and batch saves of entities to a server. &lt;/p&gt;  &lt;p&gt;In addition to these features, Breeze is designed to integrate with many of the popular libraries out there such as KnockoutJS, AngularJS, Backbone and more. If you’re already using KnockoutJS to handle client-side data binding then you can plug-in Breeze anywhere you’re currently retrieving, querying, or manipulating data and still keep all of the existing KnockoutJS functionality intact. The same can be said when using the other libraries mentioned. &lt;/p&gt;  &lt;p&gt;Breeze can also integrate with different back end server technologies and doesn’t force you to use a particular framework. Out of the box it provides support for ASP.NET Web API and Entity Framework so if you’re already using ASP.NET MVC 4 you can get started quickly. A different back end framework such as Node.js can also be used although you’d have to write the code to handle serving data to the client and processing data received from the client.&lt;/p&gt;  &lt;p&gt;Now that you’ve seen some of the general features that Breeze offers let’s take a look at how you can get started using it. Although I’ll use Visual Studio and NuGet in the examples that follow, any editor can be used.   &lt;br /&gt;&lt;/p&gt;  &lt;h2&gt;Getting Started with Breeze&lt;/h2&gt;  &lt;p&gt;One of the best ways to get started with Breeze is to load a sample application into an empty ASP.NET MVC 4 project using NuGet. To do that, right-click on the project References, select Manage NuGet Packages, and then click the Online option to the left of the dialog window. In the Search Online box type Breeze. Once the search results come back select the &lt;strong&gt;Breeze for ASP.NET MVC4 Web Api Client Sample &lt;/strong&gt;package and select Install. Here's an example of the NuGet dialog. The Breeze site also has a video walk-through of getting started with the NuGet package at &lt;a href="http://www.breezejs.com/documentation/start-NuGet"&gt;http://www.breezejs.com/documentation/start-NuGet&lt;/a&gt; if you're new to it.    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/dwahlin/image_49C7ED8C.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://weblogs.asp.net/blogs/dwahlin/image_thumb_74341EA9.png" width="725" height="441" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Once the NuGet package loads a readme.txt file is displayed in Visual Studio 2012 that walks through the application. To get started with it you can simply press F5 to run the sample. Once the application loads in the browser you'll see a screen similar to the one shown next:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/dwahlin/clip_image003_21490B78.png"&gt;&lt;img title="clip_image003" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image003" src="http://weblogs.asp.net/blogs/dwahlin/clip_image003_thumb_6EE537F8.png" width="470" height="370" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;You can edit tasks, mark tasks as done, and save changes. Anything you change gets pushed back to the server using the Breeze library and is handled by an ASP.NET Web API controller class (more on this later). Key server-side classes added into the project by the Breeze NuGet package include BreezeClientSampleConfig which handles default routing for the application, BreezeWebApiConfig which handles ASP.NET Web API routing, BreezeSampleController which acts as the ASP.NET Web Api controller and BreezeSampleShellController which handles serving up the initial view and HTML to the browser. &lt;/p&gt;  &lt;p&gt;Key client-side files added into the project include breeze.debug.js (the debug version of the Breeze script), breeze.js (the production version), logger.js and sampleViewModel.js. The sampleViewModel.js script relies on KnockoutJS to provide data binding capabilities. Here are the files that you'll see in the Solution Explorer:   &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/dwahlin/clip_image004_0774D549.png"&gt;&lt;img title="clip_image004" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="clip_image004" src="http://weblogs.asp.net/blogs/dwahlin/clip_image004_thumb_20047299.png" width="230" height="569" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Now that a Breeze project has been created let's take a closer look at some of the code that's used on the server-side.   &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;h2&gt;The Server-Side Code   &lt;br /&gt;&lt;/h2&gt;  &lt;p&gt;The BreezeSampleController class derives from the standard ApiController class and provides ASP.NET Web Api controller support for sending data to and from a client. It includes a Breeze-specific class named EFContextProvider&amp;lt;T&amp;gt; that wraps a custom Entity Framework Code First DbContext class named BreezeSampleContext. The code for the BreezeSampleController and BreezeSampleContext classes are shown in Listings 1 and 2 respectively. It's important to note that although the sample application relies on specific Breeze server-side objects such as EFContextProvider&amp;lt;T&amp;gt;, Breeze is designed to work with a variety of server-side frameworks.&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;    &lt;pre class="csharpcode"&gt;[BreezeController]
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; BreezeSampleController : ApiController {

    &lt;span class="kwrd"&gt;readonly&lt;/span&gt; EFContextProvider&amp;lt;BreezeSampleContext&amp;gt; _contextProvider =
        &lt;span class="kwrd"&gt;new&lt;/span&gt; EFContextProvider&amp;lt;BreezeSampleContext&amp;gt;();

    [HttpGet]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Metadata() {
        &lt;span class="kwrd"&gt;return&lt;/span&gt; _contextProvider.Metadata();
    }
        
    [HttpPost]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; SaveResult SaveChanges(JObject saveBundle) {
        &lt;span class="kwrd"&gt;return&lt;/span&gt; _contextProvider.SaveChanges(saveBundle);
    }
        
    [HttpGet]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; IQueryable&amp;lt;BreezeSampleTodoItem&amp;gt; Todos() {
        &lt;span class="kwrd"&gt;return&lt;/span&gt; _contextProvider.Context.Todos;
    }

}&lt;/pre&gt;
  &lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Listing 1&lt;/b&gt;. The BreezeSampleController class that acts as the ASP.NET Web API controller for the sample application. &lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; BreezeSampleContext : DbContext 
{
    &lt;span class="rem"&gt;// DEVELOPMENT ONLY: initialize the database&lt;/span&gt;
    &lt;span class="kwrd"&gt;static&lt;/span&gt; BreezeSampleContext()
    {
        Database.SetInitializer(&lt;span class="kwrd"&gt;new&lt;/span&gt; BreezeSampleDatabaseInitializer());
    }    
    &lt;span class="kwrd"&gt;public&lt;/span&gt; DbSet&amp;lt;BreezeSampleTodoItem&amp;gt; Todos { get; set; }
}&lt;/pre&gt;

&lt;p&gt;&lt;b&gt;Listing 2&lt;/b&gt;. The BreezeSampleContext handles dynamically initializing the database and defines a Todos property used by the application to display Todo data.

  &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;
  &lt;br /&gt;Looking at the code in Listing 1 you can see that a readonly field named _contextProvider of type EFContextProvider&amp;lt;BreezeSampleContext&amp;gt; is defined in the controller class. Because the service relies on Entity Framework for data access, this ContextProvider wraps an instance of an Entity Framework (EF) context. It extracts metadata from the EF model that the client needs and translates client save requests into EF save operations after applying server-side business logic to authorize and validate those changes. It also exposes the DbContext’s Todos property, an IQueryable that can be filtered, sorted, and paged before returning BreezeSampleTodoItem objects (see Listing 3) to the client.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; BreezeSampleTodoItem
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Id { get; set; }             &lt;span class="rem"&gt;// 42&lt;/span&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Description { get; set; } &lt;span class="rem"&gt;// &amp;quot;Try Breeze&amp;quot;&lt;/span&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; IsDone { get; set; }        &lt;span class="rem"&gt;// false&lt;/span&gt;
}&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&lt;b&gt;Listing 3&lt;/b&gt;. The BreezeSampleTodoItem class.

  &lt;br /&gt;

  &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;To see the metadata returned by the Metadata() action found in BreezeSampleController you can open your browser and navigate to the following path (note that you'll have to change the port to match the port assigned to your application):&lt;/p&gt;

&lt;p&gt;http://localhost:55143/api/BreezeSample/metadata
  &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;The metadata describes important aspects of the model that is used by the client-side portion of Breeze such as the entity types, each type’s property names, their data types, key properties, and the relationships among entities.&lt;del datetime="2012-12-20T10:59" cite="mailto:Dan%20Wahlin"&gt;
    &lt;br /&gt;&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;Now that you've seen the Web API controller class let's switch gears and look at the client-side code that interacts with the Web Api controller and see how Breeze fits into the overall picture.
  &lt;br /&gt;

  &lt;br /&gt;&lt;/p&gt;

&lt;h2&gt;The Client-Side Code&lt;/h2&gt;





&lt;p&gt;The Breeze sample application contains a script in the Scripts/app folder named sampleViewModel.js that contains the main client-side Breeze functionality. It handles retrieving metadata and Todo objects from the server and then binds the Todo objects into the page using KnockoutJS. As changes are made it uses Breeze to batch up changes and then send them back to the server for processing. Keep in mind that in a more complex application the view model may call out to a separate BreezeJS JavaScript object that focuses specifically on data functionality. That helps promote re-use in situations where multiple view models need to access and manipulate data through Breeze.
  &lt;br /&gt;

  &lt;br /&gt;The sampleViewModel.js script starts by creating a new Breeze EntityManager object that targets the Web Api controller discussed earlier. The KnockoutJS view model relies on the entity manager for queries and saves&amp;#160; (see Listing 4).&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;// service name is route to the Web API controller&lt;/span&gt;
&lt;span class="kwrd"&gt;var&lt;/span&gt; serviceName = &lt;span class="str"&gt;'api/BreezeSample'&lt;/span&gt;;

&lt;span class="rem"&gt;// manager is the service gateway and cache holder&lt;/span&gt;
&lt;span class="kwrd"&gt;var&lt;/span&gt; manager = &lt;span class="kwrd"&gt;new&lt;/span&gt; breeze.EntityManager(serviceName);

&lt;span class="rem"&gt;// define the viewmodel&lt;/span&gt;
&lt;span class="kwrd"&gt;var&lt;/span&gt; vm = {
    todos: ko.observableArray(),
    includeDone: ko.observable(&lt;span class="kwrd"&gt;false&lt;/span&gt;),
    save: saveChanges,
    show: ko.observable(&lt;span class="kwrd"&gt;false&lt;/span&gt;)
};

&lt;span class="rem"&gt;// start fetching Todos&lt;/span&gt;
getTodos();

&lt;span class="rem"&gt;// re-query when &amp;quot;includeDone&amp;quot; checkbox changes&lt;/span&gt;
vm.includeDone.subscribe(getTodos);

&lt;span class="rem"&gt;// bind view to the viewmodel&lt;/span&gt;
ko.applyBindings(vm);&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;
    &lt;br /&gt;Listing 4&lt;/strong&gt;. Creating an EntityManager to handle interacting with the server.&lt;/p&gt;

&lt;p&gt;
  &lt;br /&gt;

  &lt;br /&gt;All data interaction goes through the EntityManager object including queries to the server, sending saved batches of data to the server and more. To query data from the server an EntityQuery object must be created and then executed by the EntityManager. Listing 5 shows an example of creating an EntityQuery object, executing the query and handling the results. 

  &lt;br /&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;// get Todos asynchronously&lt;/span&gt;
&lt;span class="rem"&gt;// returning a promise to wait for     &lt;/span&gt;
&lt;span class="kwrd"&gt;function&lt;/span&gt; getTodos() {

    logger.info(&lt;span class="str"&gt;&amp;quot;querying Todos&amp;quot;&lt;/span&gt;);

    &lt;span class="kwrd"&gt;var&lt;/span&gt; query = breeze.EntityQuery.from(&lt;span class="str"&gt;&amp;quot;Todos&amp;quot;&lt;/span&gt;);

    &lt;span class="kwrd"&gt;if&lt;/span&gt; (!vm.includeDone()) {
        query = query.where(&lt;span class="str"&gt;&amp;quot;IsDone&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;==&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;false&lt;/span&gt;);
    }

    &lt;span class="kwrd"&gt;return&lt;/span&gt; manager
        .executeQuery(query)
        .then(querySucceeded)
        .fail(queryFailed);

    &lt;span class="rem"&gt;// reload vm.todos with the results &lt;/span&gt;
    &lt;span class="kwrd"&gt;function&lt;/span&gt; querySucceeded(data) {
        logger.success(&lt;span class="str"&gt;&amp;quot;queried Todos&amp;quot;&lt;/span&gt;);
        vm.todos(data.results);
        vm.show(&lt;span class="kwrd"&gt;true&lt;/span&gt;); &lt;span class="rem"&gt;// show the view&lt;/span&gt;
    }
};&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Listing 5&lt;/strong&gt;. Executing a query against the ASP.NET Web API controller using the Breeze EntityManager and EntityQuery objects.

  &lt;br /&gt;

  &lt;br /&gt;

  &lt;br /&gt;The code starts by identifying which method to query on the server-side controller (Todos in this example), creates a dynamic query, and then executes it. If the view model's includeDone property is false then a dynamic WHERE clause is added that will be sent to the server when querying Todo objects. The ability to write client-side queries that ultimately make their way to the server is a unique feature of Breeze and something I've personally wanted for quite a while for client-side application development. More complex queries can be written as well using the EntityQuery object combined with a Predicate object as shown in Listing 6 (see &lt;a href="http://www.breezejs.com/documentation/query-examples#Composite"&gt;http://www.breezejs.com/documentation/query-examples#Composite&lt;/a&gt; Where clauses for additional examples). 

  &lt;br /&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;// Start with a base query for all Todos &lt;/span&gt;
&lt;span class="kwrd"&gt;var&lt;/span&gt; query = breeze.EntityQuery.from(&lt;span class="str"&gt;&amp;quot;Todos&amp;quot;&lt;/span&gt;); 

&lt;span class="rem"&gt;// A Predicate is a condition that is true or false&lt;/span&gt;
&lt;span class="rem"&gt;// Combine two predicates with &amp;quot;.and&amp;quot; to&lt;/span&gt;
&lt;span class="rem"&gt;// query for Todos that are done and&lt;/span&gt;
&lt;span class="rem"&gt;// the description contains the letter 's'&lt;/span&gt;
&lt;span class="kwrd"&gt;var&lt;/span&gt; p1 = &lt;span class="kwrd"&gt;new&lt;/span&gt; breeze.Predicate(&lt;span class="str"&gt;&amp;quot;IsDone&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;eq&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;true&lt;/span&gt;);
&lt;span class="kwrd"&gt;var&lt;/span&gt; p2 = &lt;span class="kwrd"&gt;new&lt;/span&gt; breeze.Predicate(&lt;span class="str"&gt;&amp;quot;Description&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;contains&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;s&amp;quot;&lt;/span&gt;);
query = query.where(p1.and(p2));

&lt;span class="kwrd"&gt;return&lt;/span&gt; manager.executeQuery(query);&lt;/pre&gt;

&lt;p&gt;
  &lt;br /&gt;&lt;strong&gt;Listing 6&lt;/strong&gt;. Creating queries using the EntityQuery and Predicate objects. The queries can be used to query client-side or server-side objects.

  &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;
  &lt;br /&gt;In addition to querying objects on the server, the EntityManager can also save changes made on the client back to the server. When the user clicks the “save” link, the view model calls the EntityManager’s saveChanges() function. The EntityManager batches up all pending changes and sends them back to the controller for processing. Listing 7 shows how the EntityManager's saveChanges() function can be invoked and used to detect success or failure using promises.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; saveChanges() {
    &lt;span class="kwrd"&gt;return&lt;/span&gt; manager.saveChanges()
        .then(&lt;span class="kwrd"&gt;function&lt;/span&gt; () { logger.success(&lt;span class="str"&gt;&amp;quot;changes saved&amp;quot;&lt;/span&gt;); })
        .fail(saveFailed);
}

&lt;span class="kwrd"&gt;function&lt;/span&gt; saveFailed(error) {
    logger.error(&lt;span class="str"&gt;&amp;quot;Save failed: &amp;quot;&lt;/span&gt; + error.message);
}&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Listing 7&lt;/strong&gt;. Using Breeze's EntityManager to save changes made on the client back to the server.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Breeze fills a huge hole in client-side development through its data management capabilities. By providing query capabilities, batch save functionality, and the ability to perform a variety of other features it greatly simplifies the process of building CRUD-style (create, read, update, delete) applications and allows developers to focus on application logic as opposed to data plumbing code. Find out more information about Breeze by visiting the website at &lt;a href="http://www.breezejs.com"&gt;http://www.breezejs.com&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=10057191" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dwahlin/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/ASP.NET+MVC/default.aspx">ASP.NET MVC</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/HTML5/default.aspx">HTML5</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/SPA/default.aspx">SPA</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/ASP.NET+Web+API/default.aspx">ASP.NET Web API</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/Breeze/default.aspx">Breeze</category></item><item><title>ASP.NET 4.5 Web Forms Features - Strongly-Typed Data Controls</title><link>http://weblogs.asp.net/dwahlin/archive/2013/03/26/asp-net-4-5-web-forms-features-strongly-typed-data-controls.aspx</link><pubDate>Wed, 27 Mar 2013 05:37:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:10056912</guid><dc:creator>dwahlin</dc:creator><slash:comments>8</slash:comments><wfw:commentRss>http://weblogs.asp.net/dwahlin/rsscomments.aspx?PostID=10056912</wfw:commentRss><comments>http://weblogs.asp.net/dwahlin/archive/2013/03/26/asp-net-4-5-web-forms-features-strongly-typed-data-controls.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://pluralsight.com/training/Courses/TableOfContents/aspnet-webforms45-new-features" target="_blank"&gt;&lt;img style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; padding-right: 0px" border="0" src="http://weblogs.asp.net/blogs/dwahlin/image_7668CFF2.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;I've been spending a lot of time over the past few months digging into the new features offered by ASP.NET 4.5 Web Forms while creating &lt;a href="http://pluralsight.com/training/Courses/TableOfContents/aspnet-webforms45-new-features" target="_blank"&gt;my new Pluralsight course&lt;/a&gt; and have been pleasantly surprised by all of the great stuff in this release. Web Forms isn't exactly the cool kid on the block any more given all of the attention that ASP.NET MVC, jQuery, SPA and other technologies get, but there are still a ton of Web Forms developers out there using it productively every day to build robust, enterprise-scale applications. Microsoft has really stepped up their game with version 4.5 of the framework and added some features that will truly change how you write your applications. I'll be blogging about a few of the features related to data over the next month.&lt;/p&gt;  &lt;p&gt;In addition to Visual Studio 2012 enhancements to the HTML/CSS/JavaScript editors, enhanced HTML5 support, oAuth and anti-XSRF support, integration with Web Sockets and SignalR, the ability to use the ASP.NET Web API, FriendlyUrls, plus more much more, some of the most impressive features are focused on working with data. Here's a quick summary of what's new when it comes to data-specific features:   &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/dwahlin/image_341B9424.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://weblogs.asp.net/blogs/dwahlin/image_thumb_576888C9.png" width="412" height="261" /&gt;&lt;/a&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;In this post I'll discuss strongly-typed data controls and the benefits they offer as well as how HTML-encoded data bindings can be defined.   &lt;br /&gt;&lt;/p&gt;  &lt;h1&gt;Getting Started with Strongly-Typed Data Controls   &lt;br /&gt;&lt;/h1&gt;  &lt;p&gt;If you build data-driven Web applications with ASP.NET Web Forms then you've learned to live with &amp;lt;%# Eval(&amp;quot;FieldName&amp;quot;) %&amp;gt; statements (although if you're like me you've never had much love for them) when binding data. No longer! With ASP.NET 4.5 you can now leverage strongly-typed data controls, catch errors and typos upfront, and write more maintainable code. Here's a typical data control ItemTemplate prior to ASP.NET 4.5:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ItemTemplate&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Button&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;EditButton&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Edit&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;CommandName&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Edit&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Label&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;OrderID&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;='&amp;lt;%# Eval(&amp;quot;SalesOrderID&amp;quot;) %&amp;gt;'&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Label&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;OrderDate&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;='&amp;lt;%# Eval(&amp;quot;OrderDate&amp;quot;, &amp;quot;{0:d}&amp;quot;) %&amp;gt;'&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Label&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;DueDate&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;='&amp;lt;%# Eval(&amp;quot;DueDate&amp;quot;, &amp;quot;{0:d}&amp;quot;) %&amp;gt;'&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Label&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ShipDate&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;='&amp;lt;%# Eval(&amp;quot;ShipDate&amp;quot;, &amp;quot;{0:d}&amp;quot;) %&amp;gt;'&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Label&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;SubTotal&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;='&amp;lt;%# Eval(&amp;quot;SubTotal&amp;quot;,&amp;quot;{0:C}&amp;quot;) %&amp;gt;'&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ItemTemplate&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
  &lt;br /&gt;Data controls like GridView, ListView and others now provide a new property named &lt;strong&gt;ItemType&lt;/strong&gt; that allows you to define the type of the object being bound to the control. Here's an example of using ItemType to specify that a SalesOrderHeader object will be bound into a ListView control:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:ListView&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;OrdersListView&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; 
    &lt;span class="attr"&gt;ItemType&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;StronglyTypedControls.Data.SalesOrderHeader&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;|

    ...

&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:ListView&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;



&lt;p&gt;
  &lt;br /&gt;Once the type of item being bound is defined you can stop using &amp;lt;%# &lt;strong&gt;Eval(&amp;quot;FieldName&amp;quot;)&lt;/strong&gt; %&amp;gt; (scream hallelujah!) and leverage strongly-typed binding instead. Here's an example of how the ItemTemplate shown earlier changes when the ItemType is set on the ListView control:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ItemTemplate&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Button&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;EditButton&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Edit&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;CommandName&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Edit&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Label&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;OrderID&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;='&amp;lt;%#: Item.SalesOrderID %&amp;gt;'&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Label&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;OrderDate&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;='&amp;lt;%#: Item.OrderDate.ToString(&amp;quot;d&amp;quot;) %&amp;gt;'&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Label&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;DueDate&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;='&amp;lt;%#: Item.DueDate.ToString(&amp;quot;d&amp;quot;) %&amp;gt;'&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Label&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ShipDate&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;='&amp;lt;%#: (Item.ShipDate.HasValue) ? Item.ShipDate.Value.ToString(&amp;quot;d&amp;quot;) : &amp;quot;&amp;quot; %&amp;gt;'&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Label&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;SubTotal&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;='&amp;lt;%#: Item.SubTotal.ToString(&amp;quot;C&amp;quot;) %&amp;gt;'&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ItemTemplate&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;br /&gt;

&lt;p&gt;Note that you can now use the &lt;strong&gt;Item&lt;/strong&gt; keyword to access properties of the object defined in ItemType. In this case the SalesOrderID, OrderDate, DueDate, ShipDate and SubTotal properties are bound. As you type &lt;strong&gt;Item&lt;/strong&gt; followed by a period in the editor you'll actually get intellisense against the object being bound (scream hallelujah again!) as shown next:

  &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/dwahlin/image_5D432C62.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://weblogs.asp.net/blogs/dwahlin/image_thumb_55B7BCF5.png" width="500" height="169" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
  &lt;br /&gt;This not only helps prevent typos, but if you do mess something up accidentally you'll be able to catch the error upfront in Visual Studio - super cool and much better than having to define quoted values as with Eval(&amp;quot;FieldName&amp;quot;)!&lt;/p&gt;

&lt;p&gt;Did you notice the colon character used above in the binding expressions: &lt;strong&gt;&amp;lt;%#:&amp;#160;&amp;#160; %&amp;gt;&lt;/strong&gt;? By adding the colon the data being bound is automatically HTML-encoded. It's a nice feature that was brought over from ASP.NET MVC and is recommend any time you're writing data out to a page. By using the colon you'll prevent people from being able to slip &amp;lt;script&amp;gt; tags and other potentially bad stuff into forms which is good from a security standpoint. &lt;/p&gt;

&lt;p&gt;In cases where you need two-way bindings to be defined such as in an EditItemTemplate, the old &amp;lt;%# Bind(&amp;quot;FieldName&amp;quot;) %&amp;gt; expression can be replaced with it's strongly-typed cousin named &lt;strong&gt;BindItem&lt;/strong&gt; as shown next:&lt;/p&gt;

&lt;p&gt;
  &lt;br /&gt;

  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;EditItemTemplate&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Button&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;CancelButton&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Cancel&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;CommandName&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Cancel&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Button&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;UpdateButton&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Update&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;CommandName&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Update&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Label&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;OrderID&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;='&amp;lt;%#: Item.SalesOrderID %&amp;gt;'&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:TextBox&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;OrderDate&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;='&amp;lt;%# BindItem.OrderDate %&amp;gt;'&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:TextBox&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;DueDate&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;='&amp;lt;%# BindItem.DueDate %&amp;gt;'&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:TextBox&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ShipDate&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;='&amp;lt;%# BindItem.ShipDate %&amp;gt;'&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:TextBox&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;SubTotal&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;='&amp;lt;%# BindItem.SubTotal %&amp;gt;'&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;EditItemTemplate&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;br /&gt;Both Item and BindItem are a huge step forward for data binding and if you're already on ASP.NET 4.5 they're definitely a great feature that you can take advantage of right away. If you're interested in an example of strongly-typed data controls in action &lt;a href="https://dl.dropbox.com/u/6037348/ASPNET4.5/StronglyTypedControls.zip" target="_blank"&gt;download a demonstration project here&lt;/a&gt; (ASP.NET 4.5 and Visual Studio 2012 are required).&lt;/p&gt;

&lt;p&gt;In my next post on ASP.NET 4.5 Web Forms features I'll discuss model binding - my favorite new feature in the framework. In the meantime, if you'd like to learn more about the new features in the 4.5 release check out my Pluralsight course titled &lt;a href="http://pluralsight.com/training/Courses/TableOfContents/aspnet-webforms45-new-features" target="_blank"&gt;New Features in ASP.NET 4.5&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://pluralsight.com/training/Courses/TableOfContents/aspnet-webforms45-new-features" target="_blank"&gt;&lt;img style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; padding-right: 0px" border="0" src="http://weblogs.asp.net/blogs/dwahlin/image_7668CFF2.png" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=10056912" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dwahlin/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/Databinding/default.aspx">Databinding</category></item><item><title>New Features in ASP.NET 4.5 Web Forms Course Released on Pluralsight.com</title><link>http://weblogs.asp.net/dwahlin/archive/2013/03/24/new-features-in-asp-net-4-5-web-forms-course-released-on-pluralsight-com.aspx</link><pubDate>Mon, 25 Mar 2013 06:36:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:10047282</guid><dc:creator>dwahlin</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://weblogs.asp.net/dwahlin/rsscomments.aspx?PostID=10047282</wfw:commentRss><comments>http://weblogs.asp.net/dwahlin/archive/2013/03/24/new-features-in-asp-net-4-5-web-forms-course-released-on-pluralsight-com.aspx#comments</comments><description>&lt;p&gt;I've been hard at work the past few months filming a new course for Pluralsight covering some of the great new features in ASP.NET 4.5 Web Forms. I'm excited to announce that the new course is titled &lt;a href="http://pluralsight.com/training/Courses/TableOfContents/aspnet-webforms45-new-features" target="_blank"&gt;New Features in ASP.NET 4.5 Web Forms&lt;/a&gt; and is now available on &lt;a href="http://www.pluralsight.com" target="_blank"&gt;Pluralsight.com&lt;/a&gt;! If you're an ASP.NET Web Forms developer (and there are many of you out there!) then you should definitely take a look at the new features available in the 4.5 release if you haven't already. In my opinion, this is the most significant release since ASP.NET 2.0. I say that because some of the new features will truly change how you write your ASP.NET applications - especially the data binding features.&lt;/p&gt;  &lt;p&gt;Here's the official description of the course and the content that's covered. I hope you enjoy it and are able to apply some of the new features in your applications! If you're not a Pluralsight subscriber and still want to view some of the course check out their &lt;a href="https://pluralsight.com/training/Subscribe/Step1?isTrial=True" target="_blank"&gt;free trial offer&lt;/a&gt;.    &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://pluralsight.com/training/Courses/TableOfContents/aspnet-webforms45-new-features" target="_blank"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://weblogs.asp.net/blogs/dwahlin/image_7668CFF2.png" width="788" height="92" /&gt;&lt;/a&gt;     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;The New Features in ASP.NET 4.5 Web Forms course provides a tour of what's new in Visual Studio 2012 for ASP.NET Web Forms developers and how it can make you more productive as a developer. The course begins by showing you key enhancements to Visual Studio's HTML editor and its improved support for working with CSS and JavaScript. Next, you’ll explore what's new with data binding (some significant features have been added here!) including model binding and strongly typed data controls. You’ll also see enhancements that have been made to the ASP.NET framework such as bundling and minification of JavaScript and CSS, asynchronous modules and handlers, SignalR and more. Several new HTML5 features are also demonstrated including new HTML5 input types, Web Sockets and support for multiple file uploads. The course concludes with a look at important security-related improvements in ASP.NET including support for oAuth, request validation and support for preventing cross-site request forgery (XSRF) attacks. &lt;/p&gt;  &lt;h3&gt;Course Content&lt;/h3&gt;  &lt;table class="linkContainer" width="492"&gt;&lt;thead&gt;&lt;/thead&gt;&lt;tbody&gt;     &lt;tr class="module"&gt;       &lt;td class="title tocModule" style="padding-left: 0px"&gt;         &lt;div class="playButton"&gt;&lt;strong&gt;&amp;#160;&lt;span style="margin-left: 10px"&gt;Visual Studio Features&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Course Overview&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Introduction &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;HTML Editor Features&lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;Demo: HTML Editor Features&lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;JavaScript Editor Features&lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;Demo: JavaScript Editor Features&lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;CSS Editor Features&lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;Demo: CSS Editor Features&lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;The Page Inspector&lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;Demo: The Page Inspector&lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;Using Web Essentials&lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;Demo: Using Web Essentials&lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;Summary&lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;&amp;nbsp;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr id="typescript-m2" class="module"&gt;       &lt;td class="title tocModule" style="padding-left: 0px"&gt;         &lt;div class="playButton"&gt;&amp;#160;&lt;span style="margin-left: 10px"&gt;&lt;strong&gt;Working with Data&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Introduction&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Strongly Typed Data Controls&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Demo: Strongly Typed Data Controls&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Model Binding&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Model Binding Attributes&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;Demo: Model Binding&lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;HTML Encoded Data Binding Expressions&lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;Unobtrusive Validation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;Summary&lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;&amp;nbsp;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr id="typescript-m3" class="module"&gt;       &lt;td class="title tocModule" style="padding-left: 0px"&gt;         &lt;div class="playButton"&gt;&amp;#160;&lt;span style="margin-left: 10px"&gt;&lt;strong&gt;Framework Features&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Introduction &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Bundling and Minification&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Demo: Bundling and Minification&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Async Support&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Demo: Creating Asynchronous HttpModules&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Demo: Creating Asynchronous HttpHandlers&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;FriendlyUrls&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Demo: Implementing FriendlyUrls&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;ASP.NET Web API&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Demo: Using the ASP.NET WebAPI&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Demo: Using HTTP Verbs&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;SignalR&lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;Demo: Using SignalR&lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Summary &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;&amp;nbsp;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="module"&gt;       &lt;td class="title tocModule" style="padding-left: 0px"&gt;         &lt;div class="playButton"&gt;&amp;#160;&lt;strong&gt;&lt;span style="margin-left: 10px"&gt;HTML5 Features&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Introduction&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;TextMode Property Enhancements&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Demo: TextBox HTML5 Enhancements&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Multiple File Uploads&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Demo: Uploading Multiple Files with FileUpload &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;WebSockets&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Demo: WebSockets with System.Web.WebSockets&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Demo: WebSockets with Microsoft.Web.WebSockets&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Additional HTML5 Features&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Demo: Unobtrusive Validation and Validator Controls&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;Summary&lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;&amp;nbsp;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="module"&gt;       &lt;td class="title tocModule" style="padding-left: 0px"&gt;         &lt;div class="playButton"&gt;&amp;#160;&lt;strong&gt;&lt;span style="margin-left: 10px"&gt;oAuth and Security Features&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Introduction&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;oAuth Support&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Demo: oAuth Facebook Integration&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Demo: Enhancing Facebook Integration&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;Deferred Request Validation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;Demo: Using Deferred Request Validation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;Unvalidated Requests and AntiXSS Encoding&lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;Demo: Handling Unvalidated Requests and Encoding with the AntiXssEncoder&lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;Anti-XSRF Validation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;Demo: Anti-XSRF Validation Code&lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;Summary&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=10047282" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dwahlin/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/jQuery/default.aspx">jQuery</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/HTML5/default.aspx">HTML5</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/CSS/default.aspx">CSS</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/Pluralsight/default.aspx">Pluralsight</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/Ajax/default.aspx">Ajax</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/Databinding/default.aspx">Databinding</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/ASP.NET+Web+API/default.aspx">ASP.NET Web API</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/Websockets/default.aspx">Websockets</category></item><item><title>Windows Azure Boot Camp Coming to Phoenix on April 27th!</title><link>http://weblogs.asp.net/dwahlin/archive/2013/03/24/windows-azure-boot-camp-coming-to-phoenix-on-april-27th.aspx</link><pubDate>Mon, 25 Mar 2013 03:35:56 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:10046563</guid><dc:creator>dwahlin</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://weblogs.asp.net/dwahlin/rsscomments.aspx?PostID=10046563</wfw:commentRss><comments>http://weblogs.asp.net/dwahlin/archive/2013/03/24/windows-azure-boot-camp-coming-to-phoenix-on-april-27th.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://globalwindowsazure.azurewebsites.net/"&gt;&lt;img style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px" border="0" alt="bootcamp" align="right" src="http://globalwindowsazure.azurewebsites.net/wp-content/uploads/2013/01/bootcamp_thumb.png" /&gt;&lt;/a&gt;The Global Windows Azure Boot Camp is coming to Phoenix on &lt;strong&gt;April 27th, 2013&lt;/strong&gt;! Registration is now open at &lt;a href="https://phxglobalazurebootcamp.eventday.com"&gt;https://phxglobalazurebootcamp.eventday.com&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;This is a &lt;a href="http://globalwindowsazure.azurewebsites.net/?page_id=151"&gt;truly global event&lt;/a&gt; in which the Phoenix community will come together to share and learn what you can do on Windows Azure. &lt;/p&gt;  &lt;p&gt;This &lt;strong&gt;one day deep dive class&lt;/strong&gt; will get you up to speed on developing for and deploying to Windows Azure. The class will be led by Microsoft MVP &lt;a href="https://twitter.com/rickggaribay" target="_blank"&gt;Rick Garibay&lt;/a&gt; along with myself, &lt;a href="http://twitter.com/jguadagno"&gt;Joe Guadagno&lt;/a&gt; and &lt;a href="http://twitter.com/scottcate"&gt;Scott Cate&lt;/a&gt;. You’re guaranteed to learn a ton and in addition to the talks, you’ll work on some great hands on labs so you can apply what you learn on the same day and take the labs with you!     &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;h2&gt;Agenda&lt;/h2&gt;  &lt;p&gt;We will start at 9:00 with welcome and introductions and get right into an end-to-end overview of Windows Azure. From there, we’ll participate in a massive, coordinated, global deployment to Windows Azure, teaming with over 60 other worldwide locations to see the workload in action (details are super secret, so you have to show up to get your security clearance- this a a boot camp after all)! &lt;/p&gt;  &lt;p&gt;After we’ve done our best to take down a datacenter, we’ll take a break and take a lap around storage and database options on Windows Azure while we enjoy a catered lunch kindly sponsored by Microsoft. We’ll also have fresh primo coffee, sodas (or water if you prefer) and snacks to help you power through the labs which will give you real-world exposure to what its like to actually apply what you’ve learned and take the &lt;strong&gt;working&lt;/strong&gt; applications home with you. &lt;/p&gt;  &lt;p&gt;From there we’ll take another break and wrap up the day with a look at how Windows Azure Service Bus changes how you think about messaging and integration when working at cloud scale. We’ll have a Service Bus lab and from there likely plan some nefarious after event activities at one of downtown Chandler’s fine watering holes. &lt;/p&gt;  &lt;p&gt;Here are the details:    &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;   &lt;table cellspacing="0" cellpadding="0" width="668" border="0"&gt;&lt;tbody&gt;       &lt;tr style="background-color: #efefef"&gt;         &lt;td valign="top" width="480"&gt;           &lt;p align="left"&gt;&lt;b&gt;Activity&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="186"&gt;           &lt;p align="left"&gt;&lt;b&gt;Time&lt;/b&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="480"&gt;           &lt;p&gt;Welcome and Introductions &lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="186"&gt;           &lt;p&gt;9:00 – 9:15&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="480"&gt;           &lt;p&gt;Windows Azure Overview &lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="186"&gt;           &lt;p&gt;9:15 – 10:30&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="480"&gt;           &lt;p&gt;Deploy to the cloud! &lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="186"&gt;           &lt;p&gt;10:30 – 11:15&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="480"&gt;           &lt;p&gt;Break&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="186"&gt;           &lt;p&gt;11:15 – 11:30&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="480"&gt;           &lt;p&gt;Windows Azure Storage and Database &lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="186"&gt;           &lt;p&gt;11:30 – 1:00 &lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="480"&gt;           &lt;p&gt;Hands On labs&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="186"&gt;           &lt;p&gt;1:00 – 2:00 &lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="480"&gt;           &lt;p&gt;Break &lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="186"&gt;           &lt;p&gt;2:00 - 2:15&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="480"&gt;           &lt;p&gt;Windows Azure Service Bus&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="186"&gt;           &lt;p&gt;2:15 – 3:45 &lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="480"&gt;           &lt;p&gt;Wrap Up&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="top" width="186"&gt;           &lt;p&gt;3:45 – 5:00&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160; &lt;/p&gt;  &lt;h2&gt;How much does the boot camp cost?&lt;/h2&gt;  &lt;p&gt;This event is FREE to the attendees. We’ll certainly take any good karma you want to send our way, but your attendance and full engagement is all we ask. Be sure to check out the &lt;a href="http://globalwindowsazure.azurewebsites.net/?page_id=171"&gt;prerequisites&lt;/a&gt; to ensure you are ready to rock. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Do I need to bring anything?&lt;/h2&gt;  &lt;p&gt;This is a BYOL (Bring Your Own Laptop) event. To get the most of the event, you will want to come to the boot camp with your own laptop pre-loaded with Visual Studio, the Azure SDK and all &lt;a href="http://globalwindowsazure.azurewebsites.net/?page_id=171"&gt;prerequisites&lt;/a&gt;. Please see &lt;a href="http://globalwindowsazure.azurewebsites.net/?page_id=171"&gt;http://globalwindowsazure.azurewebsites.net/?page_id=171&lt;/a&gt; to download and install everything you’ll need to make this a great event. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;I'm completely new to this Azure cloud thing!&lt;/h2&gt;  &lt;p&gt;This event is for you! We’ll have a mix of content both for experienced developers and those brand spanking new to Windows Azure. Our trainers will be here to answer all of your questions and help you with the labs, so remember, there are no stupid questions. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;I already know this stuff!&lt;/h2&gt;  &lt;p&gt;Awesome! We’d love to have you share your knowledge with other attendees as you interact with them throughout the event and we guarantee you’ll walk away learning a few things too! &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Where's it at?&lt;/h2&gt;  &lt;p&gt;The boot camp will be held at Gangplank in Chandler, located at &lt;a href="https://maps.google.com/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=260+South+Arizona+Avenue+|+CHANDLER,+AZ+85225&amp;amp;aq=&amp;amp;sll=33.299753,-111.841671&amp;amp;sspn=0.007667,0.016512&amp;amp;vpsrc=0&amp;amp;t=h&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=260+S+Arizona+Ave,+Chandler,+Maricopa,+Arizona+85225&amp;amp;z=17&amp;amp;iwloc=A" target="_blank"&gt;260 South Arizona Avenue | CHANDLER, AZ 85225&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;What's next?&lt;/h2&gt;  &lt;p&gt;Seating is limited for this event so please register now at &lt;a href="https://phxglobalazurebootcamp.eventday.com/"&gt;https://phxglobalazurebootcamp.eventday.com/&lt;/a&gt; to guarantee your seat and help us plan for coffee, drinks, snacks and lunch. &lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=10046563" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dwahlin/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/Azure/default.aspx">Azure</category></item><item><title>Talking versus Teaching–There’s a Big Difference</title><link>http://weblogs.asp.net/dwahlin/archive/2013/02/22/talking-versus-teaching-there-s-a-big-difference.aspx</link><pubDate>Fri, 22 Feb 2013 19:48:50 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:9902057</guid><dc:creator>dwahlin</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://weblogs.asp.net/dwahlin/rsscomments.aspx?PostID=9902057</wfw:commentRss><comments>http://weblogs.asp.net/dwahlin/archive/2013/02/22/talking-versus-teaching-there-s-a-big-difference.aspx#comments</comments><description>&lt;p&gt;&lt;img style="float: right; margin: 0px 20px 15px 0px; display: inline" align="right" src="http://krische.cm.utexas.edu/research/krische/Courses_files/_Lecture-Hall_9402.jpg" width="401" height="262" /&gt;I’m at the &lt;a href="http://www.pluralsight.com" target="_blank"&gt;Pluralsight&lt;/a&gt; Author Summit this weekend outside of Salt Lake City and excited about the opportunity to interact with some of the top people in the technology industry, share ideas with them and learn new things myself. Teaching has been something I’ve been involved with for nearly 15 years now through my own company as well as several others and it’s something that I really enjoy doing. I’ve had the opportunity to teach developers in some of the largest companies around the world as well as developers just starting out. Regardless of their experience level it’s always fun watching as they get excited about learning a given technology or concept. You can literally see their faces change as the “light bulb” moment happens.&lt;/p&gt;  &lt;p&gt;I’ve learned a lot about the learning process itself over the years and one of the most important things I’ve come across is the difference between talking versus teaching. There’s a big difference between the two so I thought I’d write about techniques that I’ve learned and how they can be used to help people learn more effectively. A good speaker doesn’t necessarily equate to a good teacher. I’ve known a lot of great speakers over the years who were funny, knowledgeable, and well versed in the technology they were speaking about. Some of these speakers are simply “edutainers” who joke their way through a given talk while others are focused (and pride themselves) on ensuring that the people attending the talk/course leave with a solid understanding of the concepts. It’s definitely an art and something that takes practice, a willingness to truly listen to feedback and a commitment to continually improve. Here are a few of the things I’ve learned about talking versus teaching over the years based on direct feedback, 1000s of evaluations and personal study.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Set the Stage&lt;/h2&gt;  &lt;p&gt;There’s no better way to get in the way of the learning process than to jump into a concept without setting the stage for what will be covered, why it’s important, what it can be used for and how all of the pieces tie together. If you’ve ever sat through a presentation or class and felt frustrated because you couldn’t tie all of the concepts together then you know the importance of setting the stage. Here are a few things I like to do:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Start a talk or course off with a quick discussion of what general concepts you’ll cover. I can’t tell you how many times I’ve seen someone jump into a talk without taking a few minutes to set the context/stage around what they’ll be covering and why people should care to learn it. It’s important to give people an initial context or starting point.&lt;/li&gt;    &lt;li&gt;Set people at ease, ensure them that it’s easy to learn the topic you’re covering (and that you’ll help them with that process) and express with confidence that by the time you’re done that they’ll have the necessary tools to get started with whatever it is they’re learning. I don’t normally do this for a 1 hour talk, but do like to do it where appropriate when teaching courses.&lt;/li&gt;    &lt;li&gt;If a topic is advanced and you know from experience that it’s difficult to grasp right away, let them know that although the content might be involved in spots that it’s not nearly as difficult as it may seem at first glance. In those situations I’ll make comments like, “If I can learn to master these concepts then you definitely can!” Those types of comments set people at ease (a very important part of the learning process) and bolster their confidence.     &lt;br /&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Provide a Map&lt;/h2&gt;  &lt;p&gt;I like to let students know where they are and where they’re going throughout a talk or course. I normally do this with a table of contents slide added throughout the deck that highlights the topic being covered. Doing this adds structure to the content (a type of map) so that people stay more on track and remember where they are and what they can look forward to. Here’s an example:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/dwahlin/image_54B84CFA.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://weblogs.asp.net/blogs/dwahlin/image_thumb_722D2EB7.png" width="597" height="449" /&gt;&lt;/a&gt;      &lt;br /&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;h2&gt;Use Visualizations Whenever Possible   &lt;br /&gt;&lt;/h2&gt;  &lt;p&gt;They say a picture is worth a 1000 words and when it comes to effective learning I think this is one of the most important concepts out there. Many people learn better visually (myself included) so showing graphics and images to illustrate the main components or players for a topic being covered works well. It’s nice to discuss how things fit together but I’ve found that most people need to see concepts visually especially if several pieces are involved. As an example, we offer a new end-to-end course covering several technologies and one chapter demonstrates how MVC4 and IoC containers can be used together. There are several players involved so I put together a slide similar to the following to quickly highlight the section being discussed and show students where it fits into the overall picture. I’ll have several of these visualizations in the presentation so that people are constantly reminded about how things fit together.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/dwahlin/image_349FD0EE.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://weblogs.asp.net/blogs/dwahlin/image_thumb_6FF336AC.png" width="618" height="462" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Don’t Make Assumptions&lt;/h2&gt;  &lt;p&gt;It’s easy to assume that people already know a lot about a technology being presented. However, as a general rule I’ve found it’s nearly always a bad idea to make assumptions about knowledge levels. If I’m not sure about the general level of an audience I’ll set the stage and context for the presentation and then ask a few questions such as “How many have built a production level application using technology X?” If the majority of people raise their hands then I’ll throw in extra tips for them while still catering the presentation to the intended audience. I’ve found that people tend to overstate what they actually know when they’re in a group which is important to take into consideration.If you’ve put in the necessary effort required to teach a technology or concept then you have the ability to adjust the level of the presentation up or down depending on the audience level to maximize learning. Don’t go in with the assumption that you will be able to stick to the original “planned” presentation because in many cases things change.&lt;/p&gt;  &lt;p&gt;When it comes to knowledge assumptions, injecting comments such as “You probably already know this” can really frustrate people who may not know what you’re talking about but are too embarrassed to ask a question about it. As soon as people get frustrated they stop listening as intently and the learning process is significantly reduced. Bottom line – don’t make any assumptions about what people know or don’t know and be willing and prepared to adjust the presentation to accommodate the people in attendance.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Break It Down Small&lt;/h2&gt;  &lt;p&gt;   &lt;br /&gt;I see a lot of developers getting away from coding live as they talk. That isn’t a problem in and of itself since most people don’t like to watch someone typing a bunch of text or code. However, I’ve found that walking people through an existing application code base or cutting and pasting large chunks of code isn’t as effective as it could be. People need small, digestible chunks fed to them especially if they’re new to a technology or concept. &lt;/p&gt;  &lt;p&gt;Typing (or pasting) small chunks of code while discussing them is extremely effective in my experience because people can focus on something small and not be distracted by everything else around it. Opening a file with a lot of code in it and then focusing on a small chunk can be effective if the stage has been set properly. However, it can also be intimidating to people new to the given technology. I prefer to show an overview before jumping into a demo and then show small chunks of code that relate directly to the overview that was presented. I don’t like to open a demo application and simply walk through the code base because some people seem to get frustrated (which as mentioned earlier significantly hinders the learning process) as you jump between files especially if they didn’t completely understand the last code or concept you showed. If I do open a file with a fair amount of code in it I’ll take the time to first explain the overall purpose of it and what we’ll cover. I’ll then zoom in directly to the code being discussed effectively eliminating the other code from view. It’s easy to overwhelm people by showing large amounts of code or content.&lt;/p&gt;  &lt;p&gt;The same can be said for text in slides. If people have to read through a massive amount of text then it’s a bad slide in my opinion and definitely doesn’t help the learning process. I prefer to have as few bullet points as possible and as many graphics as appropriate. If I find that a slide needs more content in it but that it’s already full I’ll create a continuation slide rather than cramming everything into the one slide. I’m certainly guilty of creating busy slides over the years but try hard to keep them as minimal as possible. If I’m doing classroom training and need people to have additional information then I’ll add notes and ensure that students can access them.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Involve the Audience&lt;/h2&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;There’s no better way to help the learning process than to involve the audience. A presenter who simply stands up and lectures may be a good speaker but in my opinion is a horrible teacher. Teaching is a two-way street with information flowing both ways. Involve the audience by asking questions from time to time to give people a quick break from the presentation and make them think and evaluate what they’re learning. I recently did some training for a group at Microsoft consisting of advanced developers that really knew their stuff when it came to C# and C++. I was covering technologies that were quite new to many in attendance though so I’d ask specific questions such as “What’s bad about this piece of code?” I'll pause for a bit to give them time to think and if no one responds I’ll rephrase the question. If I still don’t get any responses I’ll explain how the code could be improved. The first few times are generally low on responses but if you stick with it you’ll see that people start to get involved in the presentation and you have that two-way information sharing going.&lt;/p&gt;  &lt;p&gt;Another way to involve the audience is to do some guided demonstrations where you build code with the students. Some people will choose to watch of course but I’ve found those that participate get more involved in the presentation, get more excited about some of the topics since they’re building them on their own and seeing them in action, and learn more than those who choose to watch.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Conclusion&lt;/h2&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;I’ve found the following techniques useful while striving to become a good teacher:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Set the stage&lt;/li&gt;    &lt;li&gt;Provide a map&lt;/li&gt;    &lt;li&gt;Use visualizations whenever possible&lt;/li&gt;    &lt;li&gt;Don’t make assumptions&lt;/li&gt;    &lt;li&gt;Break it down small&lt;/li&gt;    &lt;li&gt;Involve the audience&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;There are definitely a lot more techniques that I could list here but hope that you’re able to apply one or more of these techniques. The best speakers understand how people learn and consistently work towards becoming the best teachers.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=9902057" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dwahlin/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/Pluralsight/default.aspx">Pluralsight</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/Teaching/default.aspx">Teaching</category></item><item><title>TypeScript Fundamentals Course Released on Pluralsight.com</title><link>http://weblogs.asp.net/dwahlin/archive/2013/01/13/typescript-fundamentals-course-released-on-pluralsight-com.aspx</link><pubDate>Mon, 14 Jan 2013 05:15:18 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:9749375</guid><dc:creator>dwahlin</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://weblogs.asp.net/dwahlin/rsscomments.aspx?PostID=9749375</wfw:commentRss><comments>http://weblogs.asp.net/dwahlin/archive/2013/01/13/typescript-fundamentals-course-released-on-pluralsight-com.aspx#comments</comments><description>&lt;p&gt;&lt;img style="float: right; margin: 0px 0px 0px 10px; display: inline" align="right" src="http://weblogs.asp.net/blogs/dwahlin/image_02DF4693.png" /&gt;Over the past few months I’ve have been digging into &lt;a href="http://www.typescriptlang.org/" target="_blank"&gt;TypeScript&lt;/a&gt; and learning the ins and outs of the language. If you’re new to TypeScript, it’s a language that provides a way to write modular code that includes support for types (string, number, bool, etc.) and compiles down to JavaScript. It’s definitely interesting especially if you’d like to catch issues upfront rather than after the fact. For more information on TypeScript check out my &lt;a href="http://weblogs.asp.net/dwahlin/archive/2012/10/31/getting-started-with-typescript-classes-static-types-and-interfaces.aspx" target="_blank"&gt;Getting Started with TypeScript – Classes, Static Types and Interfaces&lt;/a&gt; post.&lt;/p&gt;  &lt;p&gt;I’m excited to announce that the &lt;a href="http://pluralsight.com/training/Courses/TableOfContents/typescript" target="_blank"&gt;TypeScript Fundamentals&lt;/a&gt; course that I co-authored with &lt;a href="http://johnpapa.net/" target="_blank"&gt;John Papa&lt;/a&gt; has now been released on Pluralsight. In the course we cover the problems TypeScript helps solve, how to work with variables, functions, and types, how classes and interfaces are defined and how modules can be used. A full course outline is listed below. I hope you enjoy the course!    &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://pluralsight.com/training/Courses/TableOfContents/typescript" target="_blank"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://weblogs.asp.net/blogs/dwahlin/image_7657F61F.png" width="663" height="111" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;TypeScript is a new open source language that provides support for building enterprise scale JavaScript applications. Although several patterns exist that can be used to structure JavaScript (see my &lt;a href="http://pluralsight.com/training/Courses/TableOfContents/structuring-javascript" target="_blank"&gt;Structuring JavaScript Code&lt;/a&gt; course for examples of patterns), TypeScript provides container functionality that object-oriented developers are familiar with such as classes and modules. It also supports strongly-typed code to ensure inappropriate values aren’t assigned to variables in an application. This course will walk you through the key concepts and features that you need to know to get started with TypeScript, and use it to build enterprise scale JavaScript applications. You’ll learn the role that TypeScript plays as well as key features that will help jump-start the learning process.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;table class="linkContainer" width="492"&gt;&lt;thead&gt;&lt;/thead&gt;&lt;tbody&gt;     &lt;tr class="module"&gt;       &lt;td class="title tocModule" style="padding-left: 0px"&gt;         &lt;div class="playButton"&gt;&lt;strong&gt;&amp;#160;&lt;span style="margin-left: 10px"&gt;Getting Started with TypeScript&lt;/span&gt;&lt;/strong&gt; &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Course Introduction&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Introduction &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Why use TypeScript? &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;TypeScript Features &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Tooling and Framework Options &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Tooling and Framework Options - TypeScript Playground &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Tooling and Framework Options - Visual Studio &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Tooling and Framework Options - Web Essentials &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Tooling and Framework Options - Sublime Text &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Tooling and Framework Options - TypeScript Compiler &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Tooling and Framework Options - NodeJS &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Hello World Example &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Hello World Example - Creating a Class &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Summary &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;&amp;nbsp;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr id="typescript-m2" class="module"&gt;       &lt;td class="title tocModule" style="padding-left: 0px"&gt;         &lt;div class="playButton"&gt;&amp;#160;&lt;span style="margin-left: 10px"&gt;&lt;strong&gt;Typing, Variables and Functions&lt;/strong&gt;&lt;/span&gt; &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Overview &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Type Annotations &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Type Inference &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Grammar &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Static and Dynamic Typing &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Compile Time or Run Time &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Ambient Declarations and Type Definition Files &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;The Any Type and Primatives &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Applying Types &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Objects &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Functions &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Arrow Functions and Debugging &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Functions and Interfaces &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Static Typing Recap &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;&amp;nbsp;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr id="typescript-m3" class="module"&gt;       &lt;td class="title tocModule" style="padding-left: 0px"&gt;         &lt;div class="playButton"&gt;&amp;#160;&lt;span style="margin-left: 10px"&gt;&lt;strong&gt;Classes and Interfaces&lt;/strong&gt;&lt;/span&gt; &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Introduction &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Defining Classes &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Demo: Defining Classes &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Demo: Property Limitations &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Casting and Type Definition Files &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Demo: Casting and Type Definition Files &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Extending Types &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Demo: Extending Types &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Using Interfaces &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Demo: Using Interfaces &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Extending an Interface &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Demo: Extending an Interface &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Summary &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;&amp;nbsp;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr id="typescript-m4" class="module"&gt;       &lt;td class="title tocModule" style="padding-left: 0px"&gt;         &lt;div class="playButton"&gt;&amp;#160;&lt;strong&gt;&lt;span style="margin-left: 10px"&gt;Modules&lt;/span&gt; &lt;/strong&gt;&lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Overview &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Identifying a Module &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Creating an Internal Module &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Internal Module Accessibility and IIFE &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Named Modules &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Extending Modules and Importing Shortcuts &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Organizing Internal Modules &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Separating Internal Modules &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;External Modules and Dependency Resolution &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Module Dependencies &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Importing External Modules using AMD &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Importing 3rd Party Libraries using AMD &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr class="tocClips"&gt;       &lt;td class="clipTitle" style="padding-left: 55px"&gt;         &lt;div&gt;Modules Recap &lt;/div&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=9749375" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dwahlin/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/TypeScript/default.aspx">TypeScript</category></item><item><title>What's Hot in the World of JavaScript and SPAs?</title><link>http://weblogs.asp.net/dwahlin/archive/2013/01/13/what-s-hot-in-the-world-of-javascript-and-spas.aspx</link><pubDate>Mon, 14 Jan 2013 00:06:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:9748358</guid><dc:creator>dwahlin</dc:creator><slash:comments>25</slash:comments><wfw:commentRss>http://weblogs.asp.net/dwahlin/rsscomments.aspx?PostID=9748358</wfw:commentRss><comments>http://weblogs.asp.net/dwahlin/archive/2013/01/13/what-s-hot-in-the-world-of-javascript-and-spas.aspx#comments</comments><description>&lt;p&gt;Client-side development continues to be more and more popular which is both good and bad for developers. It's good (great!) because we have more power than ever at our fingertips. It's bad because it can be challenging to stay up-to-speed with all of the libraries and frameworks being released (I call that job security). I hear some developers complaining about Web development and all of the script libraries being released but I personally think it provides us with a lot of choice and flexibility, not to mention enhanced productivity. I’d rather have the flexibility of choosing from a variety of scripts as opposed to only a handful.&lt;/p&gt;  &lt;p&gt;From time to time people ask me about what libraries I'm using or keeping an eye on as my company builds custom applications or provides training to companies. As a result, I thought I'd put together a post that includes a few script libraries and frameworks that I find interesting and that I think might interest you as well. Some of them have been around for quite some time while others are brand new to the scene. I plan to update the list over time as I find something else interesting or move away from a particular script for whatever reason. &lt;/p&gt;  &lt;p&gt;Keep in mind that I can’t list every library and framework out there. My goal is to list ones that I personally find quite compelling and that I (or someone I know very well) has direct experience using.    &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;h1&gt;Script Libraries    &lt;br /&gt;&lt;/h1&gt;  &lt;p&gt;There are a lot of great script libraries out there that perform a variety of functionality. Here are a few scripts that I find interesting and quite useful for building client-side applications.    &lt;br /&gt;&lt;/p&gt;  &lt;h4&gt;jQuery&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://jquery.com"&gt;http://jquery.com&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This one is rather obvious and no surprise if you've been building client-side applications over the past 5+ years. jQuery is the most widely used script library on the planet and the base for many other scripts out there. It provides support for selecting DOM elements, handling events, performing animations, making Ajax calls, working with plugins and more. If you haven't taken the time to learn jQuery then there's no time like the present. Check out &lt;a href="http://pluralsight.com/training/Courses/TableOfContents/jquery-fundamentals"&gt;my jQuery Fundamentals course on Pluralsight&lt;/a&gt; for additional details on what you can do with it in client-side applications. I've also blogged quite a bit about jQuery over the years. See &lt;a href="http://weblogs.asp.net/dwahlin/archive/tags/jQuery/default.aspx"&gt;http://weblogs.asp.net/dwahlin/archive/tags/jQuery/default.aspx&lt;/a&gt; for more details. &lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;If you’re new to jQuery and interested in learning it check out my &lt;a href="http://pluralsight.com/training/Courses/TableOfContents/jquery-fundamentals" target="_blank"&gt;jQuery Fundamentals&lt;/a&gt; course on Pluralsight.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://pluralsight.com/training/Courses/TableOfContents/jquery-fundamentals" target="_blank"&gt;&lt;img style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; padding-right: 0px" border="0" src="http://weblogs.asp.net/blogs/dwahlin/image_5F8B21BF.png" width="697" height="82" /&gt;&lt;/a&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;h3&gt;Knockout&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://knockoutjs.com"&gt;http://knockoutjs.com&lt;/a&gt;     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Knockout is arguably the most popular script library out there for handling client-side data binding. It provides a flexible way to declare bindings in HTML, write view model objects that are bound to HTML, handle dependency tracking and write templates. If you're working with a lot of data in a client-centric application then KnockoutJS is definitely worth taking a look at. It has an excellent set of online tutorials available at &lt;a href="http://learn.knockoutjs.com"&gt;http://learn.knockoutjs.com&lt;/a&gt;. Check out &lt;a href="http://pluralsight.com/training/Courses/TableOfContents/knockout-mvvm"&gt;John Papa's course&lt;/a&gt; on Pluralsight as well for a nice walk-through of the features it offers and how they can be used. My good friend John Papa has a nice &lt;a href="http://pluralsight.com/training/Courses/TableOfContents/knockout-mvvm" target="_blank"&gt;course on Knockout&lt;/a&gt;!    &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;h3&gt;RequireJS&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://requirejs.org"&gt;http://requirejs.org&lt;/a&gt;     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;As more and more script libraries are used in an application it can become difficult to manage all of the dependencies between scripts and ensure that they're loaded when they're needed. RequireJS is a module-based script loader that can handle loading scripts upfront or as they're needed. By using it you can simplify the process of managing script dependencies.    &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;h3&gt;AmplifyJS&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://amplifyjs.com"&gt;http://amplifyjs.com&lt;/a&gt;     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;AmplifyJS provides a set of jQuery components that can be used for Ajax requests, client-side communication between components (publish/subscribe), and client-side storage (desktop or mobile). It provides a unified API for accessing different data sources that can make your code more re-useable and easier to maintain. If you find yourself duplicating Ajax calls across an application then you can use AmplifyJS to define them in a more centralized component.    &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;h3&gt;Bootstrap&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://twitter.github.com/bootstrap"&gt;http://twitter.github.com/bootstrap&lt;/a&gt;     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Twitter released the Bootstrap library that provides dozens of components that speed-up client-side development and make it look good at the same time. It includes built-in components such as dropdown menus, buttons, navbars, pagination and progress bars as well as jQuery plugins that handle transitions, modal dialogs, tabs, tooltips, slideshow carousels and more. Bootstrap also includes CSS to help make the various components look good without having to write a lot of custom styles or code. I’ve used &lt;a href="http://jqueryui.com/" target="_blank"&gt;jQuery UI&lt;/a&gt; quite a bit over the years as well but also like what Bootstrap offers.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Backbone.js    &lt;br /&gt;&lt;/h5&gt;  &lt;p&gt;&lt;a href="http://backbonejs.org"&gt;http://backbonejs.org&lt;/a&gt;     &lt;br /&gt;    &lt;br /&gt;Backbone.js is a popular client-side option that can be used to build MVC-like applications that have models, collections, views and routes. It provides a way to introduce a formal structure into an application which is great for overall architecture and maintenance and supports declarative binding, templates, events, routing and more. Objects used in an application are created by extending the Model, View, Collection, or Router objects provided by Backbone.js. Check out the Todo application available at &lt;a title="https://github.com/addyosmani/todomvc/tree/gh-pages/architecture-examples/backbone" href="https://github.com/addyosmani/todomvc/tree/gh-pages/architecture-examples/backbone"&gt;https://github.com/addyosmani/todomvc/tree/gh-pages/architecture-examples/backbone&lt;/a&gt; to get started using it. While I personally consider Backbone.js to be a framework since you build upon it, it’s “officially” categorized as a library.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Breeze&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://breezejs.com"&gt;http://breezejs.com&lt;/a&gt;     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Are you working with a lot of data in your application and performing a variety of CRUD (create, read, update, delete) operations? If you are, you’ll definitely want to check out Breeze since it provides much needed client-side data management capabilities. It can handle data caching, change tracking, entity data validation, entity query support and batch saves of data back to the server. Breeze integrates well with many popular script libraries and can also play nicely with different back-end frameworks as well. To get started with Breeze check out the interactive tutorials at &lt;a href="http://learn.breezejs.com"&gt;http://learn.breezejs.com&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h1&gt;Script Frameworks    &lt;br /&gt;&lt;/h1&gt;  &lt;p&gt;My close friends will tell you that I haven't been a huge fan of Single Page Applications (SPAs) – at least not &amp;quot;true&amp;quot; SPAs as they’re defined today since they involve a lot of scripts, dependencies and complexities that I find to be overkill in some cases. You won't find a single post on my blog dedicated to SPAs because I just haven't been a big believer in them up to this point. &lt;/p&gt;  &lt;p&gt;Why haven't I jumped on the SPA bandwagon? I've done a lot of production support over my career working with both large and small teams and am worried about what happens down the road as a lot of interrelated scripts in an application change versions, people come and go on dev teams without sharing the &amp;quot;tribal knowledge&amp;quot; they have, different developer skill levels are involved with a SPA application, etc. If you only have a few scripts in an application then it’s not a big deal to manage but once you approach 10+ scripts things get more interesting over time as those scripts evolve. Hopefully they’ll always play together nicely but past experience leads me to believe otherwise. You can certainly build a solid SPA application with some of the script libraries I mentioned (and others not mentioned) but you'll definitely have to spend quite a bit of time learning the ins-and-outs of the different libraries (that’s not a bad thing of course). You'll also want to factor in maintenance costs if you're building them with a team – something that a lot of people just don't seem to think about (one direct reason I've spent quite a bit of time working with &lt;a href="http://www.typescriptlang.org/"&gt;TypeScript&lt;/a&gt; over the past few months by the way).&lt;/p&gt;  &lt;p&gt;So what's my take on SPAs now days? The good news is that SPA frameworks are emerging to help manage the complexity and dependencies (history, navigation, data management, data binding, storage, templates, etc.) which I'm really excited about. If you've been holding off on building SPAs at your company due to some of the reasons I mentioned above then here are a few frameworks that might change your mind. I've started to blog about some of these frameworks and why I think they're a much better approach compared to creating a SPA from scratch using a mish-mash of scripts and will have more posts in the near future.    &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;&lt;b&gt;AngularJS      &lt;br /&gt;      &lt;br /&gt;&lt;/b&gt;&lt;/h5&gt;  &lt;p&gt;&lt;a href="http://angularjs.org"&gt;http://angularjs.org&lt;/a&gt;     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Although not explicitly stated on its homepage, AngularJS is a robust Single Page Application (SPA) framework with an enormous amount of functionality built-in. It stands on its own and doesn't require any other scripts while providing features such as two-way data binding, MVC-like architecture, form validation, routing, history, Ajax functionality and much more. I've blogged about AngularJS in the past and recommend you check out their tutorials as well located at &lt;a href="http://docs.angularjs.org/tutorial"&gt;http://docs.angularjs.org/tutorial&lt;/a&gt;. If you’re worried about managing multiple scripts over time in an application then the AngularJS framework provides a nice alternative.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://weblogs.asp.net/dwahlin/archive/2012/07/29/javascript-data-binding-with-angularjs-getting-started.aspx"&gt;JavaScript Data Binding with AngularJS Part I – Getting Started&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://weblogs.asp.net/dwahlin/archive/2012/08/05/javascript-data-binding-with-angularjs-part-ii-binding-a-view-to-a-controller-viewmodel.aspx"&gt;JavaScript Data Binding with AngularJS Part II – Binding a View to a Controller/ViewModel&lt;/a&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;h5&gt;&lt;b&gt;Durandal      &lt;br /&gt;      &lt;br /&gt;&lt;/b&gt;&lt;/h5&gt;  &lt;p&gt;&lt;a href="http://durandaljs.com"&gt;http://durandaljs.com&lt;/a&gt;     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Durandal is a brand new framework by Rob Eisenberg (creator of frameworks such as &lt;a href="http://caliburnmicro.codeplex.com/"&gt;Caliburn Micro&lt;/a&gt;) but I wanted to include it here since I'm excited about what I've seen so far. It's another option for building SPAs (I personally think a better name would be Rich Web Applications or RWAs but that's just me) and provides a lot of functionality such as a clean architecture, modularity, messaging between components in a page, navigation and history to name a few. It's built on top of the jQuery, Knockout and RequireJS script libraries so they’re still used behind the scenes and as you build your views and view models. However, I really like how it abstracts many of the complexities of SPAs away and seems to offer a more maintainable and modular solution compared to building SPAs by hand. Documentation for Durandal can be found at &lt;a href="https://github.com/EisenbergEffect/Durandal/wiki"&gt;https://github.com/EisenbergEffect/Durandal/wiki&lt;/a&gt; and I'll be blogging about it more over the next few months (I’m considering doing a new &lt;a href="http://pluralsight.com/training" target="_blank"&gt;Pluralsight&lt;/a&gt; course on it as well). I'll also be speaking about Durandal at the upcoming &lt;a href="http://devintersection.com/"&gt;DevIntersection conference&lt;/a&gt; in Las Vegas in April. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;&lt;b&gt;Sammy.js      &lt;br /&gt;      &lt;br /&gt;&lt;/b&gt;&lt;/h5&gt;  &lt;p&gt;&lt;a href="http://www.sammyjs.org"&gt;http://www.sammyjs.org&lt;/a&gt;     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Sammy.js is one of the smallest frameworks out there (currently around 5.2k compressed/gzipped) but is designed to be modular so that it can be extended using plugins and adapters. It’s built on top of jQuery and provides a way to organize code into routes that are linked to callback functions (very handy in SPA applications) and you can use built-in events or define your own. A great way to get started with Sammy.js is to check out their tutorial at &lt;a title="http://sammyjs.org/docs/tutorials/json_store_1" href="http://sammyjs.org/docs/tutorials/json_store_1"&gt;http://sammyjs.org/docs/tutorials/json_store_1&lt;/a&gt;. A list of some of the plugins available for the framework can be found in the Github repository located at &lt;a title="https://github.com/quirkey/sammy/tree/master/lib/plugins" href="https://github.com/quirkey/sammy/tree/master/lib/plugins"&gt;https://github.com/quirkey/sammy/tree/master/lib/plugins&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;&lt;b&gt;Node.js      &lt;br /&gt;      &lt;br /&gt;&lt;/b&gt;&lt;/h5&gt;  &lt;p&gt;&lt;a href="http://nodejs.org"&gt;http://nodejs.org&lt;/a&gt;     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Node.js is different than the other frameworks mentioned since it can be used in a variety of ways. It's primarily a server-side JavaScript framework (although it can be used in other ways as well) that can be used to build fast and scalable Web applications, serve up data through RESTful services and more. What's unique about Node.js compared to other server-side frameworks is that all of the code is written in JavaScript providing an end to end story for application development - JavaScript on the client and JavaScript on the server. It's also supported by a large community that consistently adds new modules that can be accessed using the built-in Node Package Manager (NPM). Node.js is capable of performing functionality seen in other server-side frameworks such as ASP.NET, PHP and Ruby on Rails. A lot of companies are using Node.js more and more now (I just did some custom training on the framework for a big bank in the United States with a large team using Node.js).    &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;h4&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/h4&gt;  &lt;p&gt;So is that all of the libraries and frameworks that you should take a look at? Not even close – there are many other worthy scripts out there that can be used and that are quite popular. I've tried to cover a few of the key scripts that I like (or find interesting) and hope that will spark your interest in taking a closer look at some of them. There are certainly others I’m interested in as well. I think it’s safe to say that we’re on the cusp of a new movement where more and more frameworks like AngularJS and Durandal will be released to simplify the process of creating robust client-side SPA applications. &lt;/p&gt;  &lt;p&gt;Do you have other scripts you use a lot? Leave a comment about them below to give myself and anyone else reading the post some details about what you like about them.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=9748358" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dwahlin/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/HTML5/default.aspx">HTML5</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/TypeScript/default.aspx">TypeScript</category><category domain="http://weblogs.asp.net/dwahlin/archive/tags/SPA/default.aspx">SPA</category></item></channel></rss>
