If you just go ahead and do something like this in your view:
@using(Html.BeginForm... // I'm doing this from memory, check the arguments
{
for( int idx = 0; idx < Model.Phones.Count; idx++ )
{
@Html.EditorFor(m => m.Model.Phones[idx].Phone)
@Html.EditorFor(m => m.Model.Phones[idx].PhoneOperator)
}
// similar for cities, other model properties, etc.
}
and declare your post method as follows
[HttpPost]
public ActionResult OnPostBack( <modeltype> arg )
{
if( ModelState.IsValid )
{
// action logic, etc.
then all should be well. MVC will define the resulting textboxes in a way that it will be able to link them back up with the model on postback. I believe what it does is declare the name attribute on the textbox to be, for example, Phones_1_Phone. You can check by looking at the generated HTML in your browser.
BTW, there are other ways of getting this to work, too. You can use keys, with a Dictionary<> rather than a List<>, and sparse arrays, too, I believe. And of course you'll want to do something more than just generate a bunch of textboxes on your page -- some labels would be nice :).
I found that a great tutorial on this and much more is Steven Sanderson's Pro ASP.NET MVC 2 Framework, from Apress. I started off knowing nothing about MVC just a couple of months ago, and now I'm quite comfortable with it (although not yet an expert).
Oops, forgot to mention something important: my example uses MVC3 and its Razor view engine. You'll need to translate it into MVC2 syntax if you're not using MVC3. But you should give MVC3 a look, I find it more intuitive than its predecessors. Not to mention less "wordy".