October 2008 Blog Posts
In my last post, I joked that the reason that someone gave me all 1s in my talk was a misunderstanding of the evaluation form. In truth, I just assumed that someone out there really didn’t like what I was showing and that’s totally fine. It was something I found funny and I didn’t really care too much.
But I received a message from someone that they tried to evaluate the session from the conference hall, but the evaluation form was really screwy on their iPhone. For example, here’s how it’s supposed to look in IE.

I checked it out with Google Chrome which uses WebKit, the same rendering engine that Safari, and thus the iPhone, uses.
Here it is (click to see full size).
Notice anything different? :)
The good news here is that nothing really at stake here for me, as speaking is a perk of my job, not a requirement. It doesn’t affect my reviews. I’d bet this form has been in use for years and was built long before the iPhone.
However, if we ever start deciding elections online, this highlights one of the subtle design issues the designers of such a ballot would need to address.
It’s not just an issue of testing for the current crop of browsers, it’s also about anticipating what future browsers might do.
Such a form would really need to have simple semantic standards based markup and be rendered in such a way that if CSS were disabled, submitting the form would still reflect the voter’s intention.
For example, it may be hard to anticipate every possible browser rendering of a form. In this case, one fix would be to change the label for the radio buttons to reflect the intention. Thus rather than the number “1” the radio button label would be “1 – Very Dissatisfied”. Sure, it repeats the column information, but no matter where the radio buttons are displayed, it reflects the voter’s intention.
In any case, I think the funny part of this whole thing is when I mentioned this one evaluation score, several people I know all laid claim to being the one who hated my talk. They all want to take credit for hating on my talk, without going through all the trouble of actually submitting bad scores. ;)
If you were at the conference and saw my talk, be sure to evaluate it. And do be kind. :)
UPDATE: Be sure to read John Lam’s account of the PDC as well. He has some great suggestions for conference organizers to improve the evaluation process.
Before giving a presentation, I review Scott Hanselman’s top 11 presentation tips. Well I have a twelfth tip that Scott needs to add to his list, and he’ll vouch for this.
A couple of hours before Jeff and I gave the ASP.NET MVC presentation (the video is now posted!), we played some RockBand in the Big Room (exhibition area).
Playing Eye of the Tiger before a big talk has a great way of both pumping you up and loosening you up at the same time. When I ran into Scott and told him this tip, he said he did the very same thing, playing Eye of the Tiger on RockBand before his talk. In his case, I think he played for two hours.
In any case, I felt like my talk went well. Jeff was entertaining as always and provided that taste of real-world relevance to what we’re doing with ASP.NET MVC. I particularly liked it when he remoted into his live server and showed the audience how his 8 CPU server was doing via task manager.
In any case, if you watched my talk, be sure to submit evals (higher number means better. Whomever gave me all 1s, that’s just mean! ;). I look forward to hearing your feedback. I’d love to be able to show people that there’s a demand for this type of framework and development model (transparency, source releases, etc…) and maybe we can get more than one MVC talk next time. I think it’s time I do a really advanced one. :)
Download the sample project to play with the code as you read this blog post.
Using the DefaultModelBinder in ASP.NET MVC, you can bind submitted form values to arguments of an action method. But what if that argument is a collection? Can you bind a posted form to an ICollection<T>?
Sure thing! It’s really easy if you’re posting a bunch of primitive types. For example, suppose you have the following action method.
public ActionResult UpdateInts(ICollection<int> ints) {
return View(ints);
}
You can bind to that by simply submitting a bunch of form fields each having the same name. For example, here’s an example of a form that would bind to this, assuming you keep each value a proper integer.
<form method="post" action="/Home/UpdateInts">
<input type="text" name="ints" value="1" />
<input type="text" name="ints" value="4" />
<input type="text" name="ints" value="2" />
<input type="text" name="ints" value="8" />
<input type="submit" />
</form>
If you were to take fiddler and look at what data actually gets posted when clicking the submit button, you’d see the following.
ints=1&ints=4&ints=2&ints=8
The default model binder sees all these name/value pairs with the same name and converts that to a collection with the key ints, which is then matched up with the ints parameter to your action method. Pretty simple!
Where it gets trickier is when you want to post a list of complex types. Suppose you have the following class and action method.
public class Book {
public string Title { get; set; }
public string Author { get; set; }
public DateTime DatePublished { get; set; }
}
//Action method on HomeController
public ActionResult UpdateProducts(ICollection<Book> books) {
return View(books);
}
You might think we could simply post the following to that action method:
Title=title+one&Author=author+one&DateTime=1/23/1975
&Title=author+two&Author=author+two&DateTime=6/6/2007…
Notice how we simply repeat each property of the book in the form post data? Unfortunately, that wouldn’t be a very robust approach. One reason is that we can’t distinguish from the fact that there may well be another Title input unrelated to our list of books which could throw off our binding.
Another reason is that the checkbox input does not submit a value if it isn’t checked. Most input fields, when left blank, will submit the field name with a blank value. With a checkbox, neither the name nor value is submitted if it’s unchecked! This again can throw off the ability of the model binder to match up submitted form values to the correct object in the list.
To bind complex objects, we need to provide an index for each item, rather than relying on the order of items. This ensures we can unambiguously match up the submitted properties with the correct object.
Here’s an example of a form that submits three books.
<form method="post" action="/Home/Create">
<input type="text" name="[0].Title" value="Curious George" />
<input type="text" name="[0].Author" value="H.A. Rey" />
<input type="text" name="[0].DatePublished" value="2/23/1973" />
<input type="text" name="[1].Title" value="Code Complete" />
<input type="text" name="[1].Author" value="Steve McConnell" />
<input type="text" name="[1].DatePublished" value="6/9/2004" />
<input type="text" name="[2].Title" value="The Two Towers" />
<input type="text" name="[2].Author" value="JRR Tolkien" />
<input type="text" name="[2].DatePublished" value="6/1/2005" />
<input type="submit" />
</form>
Note that the index must be an unbroken sequence of integers starting at 0 and increasing by 1 for each element.
The new expression based helpers in ASP.NET MVC 2 will produce the correct format within a for loop. Here’s an example of a view that outputs this format:
<%@ Page Inherits="ViewPage<IList<Book>>" %>
<% for (int i = 0; i < 3; i++) { %>
<%: Html.TextBoxFor(m => m[i].Title) %>
<%: Html.TextBoxFor(m => m[i].Author) %>
<%: Html.TextBoxFor(m => m[i].DatePublished) %>
<% } %>
It also works with our templated helpers. For example, we can take the part inside the for loop and put it in a Books.ascx editor template.
<%@ Control Inherits="ViewUserControl<Book>" %>
<%: Html.TextBoxFor(m => m.Title) %>
<%: Html.TextBoxFor(m => m.Author) %>
<%: Html.TextBoxFor(m => m.DatePublished) %>
Just add a folder named EditorTemplates within the Views/Shared folder and add Books.ascx to this folder.
Now change the original view to look like:
<%@ Page Inherits="ViewPage<IList<Book>>" %>
<% for (int i = 0; i < 3; i++) { %>
<%: Html.EditorFor(m => m[i]) %>
<% } %>
Non-Sequential Indices
Well that’s all great and all, but what happens when you can’t guarantee that the submitted values will maintain a sequential index? For example, suppose you want to allow deleting rows before submitting a list of books via JavaScript.
The good news is that by introducing an extra hidden input, you can allow for arbitrary indices. In the example below, we provide a hidden input with the .Index suffix for each item we need to bind to the list. The name of each of these hidden inputs are the same, so as described earlier, this will give the model binder a nice collection of indices to look for when binding to the list.
<form method="post" action="/Home/Create">
<input type="hidden" name="products.Index" value="cold" />
<input type="text" name="products[cold].Name" value="Beer" />
<input type="text" name="products[cold].Price" value="7.32" />
<input type="hidden" name="products.Index" value="123" />
<input type="text" name="products[123].Name" value="Chips" />
<input type="text" name="products[123].Price" value="2.23" />
<input type="hidden" name="products.Index" value="caliente" />
<input type="text" name="products[caliente].Name" value="Salsa" />
<input type="text" name="products[caliente].Price" value="1.23" />
<input type="submit" />
</form>
Unfortunately, we don’t have a helper for generating these hidden inputs. However, I’ve hacked together an extension method which can render this out for you.
When you’re creating a form to bind a list, add the following hidden input and it will add the appropriate hidden input to allow for a broken sequence of indices. Use at your own risk! I’ve only tested this in a couple of scenarios. I’ve included a sample project with multiple samples of binding to a list which includes the source code for this helper.
<%: Html.HiddenIndexerInputForModel() %>
This is something we may consider adding to a future version of ASP.NET MVC. In the meanwhile, give it a whirl and let us know how it works out for you.
I just can’t help myself. I said I wouldn’t be one of those parents, but forget it. I am one of those parents. I think my kid is adorable, so sue me. Check out Cody’s halloween costume. He’s with his BFF Forever, Alex the Panda.
Meet, Codysaurus!

