Linhas dinâmicas do MVC 5 com BeginCollectionItem
Qual é a melhor maneira de adicionar / excluir linhas em uma tabela quando um botão é clicado? Eu preciso de linhas criadas a partir de propriedades ChildClass (classe filho é uma lista na classe / modelo principal).
Atualmente, tem uma View (o modelo é MyMain) que faz referência a uma Vista Parcial usando RenderPartial.
A vista parcial exibe as propriedades do modelo, uma classe chamada MyChild, que é uma lista de objetos no MyMain.
Eu quero ter botões de adição e exclusão para adicionar dinamicamente as linhas que são mantidas na exibição parcial.
Então, adicione MyChild repetidamente para mais linhas na lista. Isso é possível? Ou não devo usar visualizações parciais para isso?
Código atualizado
Abaixo estão as classes e visualizações atuais com as quais estou trabalhando, estou tentando implementar o ajudante BeginCollectionItem, mas estou obtendo uma referência nula onde estou tentando carregar a exibição parcial, apesar da instrução if dizendo para criar uma nova instância da classe filho, se não existe - por que isso está sendo ignorado?
Vista principal
@using (Html.BeginForm())
{
<table>
<tr>
<th>MyMain First</th>
<th>MyChild First</th>
</tr>
<tr>
<td>
@Html.EditorFor(m => m.First)
</td>
<td>
@if (Model.child != null)
{
for (int i = 0; i < Model.child.Count; i++)
{
Html.RenderPartial("MyChildView");
}
}
else
{
Html.RenderPartial("MyChildView", new MvcTest.Models.MyChild());
}
</td>
</tr>
@Html.ActionLink("Add another", "Add", null, new { id = "addItem" })
</table>
}
Vista parcial
@model MvcTest.Models.MyChild
@using (Html.BeginCollectionItem("myChildren"))
{
Html.EditorFor(m => m.Second);
}
Modelos
public class MyMain
{
[Key]
public int Id { get; set; }
public string First { get; set; }
public List<MyChild> child { get; set; }
}
public class MyChild
{
[Key]
public int Id { get; set; }
public string Second { get; set; }
}
Controlador
public class MyMainsController : Controller
{
// GET: MyMains
public ActionResult MyMainView()
{
return View();
}
[HttpPost]
public ActionResult MyMainView(IEnumerable<MyChild> myChildren)
{
return View("MyMainView", myChildren);
}
public ViewResult Add()
{
return View("MyChildView", new MyChild());
}
}