2012-03-05 31 views
9

私はSteve SandersonのBeginCollectionItemアプローチを使用して動的コンテンツを追加しています。私が最初のレベルでそれをやっているときは、すべてうまく動作します。しかし、別のBeginCollectionItemでBeginCollectionItemを意味するネストされたコレクションを実装しようとすると、動作していないように見えます。入れ子のBeginCollectionItem

次のように私のモデルは以下のとおりです。

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

     ... 
} 

は、今私が持っているもの、いくつかの支払方法を持っている可能性が発注され、支払方法の一つは、TT(テレックス転送)である場合には、いくつかの転送を持つことができ関与する。 1つの注文で複数の支払い方法をコレクションとして実装していますが、TT内で複数の転送を実装しようとすると、これらの転送は何もコントローラに渡されません。だから、すべてがを除いて、作品

@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部分で

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

、最終的に_NewTransfer部分的に

は、ここに私の見解は次のようになります。 PaymentMethodsのTTプロパティにあるリスト転送のコントローラは常にnullです。コントローラーに正しく渡されていません。私は行方不明のものがありますか?

入れ子のBeginCollectionItemは機能しませんか?私がする必要がある余分なステップはありますか? 光をあててください。 おかげ


が、私は次のリンクで示さジョー・スティーブンスメソッド使用してそれを考え出した:Html.BeginCollectionItemで接頭辞を取得するには

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

乾杯

+1

は、あなたは、あなたのソリューションを投稿してくださいことはできますか? –

答えて

15

を、あなたはViewData.TemplateInfo.HtmlFieldPrefixにアクセスすることができます(私はナゲットパッケージを使用しています)。 tt.transfersで正しい軌道に乗っていますが、代わりに特定のプレフィックスが必要です。

代わりにちょうど

Html.BeginCollectionItem("tt.transfers") 

のあなたにも、現在のPAYMENT_METHODの接頭辞が必要になります。

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

と簡単なテストあなたのように見えるにもちょうどすることができます:

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