This code was written at the time that the Entity Framework was in version 5, so possibly the handling logic of the phone collection may have changed. Please notify me for comments if any error condition is found for me to correct.
Use the package BeginCollectionItem
, available in NuGet:
link
The following tutorial documents how to implement master-detail:
link
It would look like this:
_CreateOrEdit.cshtml (Client)
@model SeuProjeto.Models.Cliente
@* Demais campos do seu model *@
@if (Model != null && Model.Telefones != null)
{
foreach (var telefone in Model.Telefones)
{
Html.RenderPartial("_TelefonesEditor", telefone);
}
}
@* Botões de submit, fechamento de <fieldset>, etc. *@
_TelefonesEditor.cshtml
@model SeuProjeto.Models.Telefone
@using (Html.BeginCollectionItem("Telefones"))
{
@Html.HiddenFor(model => model.TelefoneID)
@Html.HiddenFor(model => model.ClienteID)
@Html.EditorFor(model => model.Telefone)
}
CustomersController.cs
namespace SeuProjeto.Controllers
{
public class ClientesController : Controller
{
[HttpPost]
public ActionResult Create(Cliente cliente)
{
if (ModelState.IsValid)
{
if (shop.Telefones != null)
{
foreach (var telefone in cliente.Telefones)
{
telefone.ClienteID = cliente.ClienteID;
context.Entry(telefone).State = System.Data.Entity.EntityState.Modified;
context.SaveChanges();
}
}
}
// Lógica adicional, caso Model não seja válido
}
[HttpPost]
public ActionResult Edit(Cliente cliente)
{
if (ModelState.IsValid)
{
// Telefones Originais
List<Telefones> telefonesOriginais = context.Telefones.AsNoTracking().Where(t => t.ClienteID == cliente.ClienteID).ToList();
if (cliente.Telefones != null)
{
// Telefones Excluídos
foreach (var telefone in telefonesOriginais)
{
if (!cliente.Telefones.Where(t => t.TelefoneID == telefone.telefoneID).Any())
{
var telefoneExcluido = context.Telefones.Single(t => t.TelefoneID == telefone.TelefoneID);
context.Telefones.Remove(telefoneExcluido);
context.SaveChanges();
}
}
// Telefones Novos ou Editados
foreach (var telefone in cliente.Telefones)
{
if (telefone.ClienteID == 0)
{
telefone.ClienteID = cliente.ClienteID;
context.Telefones.Add(telefone);
}
else
{
context.Entry(telefone).State = System.Data.Entity.EntityState.Modified;
}
context.SaveChanges();
}
}
context.Entry(cliente).State = System.Data.Entity.EntityState.Modified;
context.SaveChanges();
}
// Lógica adicional, caso Model não seja válido
}
}
}