2012-03-05 13 views
9

Sto utilizzando l'approccio BeginCollectionItem di Steve Sanderson per aggiungere contenuto dinamico. Tutto funziona bene quando lo faccio al primo livello. Tuttavia, quando si tenta di implementare una raccolta nidificata che indica un BeginCollectionItem in un altro BeginCollectionItem, non sembra funzionare.Nested BeginCollectionItem

I miei modelli sono i seguenti:

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; } 

     ... 
} 

Ora quello che ho è un ordine che potrebbe avere diversi metodi di pagamento, e se uno dei metodi di pagamento è un TT (trasferimento telex) potrebbe avere diversi trasferimenti coinvolti. Implementare diversi metodi di pagamento in un Ordine come una raccolta funziona, ma quando provo a implementare diversi trasferimenti all'interno di un TT, nulla di questi trasferimenti viene passato al controller.

Ecco cosa mio punto di vista appare come:

@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> 

} 

Nella _NewPayment parziale:

@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 infine nella _NewTransfer parziale:

@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> 

Quindi tutto funziona, tranne che in il controller che i trasferimenti di List che sono nella proprietà TT dei PaymentMethods è sempre nullo. Non viene trasmesso correttamente al controller. C'è qualcosa che mi manca?

L'oggetto nidificato BeginCollectionItem non funziona? c'è un ulteriore passo che devo fare? Per favore, fai un po 'di luce. Grazie


ho capito con il metodo Joe Stevens' mostrato al seguente link:

http://www.joe-stevens.com/2011/06/06/editing-and-binding-nested-lists-with-asp-net-mvc-2/

Acclamazioni

+1

Puoi presso prega di inviare la vostra soluzione? –

risposta

15

Per ottenere il prefisso con una Html.BeginCollectionItem, è possibile accedere ViewData.TemplateInfo.HtmlFieldPrefix (Sto usando il pacchetto nuget). Sei sulla strada giusta con tt.transfers, ma hai invece bisogno del prefisso specifico.

Invece di limitarsi a

Html.BeginCollectionItem("tt.transfers") 

è necessario il prefisso del PAYMENT_METHOD corrente pure.

@{ 
    var paymentMethodPrefix = ViewData.TemplateInfo.HtmlFieldPrefix; 
} 
@using (Html.BeginCollectionItem(paymentMethodPrefix + ".tt.transfers")) 

e un rapido test sembra che si può anche solo:

@using (Html.BeginCollectionItem(ViewData.TemplateInfo.HtmlFieldPrefix + ".tt.transfers"))