Since I've been tackling this for a lot of people lately, I'll take it
here too.
What is happening is that ko.utils.postJson doesn't work like an
$.ajax call. postJson creates a new DOM element that is an HTML
<form>, and gives it the action of your original form, and gives it a
single <input> field that has the value of your model serialized as
JSON.
So here is what goes on...
You create your data [OK]
You click save [OK]
New HTML Form is Created [OK]
HTML Input Element is set to JSON string [OK]
HTML Form posts to server [.... .!!!]
MVC tries to 'Encode' the JSON in the string, so it does not see it
properly. So while you THINK you are posting a model, you're actually
posting a string. The Controller just gets a FormCollection[0] == Your
JSON data Re-Encoded.
To get around this, you need a Model Binder that is smarter than the
default Json binder. You can use this one.
https://gist.github.com/1015164
It is the first part of the code. This entire gist shows the whole
process of creating a project in 
ASP.NET MVC 3.0 that uses Json Model
Binding using postJson.
You do not need to take all of these steps if you use $.ajax, since
you can set the content type, and it is a direct 'post' to the
controller action. The default 
ASP.NET MVC 3.0 Json Model Binder will
work for those. This is only applicable to postJson uses.
postJson is useful because you can use things like "return
RedirectToAction" from it, but it caused me a lot of headaches.