Edición y guardado de objetos complejos

Di que tienes el siguiente objeto:

public class Address
{
  public String Line1 { get; set; }
  public String Line2 { get; set; }
  public String City { get; set; }
  public String State { get; set; }
  public String ZipCode { get; set; }

  public Address()
  {
  }
}

public class Contact
{
  public String FirstName { get; set; }
  public String LastName { get; set; }
  public String Telephone { get; set; }

  public Address BillingAddress { get; set; }
  public List<Address> ShippingAddresses { get; set; }

  public Contact()
  {
    // Assume anything that _could_ be null wouldn't be. I'm excluding
    // most "typical" error checking just to keep the examples simple
    this.BillingAddress = new Address();
    this.ShippingAddresses = new List<Address>();
  }
}

Suponga que las propiedades están decoradas con[Required], [Display] y otros atributos.

Entonces mi controlador (simplificado en aras de la demostración):

public ActionResult Edit(String id)
{
  Contact contact = ContactManager.FindByID(id);
  return View(model: contact);
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Contact contact)
{
  if (ModelState.IsValid) //always fails
  {
    ContactManager.Save(contact);
    return RedirectToAction("Saved");
  }
  return View(model,: contact);
}

Sigo viendo demostraciones sobre la edición de un objeto como este en MVC, pero constantemente están dividiendo las colecciones de un objeto en su propia forma (por ejemplo, edite el contacto, luego edite una dirección específica de un contacto). Yo, por otro lado, estoy tratando de editar toda esta información dentro de la misma página y no estoy teniendo éxito. Por ejemplo

@model Contact

// simplified for brevity
@using (Html.BeginForm())
{
  @Html.LabelFor(x => x.FirstName): @Html.EditorFor(x => x.FirstName)
  @Html.LabelFor(x => x.LastName): @Html.EditorFor(x => x.LastName)
  @Html.LabelFor(x => x.Telephone): @Html.EditorFor(x => x.Telephone)

  <div>
    @Html.LabelFor(x => x.BillingAddress.Line1): @Html.EditorFor(x => x.BillingAddress.Line1)
    @Html.LabelFor(x => x.BillingAddress.Line2): @Html.EditorFor(x => x.BillingAddress.Line2)
    @Html.LabelFor(x => x.BillingAddress.City): @Html.EditorFor(x => x.BillingAddress.City)
    @Html.LabelFor(x => x.BillingAddress.State): @Html.EditorFor(x => x.BillingAddress.State)
    @Html.LabelFor(x => x.BillingAddress.ZipCode): @Html.EditorFor(x => x.BillingAddress.ZipCode)
  </div>

  <div>
  @foreach (Address addr in Model.ShippingAddresses)
  {
    <div>
      @Html.LabelFor(x => addr.Line1): @Html.EditorFor(x => addr.Line1)
      @Html.LabelFor(x => addr.Line2): @Html.EditorFor(x => addr.Line2)
      @Html.LabelFor(x => addr.City): @Html.EditorFor(x => addr.City)
      @Html.LabelFor(x => addr.State): @Html.EditorFor(x => addr.State)
      @Html.LabelFor(x => addr.ZipCode): @Html.EditorFor(x => addr.ZipCode)
    </div>
  }
  </div>
}

l problema con el que sigo corriendo es que elModelState.IsValid nunca pasa cuando voy a guardar la información de nuevo. ¿Hay algún truco para hacer esto, o está fuera del ámbito de MVC? Me gustaría tomar un objeto comoContact y volcar toda la información en una página para editar, y hacer que se vuelva a guardar con éxito, pero parece que no puedo hacer que funcione. (Mi próximo paso es vincular a ajax para que pueda agregar / eliminar dinámicamente "ShipingAddresses" en esa página, pero primero necesito guardar para trabajar - K.I.S.S)

Problemas

ModelState.IsValid casi siempre es falsoos elementos de @Form para los elementos de la colección suelen tener los mismos nombres, por lo que en esta demostración cadaLine1 en elShippingAddresses la colección volca a la página comoname="addr_Line1" en lugar de algo comoShippingAddresses[0]_Line1 como esperaba.

Respuestas a la pregunta(2)

Su respuesta a la pregunta