Coming to terrorize a neighborhood near you.
Today we finally officially released the beta of ASP.NET MVC (go download it already!).
True, the release has actually been available online since yesterday as it was announced in a Keynote at VSLive by Scott Hanselman, but that was intended to be a special treat for attendees in what ended up being the worst kept secret in .NET-dom.
As usual, to get all the details, check out the latest epic installment on ScottGu’s blog. Scott Hanselman also has a great blog post with good coverage as well.
As I warned before, we no longer bundle the Mvc Futures assembly (Microsoft.Web.Mvc.dll). However, we did just publish a release of this assembly updated for Beta on CodePlex. Source code for the Beta and Futures releases will be pushed to CodePlex shortly. Sorry about the delay but there’s so much work to be done here. :)
One very exciting element to this release is that we’ve included JQuery (as I mentioned before) and are indeed the first Microsoft product to include it. One of the first Microsoft products (AFAIK) to bundle a third-party open source component.
The following list (each a link to the GU’s blog) show's what’s new in the Beta.
What's new in ASP.NET MVC Beta?
I hope you enjoy this release and the plan from here on out is primarily to focus on stabilization. This means fixing bugs, making design change requests which we feel hit meet a high bar, and getting the product ready for RTM. However, as Scott mentioned, there are a few new features we’re planning, especially with Visual Studio tooling.
Technorati Tags:
aspnetmvc,
aspnet
Today marks my one year anniversary at Microsoft. Tradition dictates that I bring in a pound of M&Ms for each year that I’ve been an employee. I’m going to buck that trend (because I like bucking things) and bring in 1 kilo of Japanese candies. Since I just returned from a trip to Japan and it is also customary to bring gifts back from a trip, this ends up killing two birds with one stone. Software is not the only place to apply the DRY principle.
Looking back at when I first was hired and later at my first days when I drank from the firehose, working here feels a lot different now than it did then. I finally feel a lot more settled at Microsoft, though there are still many days when I feel like a new hire, or even as a bit of an outsider.
The other day in an IM chat with Scott Hanselman, he made some comment about how us Microsofties love our app_codeApp_Data directory. Hey man, his badge is just as blue as mine, but I understand the sentiment. Guys like us are referred to as “industry hires” as opposed to college hires. Many of the developers here happen to be college hires. The theory is that industry hires will bring a fresh perspective, but I think we just mostly get in everyone’s way and stir up trouble.
So what have I done in this past year?
I’ve spoken at five conferences (Tech-Ed Hong Kong, TechReady 6 and 7, DevScovery, MVP Global Summit) and two internal TAP events. I’ve attended two other conferences (Mix 08, Google IO). For the most part, I think I’ve gotten over my stage fright, which was intense in the beginning. Hopefully, I’ve also improved as a speaker, but I still cringe when I hear myself speak.
I’ve been involved in around four or five ASP.NET MVC preview releases (I’ve lost count) as well as the release of ASP.NET 3.5 SP1 (ASP.NET Routing feature) and a CodePlex release of ASP.NET Dynamic Languages support. I’m particularly excited about taking ownership of our DLR support for ASP.NET and hope that in the new year I can push that forward.
I’ve also been involved in division wide efforts to help other teams understand Test Driven Development so that our products moving forward will take TDD into consideration in the design of their products.
Amidst all this, I even found some time to get Subtext 2.0 out the door. Open source software remains a passion for me and I’m very excited about all the progressive changes that have happened here in the past year from us including JQuery in our offering to the opening up of licensing in various products such as MEF.
What’s Next For Me?
I think I’ll stay here for a while. My wife and I really like it in Bellevue and so far, I’m really enjoying the work here. In the next year, I’ll be taking on more responsibilities. I’ll be taking ownership for driving our TDD efforts, hoping to obtain a few small wins here and there. Baby steps.
I’ll also keep driving ASP.NET MVC towards RTM and put together a plan and strategy together for our Dynamic Languages effort.
I’m still trying to wrap my head around the PM role here at Microsoft. My managers never fail to remind me that while I’m doing fine at the technical and community side of things, I really need to improve the project management side of things. Understandable, I’m doing great at the fun stuff, but not so good at the part that I don’t find so fun. :)
In any case, as I did before, I want to thank many of you for helping me with my job. There have been many large design improvements to ASP.NET MVC that quite possibly wouldn’t have happened were it not for your constant feedback. It really is appreciated.
Technorati Tags:
microsoft
I’ve used the term “drinking from the fire hose” when describing my first days at Microsoft. However, I believe that a lot of our customers feel this way when approaching the plethora of options for web application development on the Microsoft stack.
This is feedback we’ve received from many sources and as Scott Hanselman pointed out, there’s a concerted effort to make things easier to find and understand here. Much of these efforts will take time to see fruition, but some of them are happening now.
The new Microsoft Web Platform Installer Beta can get you up and running developing on ASP.NET in two easy clicks.
First, you select an option from the first screen. Obviously, if you choose the Your Choice option, it’ll take more than two clicks.
I chose the ASP.NET Developer option and clicked Next.
The second screen lets you choose to accept the licensing terms. This is nice in that you don’t have to go and click through 20 different EULAs.
Once you click I Accept the installer begins.
If you want more control, you can choose Your Choice at the first screen which takes you to a screen that lets you choose all sorts of options.
This is a great tool for someone who wants to quickly get started learning and developing on ASP.NET. You’ll notice that it doesn’t include ASP.NET MVC yet. Don’t worry, it will once we have a proper beta release.
If you run into any problems with it, be sure to report it on their forums. For more information, be sure to read the announcement on Bill Staple’s blog.
In case you missed my first link to the beta for the installer, it’s here.
Technorati Tags:
aspnet,
aspnetmvc
UPDATE: Pretty much disregard this entire post, except as a reminder that it’s easy to make a mistake with DOCTYPEs and markup. As many people have told me, I had an error I didn’t notice in the original HTML. I forgot to close the SELECT tag. I’ll leave the post as-is.
Not only that, the DOCTYPE is not specified in the document, which causes IE to render in Quirks mode, not standards mode. So I guess the bug is in IE 7 rendering.
So this is a case of PEBKAC, the bug is in the HTML, not the browser.
Here’s an example of the HTML with the SELECT tag properly closed and the proper DOCTYPE. It renders correctly in FireFox 3 and IE 8.
In testing our helper methods for rendering a <select /> element which has some styling applied to it if the element has a validation error, a developer on the MVC team found an interesting bug in how browsers render a select element with a border applied to it via CSS. Check out the following HTML.
<html>
<head>
<style type="text/css">
select {
border: 1px solid #ff0000;
color: #ff0000;
}
</style>
</head>
<body>
<select >
<option>A</option>
<select>
</body>
</html>
Here’s how IE 8 renders it. Notice there’s no border. UPDATE: According to people on twitter, this is because I left out the doctype, so IE8 rendered it in old quirks mode, not standards mode.
Here’s Firefox 3. There’s a border, but there’s two drop-down arrows.
Here’s Google Chrome, which gets it right. Since Google Chrome uses the Safari Webkit rendering engine, I believe Safari gets it right as well. I didn’t test it personally, but Opera gets it right too.
Now if you add the following meta tag to the <head /> section of the HTML.
<meta http-equiv='X-UA-Compatible' content='IE=8'>
IE 8 now renders correctly.

