<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>mszCool's thoughts and cents revealed : Hints and Tricks</title><link>http://blogs.msdn.com/mszcool/archive/tags/Hints+and+Tricks/default.aspx</link><description>Tags: Hints and Tricks</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>ASP.NET MVC Demo Application – Austrian Re-MIX Conference from October 1st 2009 – Updating (complex) object hierarchies using ModelBinder</title><link>http://blogs.msdn.com/mszcool/archive/2009/10/02/asp-net-mvc-demo-application-austrian-re-mix-conference-from-october-1st-2009-updating-complex-object-hierarchies-using-modelbinder.aspx</link><pubDate>Fri, 02 Oct 2009 19:17:16 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9902426</guid><dc:creator>mszCool</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/mszcool/comments/9902426.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mszcool/commentrss.aspx?PostID=9902426</wfw:commentRss><description>&lt;p&gt;Yesterday we had our Austrian version of the Re-MIX conference in the Hilton Hotel at Stadtpark in Vienna. It was a great conference combined with a superb architect forum together with Simon Guest, who unveiled his thoughts on cloud computing… but more on that in a separate post, this one is about the ASP.NET MVC session I delivered in the late afternoon in the web dev track!&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;An ASP.NET MVC Walkthrough &amp;amp; Updating object hierarchies…&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;In my session “Introducing the ASP.NET MVC Web Development Framework” inspired by &lt;a href="http://haacked.com/"&gt;Phil Haack’s&lt;/a&gt; session at the last MIX-conference I demonstrated, what development with the ASP.NET MVC framework looks like.&lt;/p&gt;  &lt;p align="center"&gt;&lt;strong&gt;&lt;font size="4"&gt;&lt;a href="http://www.mszcool.at/blog/2009/20091001-RemixDemoApp.zip"&gt;Download the sample here&lt;/a&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;strong&gt;&lt;font size="4"&gt;&lt;a href="http://www.mszcool.at/blog/2009/20091001-Remix_ASPNET_MVC_Session.pptx"&gt;Download the slides here&lt;/a&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;In the session I created a simple application for displaying, modifying and adding events with event deliveries, from scratch. The following graphic shows the entity data model we’ve been working with:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/mszcool/WindowsLiveWriter/ASP.NETMVCDemoApplicationAustrianReMIXCo_FBA7/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/mszcool/WindowsLiveWriter/ASP.NETMVCDemoApplicationAustrianReMIXCo_FBA7/image_thumb.png" width="421" height="252" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;As you can see, a single Event has multiple deliveries at different locations. While implementing the controller actions for adding new events and modifying existing events I was challenged by the question, “how the model binder updates object hierarchies”. And the point is – it doesn’t, automatically…&lt;/p&gt;  &lt;p&gt;Based on &lt;a href="http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx"&gt;Phil Haack’s tip on binding collections on his blog&lt;/a&gt; and based on &lt;a href="http://goneale.com/2009/07/27/updating-multiple-child-objects-and-or-collections-in-asp-net-mvc-views/"&gt;a posting from Graham O’Neale here&lt;/a&gt; I completed my idea in this example. Below are the steps for combining the concepts from the previously mentioned blog entries:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;1.) In my views for Editing and Adding events, add HTML and script - a table that will be dynamically expanded with new items through JavaScript for each new child-item I want to create (event delivery in my case – the parts in red are the important ones in the view):&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Consolas"&gt;&amp;lt;fieldset&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;legend&amp;gt;Fields&amp;lt;/legend&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;p&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;label for=&amp;quot;Title&amp;quot;&amp;gt;Title:&amp;lt;/label&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;%= Html.TextBox(&amp;quot;Title&amp;quot;) %&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;%= Html.ValidationMessage(&amp;quot;Title&amp;quot;, &amp;quot;*&amp;quot;) %&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/p&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;p&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;label for=&amp;quot;Description&amp;quot;&amp;gt;Description:&amp;lt;/label&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;%= Html.TextBox(&amp;quot;Description&amp;quot;) %&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;%= Html.ValidationMessage(&amp;quot;Description&amp;quot;, &amp;quot;*&amp;quot;) %&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/p&amp;gt;      &lt;br /&gt;&amp;lt;/fieldset&amp;gt; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&amp;lt;table id=&amp;quot;DeliveryTable&amp;quot;&amp;gt;           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;tr&amp;gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;th&amp;gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Delivery Begin Date            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/th&amp;gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;th&amp;gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Delivery End Date            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/th&amp;gt;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/tr&amp;gt;            &lt;br /&gt;&amp;lt;/table&amp;gt;&lt;/font&gt;&lt;/strong&gt; &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Consolas"&gt;&amp;lt;p&amp;gt;     &lt;br /&gt;&lt;/font&gt;&lt;strong&gt;&lt;font color="#ff0000" size="2" face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Add Delivery&amp;quot;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/strong&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;onclick=&amp;quot;javascript:AddDelivery()&amp;quot; /&amp;gt;&lt;/font&gt;&lt;/strong&gt; &amp;lt;br /&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Create&amp;quot; /&amp;gt;        &lt;br /&gt;&amp;lt;/p&amp;gt; &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000" size="2" face="Consolas"&gt;&lt;strong&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; language=&amp;quot;javascript&amp;quot;&amp;gt; &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000" size="2" face="Consolas"&gt;&lt;strong&gt;function AddDelivery() { &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000" size="2" face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160; // Add a row to the table       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; var DeliveryTableBody =&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; document.getElementById&lt;/font&gt;&lt;/strong&gt;&lt;font color="#ff0000" size="2" face="Consolas"&gt;&lt;strong&gt;(       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;DeliveryTable&amp;quot;).getElementsByTagName(        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;tbody&amp;quot;).item(0);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; var ItemCount =         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DeliveryTableBody.childNodes.length - 1; &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000" size="2" face="Consolas"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160; var newChild = document.createElement(&amp;quot;tr&amp;quot;);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; var col1 = document.createElement(&amp;quot;td&amp;quot;);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; col1.innerHTML =&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;lt;input type='text'&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; name='Event.Deliveries[&amp;quot;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; + ItemCount + &amp;quot;].BeginDate' /&amp;gt;&amp;quot;;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; var col2 = document.createElement(&amp;quot;td&amp;quot;);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; col2.innerHTML = &amp;quot;&amp;lt;input type='text'&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; name='Event.Deliveries[&amp;quot; + ItemCount +&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;].EndDate' /&amp;gt;&amp;quot;;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; newChild.appendChild(col1);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; newChild.appendChild(col2);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; DeliveryTableBody.appendChild(newChild);        &lt;br /&gt;} &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000" size="2" face="Consolas"&gt;&lt;strong&gt;&amp;lt;/script&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2.) In my action method for adding events in the EventController I simply was required to update the signature of the action-method with the Form-postback-collection and a separate call to update model as shown below:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Consolas"&gt;[Authorize]     &lt;br /&gt;[AcceptVerbs(HttpVerbs.Post)]      &lt;br /&gt;public ActionResult Add(      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [Bind(Exclude=&amp;quot;EventId&amp;quot;)] Event ev, &lt;/font&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;       &lt;br /&gt;&lt;font size="2" face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; FormCollection postValues&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;&lt;font size="2" face="Consolas"&gt;)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; //      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // Validate incoming stuff      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; //      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (string.IsNullOrEmpty(ev.Title))      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ModelState.AddModelError(&amp;quot;Title&amp;quot;,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font size="2" face="Consolas"&gt;&amp;quot;Title cannot be empty!&amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (string.IsNullOrEmpty(ev.Description))      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ModelState.AddModelError(&amp;quot;Description&amp;quot;,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;Please enter a description for your event!&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; //       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // Validation succeeded?       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // If yes, add the event, otherwise       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // return to the view      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; //      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (ModelState.IsValid)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DataContext.AddToEvent(ev);      &lt;br /&gt;&amp;#160;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; UpdateModel&amp;lt;IEnumerable&amp;lt;EventDelivery&amp;gt;&amp;gt;(           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ev.Deliveries, &amp;quot;Event.Deliveries&amp;quot;);            &lt;br /&gt;&lt;/font&gt;&lt;/strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DataContext.SaveChanges(); &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return RedirectToAction(&amp;quot;Index&amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return View();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3.) When modifying existing items, the whole thing gets more tricky when working with the ADO.NET Entity Framework. Why? Simply because the ASP.NET MVC default model binder, when updating collections, unfortunately clears them and re-fills them with the items posted back in the Form postback-collection. That breaks the ADO.NET Entity Framework association set (the ASP.NET MVC model binder does not know about associations). Now you have two possibilities, either modify the source code of ASP.NET MVC (if possible I would stay with the thing as it gets delivered) or apply a little trick as I did. I just created a temporary Event, filled it from scratch with the postback-parameters and then copied the values to the existing and to new items as below. Of course the whole thing needs refinement (especially when mapping to existing items in collections), but I think it’s at least a starting point!&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Consolas"&gt;[Authorize]     &lt;br /&gt;[AcceptVerbs(HttpVerbs.Post)]      &lt;br /&gt;public ActionResult Edit(int eventId,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;FormCollection postValues&lt;/font&gt;&lt;/strong&gt;)        &lt;br /&gt;{        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Event CurrentEvent =&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; (from e in DataContext.Event.Include(&amp;quot;Deliveries&amp;quot;)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; where e.EventId == eventId        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select e).FirstOrDefault(); &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160; if (CurrentEvent != null)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Event Temp = new Event();           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; UpdateModel(Temp, &amp;quot;Event&amp;quot;,&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new string[] { &amp;quot;Title&amp;quot;,             &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;Description&amp;quot; });            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; UpdateModel(Temp.Deliveries,&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;Event.Deliveries&amp;quot;,&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new string[] { &amp;quot;BeginDate&amp;quot;,             &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;EndDate&amp;quot; });            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CopyEvent(CurrentEvent, Temp);&lt;/font&gt;&lt;/strong&gt; &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DataContext.SaveChanges(); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return RedirectToAction(&amp;quot;Index&amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ModelState.AddModelError(&amp;quot;General&amp;quot;, &amp;quot;...&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return View();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;I hope that’s a helpful posting for anyone who’s facing the same challenges when working with MVC:) Nevertheless, for those who want to have full control over HTML and want to have better testing possibilities, this framework is the right choice. If you’re rather the “productivity-kind-of-developer”, sticking with web forms might be the more convenient solution...&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9902426" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mszcool/archive/tags/Presentations+-+Demos+-+Samples/default.aspx">Presentations - Demos - Samples</category><category domain="http://blogs.msdn.com/mszcool/archive/tags/Hints+and+Tricks/default.aspx">Hints and Tricks</category></item><item><title>The .NET Client Profile and a List of Included Assemblies</title><link>http://blogs.msdn.com/mszcool/archive/2009/05/28/the-net-client-profile-and-a-list-of-included-assemblies.aspx</link><pubDate>Thu, 28 May 2009 15:26:01 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9647029</guid><dc:creator>mszCool</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/mszcool/comments/9647029.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mszcool/commentrss.aspx?PostID=9647029</wfw:commentRss><description>&lt;p&gt;The .NET Client Profile is a very interesting extension made available with the release of .NET Framework 3.5. &lt;a href="http://msdn.microsoft.com/en-us/library/cc656912.aspx" target="_blank"&gt;If you’re interested into more details, follow these link to the official documentation!&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;As a subset of the full .NET Framework package containing client-side functionality, only, it should make the deployment of the .NET Framework for client-only applications in corporate networks easier (30 MB are easier to deploy, maintain and patch than the full Framework with a footprint of more than 100 MB).&lt;/p&gt;  &lt;p&gt;So far I was not really challenged with reasons for using the .NET Client Profile from customers – but now it has been the case three different times in series where the deployment of the full framework was a problem for client-only based applications.&lt;/p&gt;  &lt;p&gt;Of course one of the first questions customers are asking is: “Which assemblies are included in the client profile and are therefore available for client developers?”&lt;/p&gt;  &lt;p&gt;The answer: you can find a list of client-profile assemblies for each version, .NET 2.0, .NET 3.0 and .NET 3.5, in files called “Client.xml” in the following directories on your system:&lt;/p&gt;  &lt;p&gt;&lt;font size="3" face="Courier New"&gt;%windir%\Microsoft.NET\Framework\v2.0.50727\SubsetList\Client.xml&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="3" face="Courier New"&gt;%programfiles%\Reference Assemblies\Microsoft\Framework\v3.0\SubsetList\Client.xml&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="3" face="Courier New"&gt;%programfiles%\Reference Assemblies\Microsoft\Framework\v3.5\SubsetList\Client.xml&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Furthermore you can tell Visual Studio 2008 to check your project-references at compile-time by enabling the “Client-only Framework subset” option in the project-properties dialog. In that case Visual Studio comes up with a compiler warning for each assembly you’ve referenced that is not available in the client profile as you can see below:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/mszcool/WindowsLiveWriter/abb.NETClientProfileListofIncludedAssemb_C94C/image_4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/mszcool/WindowsLiveWriter/abb.NETClientProfileListofIncludedAssemb_C94C/image_thumb_1.png" width="445" height="312" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;To get more details on how-to deploy .NET Client Applications using the client-profile just take a closer look at this &lt;a href="http://msdn.microsoft.com/en-us/library/cc843122.aspx" target="_blank"&gt;MSDN-documentation for the .NET Client Profile&lt;/a&gt;!&lt;/p&gt;  &lt;p&gt;Hope that’s something useful…&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9647029" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mszcool/archive/tags/Hints+and+Tricks/default.aspx">Hints and Tricks</category></item></channel></rss>