Nested BeginCollectionItem
Estou usando a abordagem BeginCollectionItem de Steve Sanderson para adicionar conteúdo dinâmico. Tudo funciona bem quando eu estou fazendo isso no primeiro nível. No entanto, ao tentar implementar uma coleção aninhada, que significa um BeginCollectionItem em outro BeginCollectionItem, ele parece não funcionar.
Meus modelos são os seguintes:
public class Order
{
[Key]
[HiddenInput]
public int id { get; set; }
[Display(Name = "Order number")]
public string number { get; set; }
...
[Display(Name = "Payment method")]
public List<PaymentMethod> payment_methods { get; set; }
...
}
public class PaymentMethod
{
public MethodOfPayment method { get; set; }
public CC cc { get; set; }
public CASH cash { get; set; }
public TT tt { get; set; }
}
public class TT
{
[Key]
public int id { get; set; }
[Required(ErrorMessage = "{0} is required.")]
[Display(Name = "Total amount")]
public double? total_value { get; set; }
...
[Display(Name = "Transfers")]
public List<Transfer> transfers { get; set; }
}
public class Transfer
{
[Key]
public int id { get; set; }
[Display(Name = "Payment")]
public int payment_id { get; set; }
[Required(ErrorMessage = "{0} is required.")]
[Display(Name = "SWIFT")]
public string swift { get; set; }
[Required(ErrorMessage = "{0} is required.")]
[Display(Name = "Amount transferred")]
public double? transfer_amount { get; set; }
[Required(ErrorMessage = "{0} is required.")]
[Display(Name = "Date transferred")]
public DateTime transfer_date { get; set; }
...
}
Agora o que tenho é um pedido que pode ter várias formas de pagamento e, se uma das formas de pagamento for um TT (transferência de telex), poderá haver várias transferências envolvidas. A implementação de várias formas de pagamento em um Pedido, como uma coleção, mas quando tento implementar várias transferências dentro de um TT, nada dessas transferências é passado para o controlado
Veja como é minha visão:
@model prj.Models.Model.Order
@using (Html.BeginForm("Create")){
@Html.ValidationSummary(true, "Creation was unsuccessful. Please correct the errors and try again.")
...
@Html.TextBoxFor(m => m.number, new { id = "txtnumber" })
...
<div id="editorPaymentRows">
@foreach (var payment in Model.payment_methods)
{
@Html.Partial("_NewPayment", payment)
}
</div>
}
No _NewPayment parcial:
@using prj.Helpers
@model prj.Models.Model.PaymentMethod
<div class="editPaymentRow">
@using (Html.BeginCollectionItem("payment_methods"))
{
...
<div class="editor-label">
@Html.LabelFor(m => m.tt.total_value)<req>*</req>
</div>
<div class="editor-field">
@Html.TextBoxFor(m => m.tt.total_value)
</div>
...
<div id="editorTransferRows">
@if (Model.tt != null)
{
foreach (var transfer in Model.tt.transfers)
{
@Html.Partial("_NewTransfer", transfer)
}
}
...
</div>
}
</div>
e finalmente na parcial _NewTransfer:
@using prj.Helpers
@model prj.Models.Model.Transfer
...
<div class="editTransferRow">
//using (Html.BeginCollectionItem("transfers"))
@using (Html.BeginCollectionItem("tt.transfers"))
{
...
<div class="editor-label">
@Html.LabelFor(m => m.swift)<req>*</req>
</div>
<div class="editor-field">
@Html.TextBoxFor(m => m.swift, new { @class = "t_swift" })
</div>
...
<div class="editor-label">
@Html.LabelFor(m => m.transfer_amount)<req>*</req>
</div>
<div class="editor-field">
@Html.TextBoxFor(m => m.transfer_amount, new { @class = "t_transfer_amount" })
</div>
...
}
</div>
Então, tudo funciona, exceto no controlador que a Lista transfere a propriedade TT dos PaymentMethods sempre é nula. Não está sendo passado para o controlador corretamente. Tem algo que estou perdendo
O BeginCollectionItem aninhado não funciona? há um passo extra que devo fazer? Por favor, mostre alguma luz. Obrigad
Eu descobri isso usando o método de Joe Stevens mostrado no seguinte link:
http: //www.joe-stevens.com/2011/06/06/editing-and-binding-nested-lists-with-asp-net-mvc-2
Felicidade