You can see for yourself by pointing your browser to an example with the meta tag and without it.
Technorati Tags:
browser,
css,
bug,
style
I had a bit of a rough start to my first Tech-Ed Hong Kong last week. Pretty much every day while I was in Japan, I dutifully pulled out the laptop (despite my lack of internet connection) and made sure it still worked fine.
Things seemed to be looking up when I got a free business class upgrade on the way to Hong Kong from Tokyo for giving up my seat. It meant taking a longer flight, but I had a really enjoyable flight. But while waiting in the airport lounge, I decided to take advantage of the free Wi-Fi there, but couldn’t get my computer screen to display anything. Hoping it was some weird hibernation issue, I put my laptop away and decided to wait till I was in HK.
Sure enough, the screen still didn’t work. Fortunately, I follow rule #1 of the Joel Test for all my presentations and keep it all in source control using a private instance of Subversion. A member of Microsoft Hong Kong kindly lent me his laptop (thank you!) and I got it into more-or-less working order, as you can see from this shot of the room just before I began my first talk on ASP.NET MVC.
Even so, working on an unfamiliar laptop is still a pain and there were a few hitches in demos where I wasn’t sure how to change various display modes quickly on the laptop.
Since my talks were all in the morning, it gave me time to travel around a bit.
I took a tram up to Victoria Peak to get an eye catching panoramic view of the city, though the day I chose to go was not as beautiful as the next two days.
On the first night, there was a little Microsoft get-together for MVPs and employees at Cenna Bar and Lounge. The entrance to the place is practically hidden via a non-descript doorway on this street. You walk in, and take the lift up to the 23rd floor and suddenly you’re in this small but hip little bar.
Seems like a lot of cool places are hidden away up high in these buildings.
I really enjoyed the opportunity to have some great conversations with various Chinese people, as many of the attendees were from mainland China. In our conversations I realized that certain stereotypes we tend to have over in the U.S. are completely not valid. In principle, I know this is usually the case, but it often takes engaging in very interesting conversations for that to really hit home.
Afterwards, a small group of us went shopping. There is no sales tax on most items in Hong Kong, so it’s a popular place for Chinese shoppers. I merely tagged along for the experience.
The next day I did some more sight-seeing around the city, taking a Star Ferry across to Kowloon and then walking around the Central and Wan-Chai districts afterwards.
On the last evening, I met up with an old friend from college from Hong Kong for a night on the town in which we mixed and mingled with the local denizens.
Notice that Microsoft’s LINQ technology is so popular that there’s a bar named after it. I believe another bar called “to SQL” was just around the corner.
As a strategy to beat jet lag, I ended up staying out all night until it was time to catch a cab to the airport, stopping at my hotel room to quickly grab my things. I’ll let you know tomorrow if it worked.
Just got back from our trip to latest Japan yesterday morning. On previous trips, I ate really great Yakitori, ate Blowfish and lived to tell about it, celebrated the new year, , learned about ritual suicide and played around with sharp swords, visited a temple in the midst of old Tokyo, and visited the hotel from Spirited Away.
This trip was mostly a relaxing affair consisting of eating good food and lying around doing as much nothing as we could muster. Unfortunately, travelling with a 15 month old child meant that the amount of actual relaxation to be had was certain to be capped.
The most exciting part of the trip was my first ever visit to Kyoto, a beautiful city full of Shinto shrines and beautiful temples. It is also the namesake of the Kyoto Protocol.
I’ve uploaded a fair amount of photos to FaceBook, but I thought I’d share a few here along with a brief commentary. These first two shots are of a stunning building covered in gold leaf. The leaf is very securely fastened to the building. Don’t ask me how I know that.
Apparently, there’s a silver temple in Kyoto as well, but the guy building it ran out of money before it was ever covered in silver.
While in Kyoto, we stayed at the Westin Miyako Kyoto. They have two types of rooms, the traditional western style you all know and love, and the Japanese style as seen in this next photo, exquisitely modeled by my son. These consist of a single large simple room. At night, they put away the table and chairs and lay down tatami mats.
Thankfully, the toilet was western style because I’m not so talented at squatting.
The landscaping and natural beauty of many of the shrines and temples were simply astounding. And it’s no accident. We saw one guy painstakingly hand picking out tiny little weeds on a huge lawn.
One of the highlights of this trip was meeting Cody’s cousin, Rio, for the first time.
As you can see in the photo, she’s already learned the fine art of giving a Wet-u Wirry (Wet Willy in English). Perhaps that’s payback for all the bear hugs Cody attempted to give her which ended becoming football tackles.
In any case, if you’re ever taking a long trip to Japan, be sure to try and fit Kyoto into your itinerary. I really love Tokyo for its Blade Runneresque hyper neon modernism, which makes a visit to Kyoto so complementary for its ancient feeling.