2012-03-05 33 views
9

Tôi đang sử dụng phương pháp BeginCollectionItem của Steve Sanderson để thêm nội dung động. Mọi thứ hoạt động tốt khi tôi làm nó ở cấp độ đầu tiên. Tuy nhiên, khi cố gắng thực hiện một bộ sưu tập lồng nhau có nghĩa là một BeginCollectionItem trong một BeginCollectionItem khác, nó dường như không hoạt động.Nested BeginCollectionItem

Mô hình của tôi như sau:

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

     ... 
} 

Bây giờ những gì tôi có là một thứ tự mà có thể có nhiều phương thức thanh toán, và nếu một trong các phương thức thanh toán là một TT (chuyển telex) nó có thể có nhiều giao dịch chuyển có tính liên quan. Thực hiện một số phương thức thanh toán trong một Đơn hàng dưới dạng một bộ sưu tập hoạt động, nhưng khi tôi cố thực hiện một số lần chuyển trong một TT, không có chuyển khoản nào được chuyển đến bộ điều khiển.

Đây là những gì quan điểm của tôi trông giống như:

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

} 

Trong _NewPayment phần:

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

và cuối cùng trong _NewTransfer phần:

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

Vì vậy, mọi thứ hoạt động, trừ trường bộ điều khiển chuyển danh sách thuộc tài sản TT của PaymentMethods luôn là rỗng. Nó không được truyền cho bộ điều khiển đúng cách. Có cái gì tôi đang thiếu?

Có lồng nhau BeginCollectionItem không hoạt động không? có thêm một bước tôi phải làm không? Hãy làm sáng tỏ một chút. Cảm ơn


I figured it out sử dụng phương pháp Joe Stevens' hiện tại liên kết sau:

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

Cheers

+1

Bạn có thể xin vui lòng gửi tại giải pháp của bạn? –

Trả lời

15

Để có tiền tố với một Html.BeginCollectionItem, bạn có thể truy cập vào ViewData.TemplateInfo.HtmlFieldPrefix (Tôi đang sử dụng gói nuget). Bạn đang đi đúng hướng với tt.transfers, nhưng bạn cần tiền tố cụ thể thay thế.

Thay vì chỉ

Html.BeginCollectionItem("tt.transfers") 

bạn sẽ cần các tiền tố của PAYMENT_METHOD hiện tại là tốt.

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

và một thử nghiệm nhanh có vẻ như bạn cũng có thể chỉ:

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