2012-03-05 23 views
9

Dinamik içerik eklemek için Steve Sanderson'ın BeginCollectionItem yaklaşımını kullanıyorum. İlk aşamada yaptığım her şey iyi çalışıyor. Ancak, BeginCollectionItem başka bir BeginCollectionItem anlamında iç içe bir koleksiyonunu uygulamaya çalıştığınızda, işe yaramıyor.Yuvalanmış BaşlangıçKoleksiyonEtem

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

     ... 
} 

Şimdi ne ben sahip çeşitli ödeme yöntemleri var olabilecek bir sipariş olduğunu ve ödeme yöntemlerinden biri TT (teleks transferi) ise birkaç transferleri olabilir şöyledir:

Benim modelleri

vardır yer. Bir Siparişte birden fazla ödeme yönteminin bir toplama çalışması olarak uygulanması, ancak bir TT içinde birkaç aktarımı uygulamaya çalıştığımda, bu aktarımlardan hiçbiri denetleyiciye aktarılmaz. Yani her şey hariç, işleri

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

: _NewPayment kısmi olarak

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

} 

:

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

ve nihayet _NewTransfer kısmi içinde

İşte benim bakış gibi görünür Denetleyici, PaymentMethods'ın TT özelliğindeki Liste aktarımları her zaman boştur. Kontrolöre düzgün bir şekilde geçilmiyor. Kaybettiğim bir şey mi var?

Yuvalanmış BeginCollectionItem çalışmıyor mu? Yapmam gereken ekstra bir adım var mı? Lütfen biraz ışık tutabilirsiniz. Teşekkür


Joe Stevens' yöntemi aşağıdaki bağlantıda gösterilen kullanarak bunu anladım: Bir Html.BeginCollectionItem ile öneki almak için

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

Şerefe

+1

sen adresinden çözüm gönderin Can:

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

ve hızlı bir test ayrıca sadece olabilir gibi görünüyor? –

cevap

15

, sen ViewData.TemplateInfo.HtmlFieldPrefix erişebilirsiniz (Ben nuget paketini kullanıyorum). tt.transfers ile doğru yoldasınız, ancak bunun yerine belirli öneklere ihtiyacınız var.

yerine sadece

Html.BeginCollectionItem("tt.transfers") 

arasında siz de geçerli PAYMENT_METHOD öneki gerekir.

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